Forum Delphi.cz

Delphi => Firemonkey => Téma založeno: Andy 20-07-2017, 19:21:36

Název: FreeAndNil vlozeneho formulare
Přispěvatel: Andy 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?
Název: Re:FreeAndNil vlozeneho formulare
Přispěvatel: Ondřej Pokorný 21-07-2017, 09:24:49
Zkus misto FreeAndNil(FAMain01); pouzit:

Kód: Delphi [Vybrat]
  1. FAMain01.Release;
  2. FAMain01 := nil;
Název: Re:FreeAndNil vlozeneho formulare
Přispěvatel: Andy 21-07-2017, 11:01:13
Bohuzel je to to same :-( ...
Název: Re:FreeAndNil vlozeneho formulare
Přispěvatel: chaloup 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;
Název: Re:FreeAndNil vlozeneho formulare
Přispěvatel: pf1957 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.