Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.02.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
девушка   (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.006 c
1-1207674401
Ampleyev
2008-04-08 21:06
2009.02.01
Помогите со стегоалгоритмом


3-1214040475
Tab
2008-06-21 13:27
2009.02.01
Функция Substring s FireBird


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


2-1229861533
flunkkkk
2008-12-21 15:12
2009.02.01
доработка в программе


15-1228513848
Керк
2008-12-06 00:50
2009.02.01
CAML





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский