![]() |
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:
Alles hilft nicht.
procedure TfrKndEdit.btnCancelClick(Sender: TObject);
begin //self.destroy; Parent.Visible:=False; FreeAndNil(self); end; Oder Mit CallbackEvents klappts auch nicht:
Delphi-Quellcode:
und dann
ActionFrame:=TfrKndEdit.Create(nil);
initActionFrame; (ActionFrame as TfrKndEdit).knd:=GLOBAL_AUFTRAGLISTE.Item.Kunde; (ActionFrame as TfrKndEdit).init; (ActionFrame as TfrKndEdit).CloseCallback:=KndFrameClose;
Delphi-Quellcode:
wie schaffe ich das?
procedure TfmMain.KndFrameClose();
begin (ActionFrame as TfrKndEdit).Destroy; end; Ich überlege schon einen timer einzusetzen, aber das wäre jawohl VOLL DIRTY EY! ;) OK. Hoffe jemand mag mir helfen. Viele Grüße |
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 ( ![]() HTH Frank |
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.
|
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:
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 |
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:
nun fügen wir eine Behandlungsroutine in das Form ein
const
WM_DestroyFrame=WM_USER+10;
Delphi-Quellcode:
und im Buttonclick schicken wir die Nachricht...
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;
Delphi-Quellcode:
musst das eigentlich nur noch an deine Klasse anpassen ;)
procedure TForm1.Button1Click(Sender: TObject);
begin postmessage(self.handle,WM_DestroyFrame,0,integer(Button1)); //Pointer auf TButton-Instanz als LParam weitergeben end; Gruß Frank |
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. |
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 10:19 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz