Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.01;
Скачать: CL | DM;

Вниз

Как правильно динамически создавать дочерние формы   Найти похожие ветки 

 
девушка   (2008-12-19 09:10) [0]

Добрый день!
Вопрос насколько правильно динамически создавать формы так:

Код родительской формы:
procedure TMainForm.Add_childForm();
var
FChild: TFChild;
begin
FSborki:=TFChild.Create(FMain);
FChild.Show;
end;


Код дочерней формы:
procedure TFChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caFree;
end;


Достаточно ли этого или тербуются еще действия по освобождению памяти?


 
Медвежонок Пятачок ©   (2008-12-19 09:20) [1]

Вопрос насколько правильно динамически создавать формы так:
создавать так правильно. все остальное неправильно.


 
Jeer ©   (2008-12-19 09:28) [2]


> var
> FChild: TFChild;


> FChild.Show;


А Это зачем ?


 
девушка   (2008-12-19 09:38) [3]


> А Это зачем ?

Т.е. создаем без промежуточной переменной, а  в метод Create добавляем вызовы Init, Show и т.д?


 
Jeer ©   (2008-12-19 09:44) [4]

FSborki это и есть переменная класса TFChild, а поскольку ( я надеюсь ) Вы не убили публичные методы Show и пр, то FSborki прекрасно знает о них.


 
девушка   (2008-12-19 10:54) [5]


> а поскольку ( я надеюсь ) Вы не убили публичные методы Show
> и пр

Не убили :) в крайнем случае мы создадим методы с именами типа ShowData


 
девушка   (2008-12-19 10:55) [6]

Просто вопрос в том - создавать ли локальную переменную FSborki  - которая, как я понимаю, будет уничтожена после отработки функции, только для того, чтобы вызвать метод Show...


 
Сергей М. ©   (2008-12-19 10:58) [7]


> девушка


Вызов Show вообще не нужен - доч.форма в VCL MDI-приложении не может быть невидимой, и создается она уже видимой.


 
Сергей М. ©   (2008-12-19 11:01) [8]


> создавать ли локальную переменную FSborki


ПРи прочих равных условиях можно не создавать - доступ к любой успешно созданной и существующей доч.форме осуществляется через св-во MDIChildren родительской MDI-формы.


 
Jeer ©   (2008-12-19 11:12) [9]

Это если речь идет о MDI приложении, а не SDI.
Я вовсе не уверен, что автор поста понимает "динамически создавать дочерние формы" именно в контексте MDI.


 
Сергей М. ©   (2008-12-19 11:18) [10]


> Я вовсе не уверен


Ну тогда у автора с терминологией беда)


 
Сергей М. ©   (2008-12-19 11:20) [11]

А если даже и SDI, то все равно форма потеряна не будет, только доступ к ней по-другому будет возможен


 
Anatoly Podgoretsky ©   (2008-12-19 11:38) [12]

Неправильно, FChild имеет произвольное значение, поэтому все, вплоть до AV - но никогда не покажет созданую форму.


 
Jeer ©   (2008-12-19 11:41) [13]


> Anatoly Podgoretsky ©   (19.12.08 11:38) [12]


Естественно, на что и намекнул в [2] :)


> то все равно форма потеряна не будет,


Это смотря как создавать и убивать.
А то наплодят одинаковых форм с одинаковой фамилией, вот и потеряют ссылки на предыдущие.


 
девушка   (2008-12-19 11:51) [14]

FChild.Show;
--- опечатка
имелось ввиду :

procedure TMainForm.Add_childForm();
var
FChild: TFChild;
begin
FChild:=TFChild.Create(FMain);
FChild.Show;
end;



> Это если речь идет о MDI приложении, а не SDI.
> Я вовсе не уверен, что автор поста понимает "динамически
> создавать дочерние формы" именно в контексте MDI.

--- в данном вопросе речь идет об MDI

По поводу SDI -
procedure Add_newForm();
var
FChild: TFChild;
begin
FChild:=TFChild.Create(Application);
FChild.Show;
end;

Я так понимаю о корректном освобождении памяти заботится Application?
И в отличии от MDI форма не будет сразу видима...


 
девушка   (2008-12-19 11:56) [15]

Т.е. я так понимаю для MDI вполне нормально
procedure TMainForm.Add_childForm();
begin
TFChild.Create(FMain);
end


а методы для инициализации вызываем в OnShow. Правда тогда не понятно, как лучше в этом случае передавать дочерней форме некие параметры...


 
Сергей М. ©   (2008-12-19 13:24) [16]


> девушка


Да.
FMain в дан.случае будет владельцем создаваемой доч.формы.
Владелец будет ответственен за автоматическое ее уничтожение.
При прочих равных условиях с тем же успехом в дан.случае можно указать и Application.


> методы для инициализации вызываем в OnShow


По хорошему инициализацию следует выполнять при создании (OnCreate), а не при визуализации (OnShow). Для MDIChild-формы это, конечно, не существенно, поскольку она возбуждает событие OnShow всего один раз (ибо скрыть и вновь показать ее нельзя) после создания и непосредственно перед тем как становится видимой.


> как лучше в этом случае передавать дочерней форме некие
> параметры


Точно так же как и для любого другого объекта - объявляется и реализуется собственный конструирующий метод с требуемыми параметрами:

TMyChildForm = class(..)
..
private
 FParams: ..;
..
public
 constructor Create(AOwner: TComponent; Params: ...);
..
end;
..
constructor TMyChildForm.Create(AOwner: TComponent; Params: ...);
begin
..
 FParams: = Params; // сохраним переданные параметры
 inherited Create(AOwner); // и собственно создадим форму
..
end;

..

TMyChildForm.Create(владелец, параметры);



 
девушка   (2008-12-19 13:58) [17]

> Сергей М.
Спасибо :) теперь в голове моей не опилки, да-да-да!
А какой тип посоветуете выбрать для  FParams?


 
Сергей М. ©   (2008-12-19 14:01) [18]


> девушка   (19.12.08 13:58) [17]


Да практически какой угодно)
Тут полный простор для выбора.


 
девушка   (2008-12-19 14:02) [19]

ясно - Tparams :)


 
Сергей М. ©   (2008-12-19 14:24) [20]


> Tparams


Можно и TParams, но тянуть из-за него одного в свой проект целый db.pas нет никакого резона, если конечно же в проекте этот юнит уже не участвует.

Если предполагаются заранее неизвестные кол-во и типы параметров, то удобно использовать [Ole]Variant или открытый массив.


 
Anatoly Podgoretsky ©   (2008-12-19 15:05) [21]


> Jeer ©   (19.12.08 11:41) [13]

Нет что бы прямо сказать, все намеками и намеками.


 
Jeer ©   (2008-12-19 15:09) [22]

По поводу SDI:

В дочерних:
OnClose
Action := caFree;

OnDestroy
fmMy := nil

При пересоздании из главной формы (скажем по клику на Button):
if (fmMy = nil) then fmMy := TMyForm.Create;
fmMy.Show;

По поводу передачи параметров в большинстве случае мне хватает:

constructor TMyForm.Create(AOwner: TComponent; vPar: integer; vStr: string);
begin
 fPar := vPar;
 fStr := vStr;
 inherited Create(AOwner);
end;

Впрочем, вполне может подойти и такой вариант, с учетом возможности возврата данных из форм:
constructor CreateWithParams(Value: Pointer; Owner: TComponent);



Страницы: 1 вся ветка

Текущий архив: 2009.02.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
15-1228746981
Putnik
2008-12-08 17:36
2009.02.01
Интернет-кафе


2-1229548091
YoungerDelphist
2008-12-18 00:08
2009.02.01
biHelp


2-1229791230
Programmer
2008-12-20 19:40
2009.02.01
Обновление программы, написанной на Делфи самой программой


2-1229319612
CodeMaster
2008-12-15 08:40
2009.02.01
Прокрутка в Наследнике класса TListBox


3-1214206318
Matveih1
2008-06-23 11:31
2009.02.01
Как из Delphi завести нового пользователя в FireBird