![]() |
Wie kann ein Button sich selbst freigeben?
Hallo,
ich erstelle zur Laufzeit einen Button auf einem Panel. Der hat lediglich die Aufgabe, das Panel (und alle darauf befindlichen Controls, also auch sich selber) wieder freizugeben. Also dachte ich, im OnClick nur Button.free oder freeandnil(Button). Aber: "Abstrakter Fehler" oder Zugriffsschutzverletzung in der Unit System. Wie geht es trotzdem? Gruß Mattze |
Re: Wie kann ein Button sich selbst freigeben?
Mach das Panel zum Owner und gib dieses frei.
|
Re: Wie kann ein Button sich selbst freigeben?
Hallo
und vielen Dank für die wirklich sehr schnelle Antwort. Das reicht aus? Da habe ich offenbar wieder den Wald vor lauter Bäumen nicht gesehen. Der Button wird erstellt mit Btn:=TButton.create(Panel), also ist das Panel sowieso der Owner. (Dann natürlich noch Button.parent:=Panel, damit er auch auf dem Panel angezeigt wird.) Ist das tatsächlich so, dass ein Panel (TWinControl) alle Controls und Componenten auf sich selber beim Freigeben automatisch freigibt? Wenn ja, habe ich wieder mal zuviel gemacht... (Ich mache das nämlich selber und das ist ja dann nicht nötig!) Gruß Mattze |
Re: Wie kann ein Button sich selbst freigeben?
Ja. Das ist die Aufgabe des Owners
|
Re: Wie kann ein Button sich selbst freigeben?
Hallo,
also so ganz will das nicht. Gaaanz selten klappt es. Meistens eine Zugriffsschutzverletzung in System.GetdynaMethod. Sieht aber eher nach einem ekligen Fehler von mir aus. Scheinbar irgendein Pointer, der nicht mehr zugewiesen ist. Na, ich probiere weiter... Gruß Mattze |
Re: Wie kann ein Button sich selbst freigeben?
Du schnippelst dem Button ja auch den Boden unter den Füßen weg. Genauergesagt befindet sich der Knopf noch in einer Methode und Du schmeißt ihn auf den Müll. Das geht natürlich nicht.
Schick dem Formular per PostMessage eine benutzerdefinierte Message. Der Message-Handler des Formulares gibt dann das Panel frei.
Delphi-Quellcode:
Const
WM_DESTROYPANEL = WM_USER+1; Type TMyForm = Class (TForm) ... Procedure CMDestroyPanel(Var Msg : TMessage); message WM_DESTROYPANEL; ... End; Procedure TMyForm.CMDestroyPanel(Var Msg : TMessage); Begin FreeAndNil (ThePanel); End; Procedure TMyForm.ButtonClick (Sender : TObject); Begin PostMessage(Handle,WM_DESTROYPANEL,0,0); End; |
Re: Wie kann ein Button sich selbst freigeben?
Hallo,
so hatte ich mir das anfangs auch erklärt. Ich hatte aber die Hoffnung, dass Delphi das irgendwie abfängt. Na ja... Mit dem Postmessage hätte ich auch probiert, aber... Das ist eine eigene Klasse, die nur alles auf einem Tabsheet erzeugt, bearbeitet und wieder abbaut. Wo kriege ich da das Handle vom Hauptformular her? Reicht es aus, das Handle vom Formular in der Create der neuen Classe zu übergeben und dann eben so weiter, wie beschrieben? Oder kann man das Tabsheet, das ich natürlich übergebe, veranlassen, das Panel zu löschen? Kann man überhaupt eine Componente veranlassen, "eben mal schnell" alle ihre Untercomponenten zu löschen? Also sie selber bleibt bestehen, nur eben "jungfräulich". (Natürlich kann man das von Hand und rekursiv machen. Mache ich ja. Aber vielleicht gibt es da eine Abkürzung?) Gruß Mattze |
Re: Wie kann ein Button sich selbst freigeben?
Hallo,
schon wieder ich. Diesmal mit einer Freudenmeldung. Das mit der Handleübergabe geht. Nun ist es OK und reicht auch aus. (Ich habe sowieso schon eine Konstanten-Unit mit einer Reihe WM_User+x.) Sooo schlecht ist das mit der Handleübergabe auch nicht. Vielleicht brauche ich den ja demnächst in der neuen Klasse doch mal! Gruß und vielen Dank Mattze |
Re: Wie kann ein Button sich selbst freigeben?
Hallo,
ich hab grad dieses Kapitel durchgelesen, weil ich gerade an dem selben Punkt bin und diese Lösung gebrauchen kann. Ich hätt dazu nur eine Frage. Kann man der Windows-Message noch einen String mitgeben? So in etwa (Pseudo-Code):
Delphi-Quellcode:
Procedure TMyForm.ButtonClick (Sender : TObject);
var S: String; Begin S := 'hallo'; PostMessage(Handle,WM_DESTROYPANEL, S, 0); End; |
Re: Wie kann ein Button sich selbst freigeben?
Ja, aber du musst einen Pointer auf einen String bzw halt einen PChar übergeben:
Delphi-Quellcode:
Wobei ich nicht weiß, ob es funktioniert wenn die Stringvariable lokal ist. Aber probiers einfach mal aus.
Procedure TMyForm.ButtonClick (Sender : TObject);
var S: String; Begin S := 'hallo'; PostMessage(Handle,WM_DESTROYPANEL, Integer(@S[1]), 0); End; Procedure TMyForm.CMDestroyPanel(Var Msg : TMessage); Begin FreeAndNil (ThePanel); ShowMessage(PChar(Msg.WParam)); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:01 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-2025 by Thomas Breitkreuz