AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Wie kann ein Button sich selbst freigeben?

Ein Thema von Mattze · begonnen am 2. Sep 2008 · letzter Beitrag vom 4. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#1

Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 14:41
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 14:45
Mach das Panel zum Owner und gib dieses frei.
Markus Kinzler
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#3

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 15:04
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 15:07
Ja. Das ist die Aufgabe des Owners
Markus Kinzler
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#5

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 17:52
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 17:58
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#7

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 18:35
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
  Mit Zitat antworten Zitat
Mattze

Registriert seit: 6. Jan 2005
664 Beiträge
 
#8

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 18:59
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
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#9

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 19:51
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;
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

Re: Wie kann ein Button sich selbst freigeben?

  Alt 2. Sep 2008, 19:55
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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:37 Uhr.
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