![]() |
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; |
Re: Wie kann ein Button sich selbst freigeben?
Über eine lokale Variable gehts nicht.
Gut - ist auch nicht so schlimm, denn ich ruf PostMessage in einer procedure auf, der eine Konstante mit übergeben wird.
Delphi-Quellcode:
(das soll nur ein Beispiel darstellen)
Procedure TMyForm.Sende_Nachricht(const S: String);
Begin PostMessage(Handle,WM_DESTROYPANEL, Integer(@S[1]), 0); End; |
Re: Wie kann ein Button sich selbst freigeben?
Zitat:
|
Re: Wie kann ein Button sich selbst freigeben?
Ich brauchs auch nur intern
|
Re: Wie kann ein Button sich selbst freigeben?
Oder du nimmst einen PString:
Delphi-Quellcode:
Procedure TMyForm.ButtonClick (Sender : TObject);
var S: PString; Begin new(s); S^ := 'hallo'; if not PostMessage(Handle,WM_DESTROYPANEL, Integer(S), 0) then dispose(S); //falls die MEssage nicht funktioniert hat end; Procedure TMyForm.CMDestroyPanel(Var Msg : TMessage); var S:Pstring; Begin S:=pointer(msg.wparam); //Du kannst auch einen eigenen Record anstatt TMessage nehmen FreeAndNil (ThePanel); if S<>nil then begin ShowMessage(S^); Dispose(S); end; End; |
Re: Wie kann ein Button sich selbst freigeben?
Hi,
Auch von mir nochmal einen herzlichen Dank für diese Lösung. Die werde ich mir jetzt auch mal anschauen. Ich habe dazu, sagen wir "nicht schönen Code" verwendet, den ich aus diesem Grund auch nicht posten werden :mrgreen: Gibt es eigentlich ein empfehlenswertes Tutorial für das Arbeiten mit Messages? Gruß Ansgar |
Re: Wie kann ein Button sich selbst freigeben?
Zitat:
|
Re: Wie kann ein Button sich selbst freigeben?
Auf die Frage zu den MEssages habe ich etwas schönes gefunden:
![]() Da steht auch wie die Message Queue aufgebaut ist und wie sie abgearbeitet wird (mit welchen Prioritäten) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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