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 Wie kann ein Button sich selbst freigeben? (https://www.delphipraxis.net/119874-wie-kann-ein-button-sich-selbst-freigeben.html)

Mattze 2. Sep 2008 14:41


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

mkinzler 2. Sep 2008 14:45

Re: Wie kann ein Button sich selbst freigeben?
 
Mach das Panel zum Owner und gib dieses frei.

Mattze 2. Sep 2008 15:04

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

mkinzler 2. Sep 2008 15:07

Re: Wie kann ein Button sich selbst freigeben?
 
Ja. Das ist die Aufgabe des Owners

Mattze 2. Sep 2008 17:52

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

alzaimar 2. Sep 2008 17:58

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;

Mattze 2. Sep 2008 18:35

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

Mattze 2. Sep 2008 18:59

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

Helmi 2. Sep 2008 19:51

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;

Neutral General 2. Sep 2008 19:55

Re: Wie kann ein Button sich selbst freigeben?
 
Ja, aber du musst einen Pointer auf einen String bzw halt einen PChar übergeben:


Delphi-Quellcode:
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;
Wobei ich nicht weiß, ob es funktioniert wenn die Stringvariable lokal ist. Aber probiers einfach mal aus.

Helmi 2. Sep 2008 20:06

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:
Procedure TMyForm.Sende_Nachricht(const S: String);
Begin
  PostMessage(Handle,WM_DESTROYPANEL, Integer(@S[1]), 0);
End;
(das soll nur ein Beispiel darstellen)

Bernhard Geyer 2. Sep 2008 20:13

Re: Wie kann ein Button sich selbst freigeben?
 
Zitat:

Zitat von Helmi
Ich hätt dazu nur eine Frage. Kann man der Windows-Message noch einen String mitgeben?

Bei Messages innerhalb der Anwendung würde das gehen wenn du eine globale Variable nimmst die nicht beim verlassen der Methdoe aufgrund der automatischen Referenzzählung wieder freigegeben wird.

Helmi 2. Sep 2008 20:17

Re: Wie kann ein Button sich selbst freigeben?
 
Ich brauchs auch nur intern

sirius 3. Sep 2008 07:59

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;

angos 3. Sep 2008 09:10

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

sirius 3. Sep 2008 13:30

Re: Wie kann ein Button sich selbst freigeben?
 
Zitat:

Zitat von angos
Gibt es eigentlich ein empfehlenswertes Tutorial für das Arbeiten mit Messages?

Weiß nicht genau. Ggf. mal nach nonVCL Tuts schauen. Denn dort sind Messages enorm wichtig, weil sie ja auch das Werkzeug von Windows sind.

sirius 4. Sep 2008 19:07

Re: Wie kann ein Button sich selbst freigeben?
 
Auf die Frage zu den MEssages habe ich etwas schönes gefunden:
Messages
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