Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Seite 1 von 2  1 2      

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