Dinami4ni formi
12 отговора
427 прегледа
Dinami4ni formi
..Един тъп въпрос
Как мога да разбера от дадена Форма кога друга форма(която се създава динами4но) е активна?
..heeeelllp (zabravil sym kak stava6e )
Как мога да разбера от дадена Форма кога друга форма(която се създава динами4но) е активна?
..heeeelllp (zabravil sym kak stava6e )
Re: Dinami4ni formi
...qvno ne sym se izrazil qsno...
tova bi rabotilo ako za formata se zadelq pamet pri startirane na prilojenieto, no ako formata se syzdava dinami4no (toest pamet za neq se zadelq v posledstvie-po vreme na rabota na prolijenieto) i ot druga forma se pravi proverka s "if Form.Active" - Delphi hvyrlq "Access Violation".
ta Vyprosa mi be6e - kak moga da razbera 4e formata,koqto se syzdava dinami4no e syzdadena i e activna (Tyi kato pri zatvarqneto i - zadelenata za neq pamet se osvobojdava)
tova bi rabotilo ako za formata se zadelq pamet pri startirane na prilojenieto, no ako formata se syzdava dinami4no (toest pamet za neq se zadelq v posledstvie-po vreme na rabota na prolijenieto) i ot druga forma se pravi proverka s "if Form.Active" - Delphi hvyrlq "Access Violation".
ta Vyprosa mi be6e - kak moga da razbera 4e formata,koqto se syzdava dinami4no e syzdadena i e activna (Tyi kato pri zatvarqneto i - zadelenata za neq pamet se osvobojdava)
Re: Dinami4ni formi
Направих си труда да напиша едно приложение, ето кода:
procedure TForm1.FormCreate(Sender: TObject);
var p: TForm;
begin
p:=TForm.Create (nil); // това заделя памет за формата
p.Show; // това прави формата p активна
if p.Active then ShowMessage ('p is active') else ShowMessage ('p is not active');
end;
Изтрий коментираните редове и я пусни пак. Аз лично не получих Access Violation
procedure TForm1.FormCreate(Sender: TObject);
var p: TForm;
begin
p:=TForm.Create (nil); // това заделя памет за формата
p.Show; // това прави формата p активна
if p.Active then ShowMessage ('p is active') else ShowMessage ('p is not active');
end;
Изтрий коментираните редове и я пусни пак. Аз лично не получих Access Violation
Редактирано от Pechenia на
Blagodarq
Благодаря приятелю ,но наистина явно не можем да се разберем
...както и да е аз си спомних как ставаха работите:
Var
ChildForm:TForm1; //globalna promenliva
//Ако на някой бутон имаш:
procedure Buttonclick......
begin
ChildForm:=TForm1.create(self);
ChildForm.Showmodal;
end;
//to
Procedure Table1.Afterscroll.....
begin
if assigned(ChildForm) then //proverqva dali formata e v pametta
.......
end;

...както и да е аз си спомних как ставаха работите:
Var
ChildForm:TForm1; //globalna promenliva
//Ако на някой бутон имаш:
procedure Buttonclick......
begin
ChildForm:=TForm1.create(self);
ChildForm.Showmodal;
end;
//to
Procedure Table1.Afterscroll.....
begin
if assigned(ChildForm) then //proverqva dali formata e v pametta
.......
end;
Re: Blagodarq
"if assigned(ChildForm) then //proverqva dali formata e v pametta "
Има един подводен камък.
Ако после освободиш формата:
и след това провериш
то ChildForm няма да е nil, но паметта за
формата ще е освободена и проверката
пак ще гръмне. (Защото assigned просто
проверява дали обекта е nil или не, но дали
тази памет е достъпна е друг въпрос )
Затова вместо
може да се използва
за да си сигурен че ще стане nil.
Еквивалентно на
Друг способ:
Има един подводен камък.
Ако после освободиш формата:
ChildForm.Free
и след това провериш
if assigned...
то ChildForm няма да е nil, но паметта за
формата ще е освободена и проверката
if ChildForm.Active ...
пак ще гръмне. (Защото assigned просто
проверява дали обекта е nil или не, но дали
тази памет е достъпна е друг въпрос )
Затова вместо
ChildForm.Free
може да се използва
FreeAndNil(ChildForm)
за да си сигурен че ще стане nil.
Еквивалентно на
Form.free и Form:=nil;
Друг способ:
var FlagIsFormActive:boolean;
...
FlagIsFormActive:=false;
try FlagIsFormActive:=Form.Active except end;
{и сега вече}
if FlagIsFormActive then ...
Re: Blagodarq
Ми то под "активна" се разбира дали е на фокус... Както и да е, щом си се оправил...
чети и дишай по-леко
чети и дишай по-леко
Re: Dinami4ni formi
Имаш MainForm и ChildForm.
Добавяш един флаг ChildFormActive: boolean в MainForm
Slagash w OnCreate methoda na ChildForm
MainForm.ChildFormActive:=true;
Slagash w OnDestroy methoda na ChildForm
MainForm.ChildFormActive:=false;
Ако не знаеш как да хванеш динамично OnCreate i OnDestroy пиши тук...
Добавяш един флаг ChildFormActive: boolean в MainForm
Slagash w OnCreate methoda na ChildForm
MainForm.ChildFormActive:=true;
Slagash w OnDestroy methoda na ChildForm
MainForm.ChildFormActive:=false;
Ако не знаеш как да хванеш динамично OnCreate i OnDestroy пиши тук...
Оф, хора :)
Шашкам се вече :) Какво му е на if Assigned(форма) then .. аз лично никога не пиша обект.Free; - винаги заnilявам 
-------------
Special killer double trouble triple extra nicotine monster!
-------------
Special killer double trouble triple extra nicotine monster!
Re: Оф, хора :)
Ами, на мен ми е малко мътно какво точно прави това assigned.
Пък и с флаг си е абсолютно ясно за какво става дума...
А ти що не ползваш фрии ? :)
Пък и с флаг си е абсолютно ясно за какво става дума...
А ти що не ползваш фрии ? :)
Re: Оф, хора :)
Така не освобождаваш паметта. Вика му се Memory Leak.
Хубаво, че "заnilяваш", но преди това е хубаво да Free-ваш (освен, ако някой не Free-ва вместо тебе).
Хубаво, че "заnilяваш", но преди това е хубаво да Free-ваш (освен, ако някой не Free-ва вместо тебе).
Аве хора :)
не викам обект.Free; а FreeAndNil(обект) - освобождава и занилява, няма мемори лийк :) Assigned Емил си го каза, равносилно е на (указател_към_обект = nil) = True/False = Assigned(указател_към_обект) ... такива неща.. но обект <> nil не означава, че е коректно инициализиран .. ама това са глупости :) Стайлинг :)
-------------
Special killer double trouble triple extra nicotine monster!
-------------
Special killer double trouble triple extra nicotine monster!
Редактирано от z_free на
Re: Аве хора :)
Ахам. Заблудих се от "заnilяването", че пишеш обект := nil; без да викаш Free. :)