Dinami4ni formi

12 отговора 427 прегледа
#1

Dinami4ni formi

..Един тъп въпрос

Как мога да разбера от дадена Форма кога друга форма(която се създава динами4но) е активна?

..heeeelllp (zabravil sym kak stava6e )

Отговор
в отговор на Vermax #2

Re: Dinami4ni formi

if Form.Active then...

чети и дишай по-леко
Отговор
в отговор на Pechenia #3

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)

Отговор
в отговор на Vermax #4

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

Редактирано от Pechenia на

Отговор
в отговор на Pechenia #5

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;



Отговор
в отговор на Vermax #6

Re: Blagodarq

"if assigned(ChildForm) then //proverqva dali formata e v pametta "

Има един подводен камък.
Ако после освободиш формата:
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 ...


Отговор
в отговор на Vermax #7

Re: Blagodarq

Ми то под "активна" се разбира дали е на фокус... Както и да е, щом си се оправил...

чети и дишай по-леко
Отговор
в отговор на Vermax #8

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 пиши тук...

Отговор
в отговор на about #9

Оф, хора :)

Шашкам се вече :) Какво му е на if Assigned(форма) then .. аз лично никога не пиша обект.Free; - винаги заnilявам

-------------
Special killer double trouble triple extra nicotine monster!
Отговор
в отговор на z_free #10

Re: Оф, хора :)

Ами, на мен ми е малко мътно какво точно прави това assigned.
Пък и с флаг си е абсолютно ясно за какво става дума...
А ти що не ползваш фрии ? :)

Отговор
в отговор на z_free #11

Re: Оф, хора :)

Така не освобождаваш паметта. Вика му се Memory Leak.
Хубаво, че "заnilяваш", но преди това е хубаво да Free-ваш (освен, ако някой не Free-ва вместо тебе).

Отговор
в отговор на mn_t #12

Аве хора :)

не викам обект.Free; а FreeAndNil(обект) - освобождава и занилява, няма мемори лийк :) Assigned Емил си го каза, равносилно е на (указател_към_обект = nil) = True/False = Assigned(указател_към_обект) ... такива неща.. но обект <> nil не означава, че е коректно инициализиран .. ама това са глупости :) Стайлинг :)

-------------
Special killer double trouble triple extra nicotine monster!

Редактирано от z_free на

Отговор
в отговор на z_free #13

Re: Аве хора :)

Ахам. Заблудих се от "заnilяването", че пишеш обект := nil; без да викаш Free. :)

Отговор