Zavírání formuláře – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Zavírání formuláře – Delphi – Fórum – Programujte.comZavírání formuláře – Delphi – Fórum – Programujte.com

 

Kerman0
Duch
18. 10. 2010   #1
-
0
-

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

Nahlásit jako SPAM
IP: 78.108.154.–
liborb
~ Redaktor
+18
Guru
18. 10. 2010   #2
-
0
-

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.

Nahlásit jako SPAM
IP: 78.80.52.–
Kerman0
Duch
18. 10. 2010   #3
-
0
-

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ěď

Nahlásit jako SPAM
IP: 89.24.4.–
delphak0
Stálý člen
18. 10. 2010   #4
-
0
-

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;

Nahlásit jako SPAM
IP: 78.98.120.–
Programátor dělá co umí, počítač si dělá co chce
liborb
~ Redaktor
+18
Guru
19. 10. 2010   #5
-
0
-

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;

Nahlásit jako SPAM
IP: 78.80.52.–
Kerman0
Duch
31. 10. 2010   #6
-
0
-

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

Nahlásit jako SPAM
IP: 81.91.220.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 9 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý