Autor Téma: FreeAndNil vlozeneho formulare  (Přečteno 377 krát)

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
FreeAndNil vlozeneho formulare
« kdy: 20-07-2017, 19:21:36 »
Ahoj,
setkal jsem se z jednou takovou neprijemnou zalezitosti,
mam hlavni formular ve kterem mam jednoduchou proceduru pro spravu formularu ktere "vkladam" na hlavni formular
Kód: Delphi [Vybrat]
  1. //AppLayout je umisten na hlivnim formulari do ktereho "vkladam" ostatni formulare
  2. procedure TApp.FormManager(CloseForm,OpenForm:String;OnlyHide:Boolean = false);
  3. begin
  4.   LastActiveForm:=OpenForm;
  5.   // OPEN FORM
  6.   if OpenForm = '' then begin
  7.     // nedelej nic ;-)
  8.   end
  9.   else if OpenForm = 'FAMain01' then begin
  10.     if NOT Assigned(FAMain01) then FAMain01 := TFUMain01.Create(Self);
  11.     FAMain01.FLayout.Parent:=AppLayout;
  12.   end;
  13.  
  14.   // CLOSE FORM
  15.   if CloseForm = '' then begin
  16.     // nedelej nic ;-)
  17.   end
  18.   else if CloseForm = 'FAMain01' then begin
  19.     if Assigned(FAMain01) then begin
  20.       FAMain01.FLayout.Parent := nil;
  21.       if not OnlyHide then FreeAndNil(FAMain01);
  22.     end;
  23.   end;
  24.  
  25.   Application.ProcessMessages;
  26.   ScaledLayout.Repaint
  27. end;

problem ze ze pokud budu chtit FAMain01 zavrit pomoci tlacitka ktere je umisteno na nem tak mi to vyhodi exception do
Kód: Delphi [Vybrat]
  1. procedure TControl.MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
  2. begin
  3.   if AbsoluteEnabled and FPressed and not FDoubleClick and PointInObjectLocal(X, Y) then
  4.   begin
  5.     Click;
  6.     FPressed := False;
  7.     StartTriggerAnimation(Self, 'Pressed');
  8.   end;
  9. end;
  10.  

coz sice chapu jelikoz po Click; jiz form prestane existovat a tim padem zbytek se nema na cem vykonat ale je to neprijemne :-/

Poradil by nekdo neco jednoducheho jak se teto neprijemnosti zbavit?

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 702
  • Karma: 40
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:FreeAndNil vlozeneho formulare
« Odpověď #1 kdy: 21-07-2017, 09:24:49 »
Zkus misto FreeAndNil(FAMain01); pouzit:

Kód: Delphi [Vybrat]
  1. FAMain01.Release;
  2. FAMain01 := nil;
Embarcadero Technology Partner, juj. Člen Lazarus týmu, oj.

Offline Andy

  • Mladík
  • **
  • Příspěvků: 51
  • Karma: 0
Re:FreeAndNil vlozeneho formulare
« Odpověď #2 kdy: 21-07-2017, 11:01:13 »
Bohuzel je to to same :-( ...

Offline chaloup

  • Mladík
  • **
  • Příspěvků: 85
  • Karma: 9
    • Verze Delphi: Delphi 10.2
Re:FreeAndNil vlozeneho formulare
« Odpověď #3 kdy: 21-07-2017, 11:33:06 »
Sám jsi si odpověděl:
Citace
jelikoz po Click; jiz form prestane existovat a tim padem zbytek se nema na cem vykonat
To znamená, že v OnClick můžeš udělat tak max.
Kód: Delphi [Vybrat]
  1. Self.Close;
a v OnClose
Kód: Delphi [Vybrat]
  1. Action := TCloseAction.caFree;
  2. FAMain01 := nil;

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 1849
  • Karma: 87
    • Verze Delphi: D2007, XE3, DX10
Re:FreeAndNil vlozeneho formulare
« Odpověď #4 kdy: 21-07-2017, 12:10:42 »
Bohuzel je to to same :-( ...
V tech OnClick handlerech se to bezne resiva tak, ze si form POSTne nejakou UM_XXX samo sobe a v jejim handleru se to obslouzi a okno zavre. Bezne je take dat takovych mechanismus do spolecneho predka vsech formularu.

Ve tvem pripade, kdyz mas nejaky form manager, by bylo asi nejcistsi postnout (asynchronne) nejakou zpravu UM_CLOSE_ME tomu manageru a ten by okno zavrel a killnul.

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Datový typ v Delphi, který má True a False: