Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TFrame zerstören bei userinteraktion :( access-violation!! (https://www.delphipraxis.net/93715-tframe-zerstoeren-bei-userinteraktion-access-violation.html)

mojo777 10. Jun 2007 10:05


TFrame zerstören bei userinteraktion :( access-violation!!
 
Hallo Forum!

Ich stehe momentan vor einem blöden Problem.
Und zwar erstelle ich ein Objekt aus einer KLasse, die von TFrame abgeleitet ist.
Die Parent Dazu ist dann ein TPanel.
Wenn jetzt z.b. der OK Knopf im TFrame gedrückt wird, soll das ParentPanel auf visible:=False
geschaltet werden UND das TFrame-Teil aus dem Speicher gelöscht werden.
Ich habe das so probiert:

Delphi-Quellcode:
procedure TfrKndEdit.btnCancelClick(Sender: TObject);
begin
//self.destroy;
Parent.Visible:=False;
FreeAndNil(self);
end;
Alles hilft nicht.

Oder Mit CallbackEvents klappts auch nicht:

Delphi-Quellcode:
ActionFrame:=TfrKndEdit.Create(nil);
initActionFrame;
(ActionFrame as TfrKndEdit).knd:=GLOBAL_AUFTRAGLISTE.Item.Kunde;
(ActionFrame as TfrKndEdit).init;
(ActionFrame as TfrKndEdit).CloseCallback:=KndFrameClose;
und dann
Delphi-Quellcode:
procedure TfmMain.KndFrameClose();
begin
(ActionFrame as TfrKndEdit).Destroy;
end;
wie schaffe ich das?
Ich überlege schon einen timer einzusetzen, aber das wäre jawohl VOLL DIRTY EY! ;)

OK. Hoffe jemand mag mir helfen.

Viele Grüße

_frank_ 10. Jun 2007 14:33

Re: TFrame zerstören bei userinteraktion :( access-violation
 
du kannst ein objekt nicht aus einer zugehörigen Methode aus zerstören.
Das Objekt führt ja noch deine Anweisung aus :), du ziehst der aktuellen Methode den Boden unter den Füßen weg.
Eine Möglichkeit auf einen Timer zu verzichten dürfte eine Message (Hier im Forum suchenPostmessage) sein. Diese schickst du an ein Form oder ähnliches außerhalb deiner zu zerstörenden Komponente und gibst die Komponente in der Behandlungsroutine frei.

HTH Frank

SirThornberry 10. Jun 2007 14:54

Re: TFrame zerstören bei userinteraktion :( access-violation
 
wie frank schon erklärte geht das was du versuchst nicht. Das ist als wölltest du ein Haus sprengen und der Auslöser ist im Haus. Dadurch das, das Haus gesprengt ist kannst du nicht mehr aus dem Haus raus laufen. Weil der Weg aus dem Haus weg ist.

mojo777 10. Jun 2007 16:27

Re: TFrame zerstören bei userinteraktion :( access-violation
 
Hallo Frank, hallo Sir!
Also ich habe mir den Grund erklären können. Leider aber nicht lösen.

ok. zum Konstruktiven:
Zitat:

Diese schickst du an ein Form oder ähnliches außerhalb deiner zu zerstörenden Komponente und gibst die Komponente in der Behandlungsroutine frei.
Das habe ich nicht ganz verstanden. Also mit den Handles bin ich sowieso ein wenig auf dem Kriegsfuß.
Frank, könntest du mir zu deiner Idee vielleicht einen Link geben oder vielleicht ein bisschen näher erläutern? Vielleicht sogar mit einem kleinen Beispiel?

Danke!

Grüße

_frank_ 10. Jun 2007 17:42

Re: TFrame zerstören bei userinteraktion :( access-violation
 
hab hier mal nen Button genommen, ist aber vom Prinzip her gleich:

jetzt definieren wir erstmal eine eigene Message:
Delphi-Quellcode:
const
  WM_DestroyFrame=WM_USER+10;
nun fügen wir eine Behandlungsroutine in das Form ein

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    procedure WMDestroyFrame(var msg:TMessage); message WM_DestroyFrame;
  public
    { Public-Deklarationen }
  end;

...
procedure TForm1.WMDestroyFrame(var msg:TMessage);
begin
  if msg.lParam>0 then
    TButton(msg.LParam).free; //hab hier mal in LParam den pointer auf die TButton-Instanz geschrieben
end;
und im Buttonclick schicken wir die Nachricht...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  postmessage(self.handle,WM_DestroyFrame,0,integer(Button1)); //Pointer auf TButton-Instanz als LParam weitergeben
end;
musst das eigentlich nur noch an deine Klasse anpassen ;)

Gruß Frank

SirThornberry 10. Jun 2007 18:04

Re: TFrame zerstören bei userinteraktion :( access-violation
 
man sollte erwähen das diese Methode auch nicht sicher ist. Wenn eine Componente ein Ereignis auslöst, dann Applicaiton.ProcessMessages auslöst und dann erst aus der Behandlung raus geht knallts auch weil durch Applicaiton.ProcessMessages auch schon zu früh das Zerstören veranlasst wird.
Ebenfalls würde es knallen wenn man erst die Message schickt und danach in der Ereignisbehandlung selbst noch Applicaiton.ProcessMessages auslöst. Von daher ist das nicht die ultimative Lösung und man sollte dabei bleiben das sich eine Komponente einfach nicht selbst zerstört oder frei gibt.

_frank_ 10. Jun 2007 18:20

Re: TFrame zerstören bei userinteraktion :( access-violation
 
also application.processmessages nach dem postmessage aus der klasse heraus aufrufen wär natürlich fatal. aber sonst dürfte imho nichts passieren (nach dem Postmessage darf in der klasse/Objekt natürlich nix mehr gemacht werden).
aber einen timer halte ich für unsicherer :)

Gruß Frank


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:00 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz