C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Фреймы  (Прочитано 2365 раз)
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Фреймы
« : 26 Февраль 2015, 10:20:00 »

Помогите разобраться с фреймами.
Есть форма, в ней по левому краю выровнена и расположена панель, на панели кнопка. Я хочу на оставшемся свободном месте на всю клиентскую часть формы программно разместить фрейм.
Создаю фрейм и пишу в нем такой код:
Код
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TFrame2 *Frame2;
//---------------------------------------------------------------------------
__fastcall TFrame2::TFrame2(TComponent* Owner)
: TFrame(Owner)
{
Parent = Form1;
}

Что написать в коде кнопки на главной форме, чтобы увидеть фрейм?
Как правильно затем удалить фрейм?
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Фреймы
« Ответ #1 : 26 Февраль 2015, 10:30:57 »

Если написать так, то фрейм сразу появляется и перекрывает панель. Мне нужно чтобы фрейм появился на всю клиентскую область формы справа от панели на главной форме.
Код
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  Frame2->Enabled = true;
  Frame2->BringToFront();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Frame2 = new TFrame2(this);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
delete Frame2;
}
//---------------------------------------------------------------------------
 
 
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Фреймы
« Ответ #2 : 26 Февраль 2015, 10:31:25 »

Код
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   TFrame2 *frm = new TFrame2(this);
   frm->Align = alClient;
   // ну, или так:
   /*
   Frame2 = new TFrame2(this);
   Frame2->Align = alClient;
   */

}
, кстати, в конструкторе фрейма можно написать вот так:
Код
__fastcall TFrame2::TFrame2(TComponent* Owner)
: TFrame(Owner)
{
   Parent = (TWinControl*)Owner;
}
, чтобы не привязываться именно к этой форме. Ну, а удалять - как обычно, если использовала Frame2 для создания - то
Код
delete Frame2;
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Фреймы
« Ответ #3 : 26 Февраль 2015, 10:53:42 »

Спасибо.
А как лучше/грамотнее для программы - создавать фрейм один раз и затем переключать свойство видимости как в коде ниже, или лучше всегда создавать при каждом клике через new и затем удалять delete?
Код
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
//показть фрейм
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Frame2->Visible = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
if(Frame2)
{
delete Frame2;
        Frame2 = NULL;
}
}
//---------------------------------------------------------------------------
//создать фрейм один раз
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//Frame2->Align = alClient;
Frame2 = new TFrame2(this);
Frame2->Visible = false;
}
//---------------------------------------------------------------------------
//скрыть фрейм
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Frame2->Visible = false;
}
 
Записан
volvo877
Глобальный модератор


Сказали спасибо: +736/-1
Offline

Сообщений: 891


Re: Фреймы
« Ответ #4 : 26 Февраль 2015, 11:00:10 »

Смотря, что ты делаешь с фреймом, и насколько долго он висит неиспользуемым. Если ты его показываешь пару раз за время работы программы (длительное время работы имеется в виду), то лучше, разумеется, создать его перед этим, и потом удалить. А если часто показываешь - то можно и оставить в памяти, но скрывать.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


Re: Фреймы
« Ответ #5 : 26 Февраль 2015, 11:01:11 »

Если объектов типа TFrame2 всего один то нафига его динамически создавать? Сразу на форму положи и будет тебе "какбэ визуальный компонент".
Соответственно и вопросов не останется, будешь использовать лишь свойство Visible.
Впрочем, если он один, то и фрейм-то нафиг не нужен... накидал что надо на панели к примеру.
Записан
SilverFish
Участник


Сказали спасибо: +14/-6
Offline

Сообщений: 786


Re: Фреймы
« Ответ #6 : 26 Февраль 2015, 11:18:56 »

Цитировать
Если объектов типа TFrame2 всего один то нафига его динамически создавать?

Нет не один. Их будет 5. И пять кнопок вызова.

Цитировать
А если часто показываешь - то можно и оставить в памяти, но скрывать.

Спасибо. Буду оставлять в памяти, создав один раз.
Записан
POV
Участник


Сказали спасибо: +107/-7
Offline

Сообщений: 640


« Ответ #7 : 26 Февраль 2015, 13:43:56 »

А я предпочитаю на страницах PageControl без закладок такие вещи располагать. Всё уже создано, сидит постоянно в памяти, разложено по разным контейнерам (ТабКонтролам), выбирается через ActivPageIndex.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.097 секунд. Запросов: 21.