Zdravím,
Mám jeden malý problém se zavíráním formulářů... Tvořím v Delphi jendu "hru," ve které používám více oken... samozřejmě hlavní okno (form1) nemůžu uzavřít, poněvadž mi spadne celý program... tenhle problém jsem vyřešil tak, že jsem formuláři přidal hodnotu visible - false (form1.visible:=false;) a otevřu nové okno pomocí show (form2.show;) problém je, že pokud se nevrátím zpět do menu (form1) a neuzavřu program přímo tady pomocí buttonu konec (který vykoná halt;) a zavřu program z jakéhokoliv jiného okna přes křížek, tak Form1 samozřejmě stále zůtane invisble (neviditelný)... Zkoušel jsem to řešit v delphi přes .exe, ale tam nemohu dát podmínky stylu if form2.terminate (případě .close)... děkuju
Fórum › Delphi
Zavírání formuláře
A co jít cestou zakázání uzavření formu standardní cestou, tj. do OnClose bych dal správnou hodnotu TCloseAction:
Action := caNone;
ve chvíli, kdy se nemá aplikace nechat zavřít. A ve chvíli, kdy ano, tak hodnotu Action neměnit a form se uzavře.
To liborb : Omlouvám se, ale v Delphi jsem celkem neznalý... Jsem student a začali jsme necelý měsíc zpět... Předtím jsem dělal akorát v pascalu, Delphi mě baví, takže to mám spíš jako samostudium a práci co mám koncem měsíce odevzdat, jsem trochu vypracoval a dostal na úroveň, kterou bych "neměl znát" googloval jsem trochu na netu ohledně toho co si mi psal a asi jsem celkem pochopit jak by se to mělo chovat, ale netuším jak to do toho přikazového řádku zakomponovat, pokud bys mohl, tak mi jenom vypiš příkazový řádek pro dva prázdne formy... Snad bych se v tom už zorientoval a dokázal to zakomponovat do svého programu, každopádně i tak děkuju za tvou první odpověď
Pokud chceš zavřít celou aplikaci - Application.Terminate;
pokud chceš zavřít formulár - Form(číslo).Close;
pokud chceš zneviditelnit formulár - Form(číslo).Visible:=False;
pokud chceš zviditelnit formular - Form(číslo).Visible:=True;
A pokud chceš vytvořit formulár za běhu aplikace tak zkus toto:
Procedure TForm1.Button1Click(Sender: TObject);
begin
if Form2 = nil then
Form2 := TForm2.Create(Self);
Form2.Show;
end;
Unit Unit1;
...
procedure TForm1.Button2Click(Sender: TObject);
begin
Self.Close;
end;
To Kerman : Tak jeden ukázkový příklad, kdy z Form1 se otevírá Form2, Form2 lze uzavírat bez omezení, Form1 pouze v případě, že není otevřen Form2. Už z toho "zadání" je jasné, že si ty formy musí umět vyměnit informace nebo jinak, Form2 musí umět informovat Form1, že byl uzavřen. A protože se Form2 tvoří dynamicky, tak k tomu je potřeba, aby měl povědomost o svém "nadřízeném".
Vytvoření Form2 na stisk tlačítka ve Form1 (použijeme kód delphaka):
procedure TForm1.Button1Click(Sender: TObject);
begin
if (Form2 = nil) then begin
Form2 := TForm2.Create(Self);
Form2.SetParentForm(Self);
Form2.Show;
end
end;
SetParentForm je naše funkce, kterou si předáváme referenci na Form1 do Form2:
procedure TForm2.SetParentForm(Form: TForm);
begin
ParentForm := Form;
end;
kde ParentForm je definován jako ParentForm: TForm.
Když uzavřeme Form2, tak musíme dát vědět do Form1:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
TForm1(ParentForm).CloseChildForm(Self);
end;
CloseChildForm je opět naše funkce, tentokráte ve Form1:
procedure TForm1.CloseChildForm(Child: TForm);
begin
if (Form2 = Child) then begin
Form2 := nil;
end
end;
A pak už jenom ošetřit zákaz uzavření Form1, pokud je otevřený Form2:
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if (Form2 <> nil) then Action := caNone;
end;
Díky, už jsem to pochopil, sice jsem to udělal trochu jinak, ale bez téhle pomoci bych to asi nezvládl... Měl jsem chybu když jsem prováděl akci při eventu "OnClose" chybělo mi v načtení procedury: "var Action: TCloseAction;" měl jsem tam jen "(Sender: TObject); Ještě jednou díky
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Zavírání se programu — založil iCrow
Zavírání oken — založil dragon124
Změna vlastností ovl.prvků hlavního formuláře z formuláře druhého. — založil avantasius
Mysql místo select, bych chtel dát do formuláre data z jiného vyplne… — založil minolot
Automaticke zavirani okna — založil