AGB  ·  Datenschutz  ·  Impressum  







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

Frame soll sich selbst löschen

Offene Frage von "corny2000"
Ein Thema von corny2000 · begonnen am 27. Jan 2008 · letzter Beitrag vom 27. Jan 2008
Antwort Antwort
corny2000

Registriert seit: 31. Mai 2007
3 Beiträge
 
#1

Frame soll sich selbst löschen

  Alt 27. Jan 2008, 15:11
Hallo,

Ich verwende Delphi 7 und habe folgenden Eintrag in der Hilfe-Datei unter der Erklärung für die prozedur "free" gefunden:

Zitat:
Warnung: Sie dürfen eine Komponente nie in einer ihrer eigenen Ereignisbehandlungsroutinen oder in einer Ereignisbehandlungsroutine eines untergeordneten Objekts freigeben. Geben Sie beispielsweise auf keinen Fall eine Schaltfläche oder ihr übergeordnetes Formular in der OnClick Ereignisbehandlungsroutine der Schaltfläche frei.
Nun, genau DIES muss ich aber für mein Projekt hinbekommen. Ich habe ein kleines Beispiel-Projekt zur Veranschaulichung erzeugt.

Ich erzeuge ein Formular mit einem Button und einem Panel:

http://web.whosting.ch/Fashionhbj/frame1.jpg

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var MyFrame: TFrame1;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(MyFrame) then
  begin
    MyFrame := TFrame1.Create(Panel1);
    MyFrame.Parent := Panel1;
    MyFrame.Align := alClient;
  end else MyFrame.Free;
end;
Klickt man nun auf den Button, wird MyFrame erzeugt oder gelöscht. Funktioniert ganz fantastisch!


MyFrame ist vom Typ Frame1. Diese sieht folgendermaßen aus:

http://web.whosting.ch/Fashionhbj/frame0.jpg

Delphi-Quellcode:
type
  TFrame1 = class(TFrame)
    FrameButton: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

uses UTest;

{$R *.dfm}

procedure TFrame1.FrameButtonClick(Sender: TObject);
begin
  Form1.Button1.Click;
end;
Wie am Quellcode von FrameButtonClick auf TFrame1 ersichtlich, möchte ich den Frame löschen, sobald dieser Button geklickt wird.

http://web.whosting.ch/Fashionhbj/frame2.jpg


Natürlich geht das so nicht, denn folgendes geschieht:
- Ich klicke auf FrameButton in MyFrame
- Es wird Button1Click in Form1 aufgerufen
- Button1.Click in Form1 sorgt dafür, dass der Frame zerstört wird
- Nach Beenden von Button1Click in Form1 kehrt das Programm in FrameButtonClick auf MyFrame zurück - oh hoppla, MyFrame wurde doch schon gelöscht - Adressfehler, Programmabsturz.


Was also EIGENTLICH in FrameButtonClick stehen müsste wäre so etwas wie:
1. sobald dieser Frame freigegeben wurde, führe Button1Click auf Frame1 aus

-> Es gibt ein Kommando ".Release" was wohl genau das macht. Dummerweise gibt es das nicht für Frames.
-> Bei TForm geht das, einfach Self.Close

Hat einer ne Idee, wie man das Programm austricksen kann, damit ich mit dem Button auf den Frame den Frame löschen kann?
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Frame soll sich selbst löschen

  Alt 27. Jan 2008, 17:44
Zitat von corny2000:
Es gibt ein Kommando ".Release" was wohl genau das macht. Dummerweise gibt es das nicht für Frames.
-> Bei TForm geht das, einfach Self.Close

Hat einer ne Idee, wie man das Programm austricksen kann, damit ich mit dem Button auf den Frame den Frame löschen kann?
Du mußt den gleichen Trick machen wie dort. Einfach ein weiteres Event definieren (UM_FREEFRAME = WM_USER + 101) und dieses Auslösen und beim Eintreffen diese (procedure UMFREEFRAME(Msg: TMessage) message UM_FREEFRAME) das Frame freigeben.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
corny2000

Registriert seit: 31. Mai 2007
3 Beiträge
 
#3

Re: Frame soll sich selbst löschen

  Alt 27. Jan 2008, 20:48
Hallo,

Danke für die Antwort!


Leider ist mein Problem damit nur zur Hälfte gelöst.

Diese Zeile schickt die Message an meine Form:
PostMessage(Form1.Handle, UM_FREEFRAME, 0, 0); Jetzt habe ich in Form1 eine procedure die mir das abfängt:

Delphi-Quellcode:
procedure FreeFrame(var Msg: TMessage);
begin
  Frame1.Free;
end;
Leider funktioniert das nur, solange ich den Namen des Frames kenne, den ich schließen will. Erzeuge ich meine Frames aber dynamisch, muss ich irgendwie übergeben können, WELCHEN meiner Frames ich löschen möchte.
Kann man diese Information wohlmöglich in der Message mit unterbringen?
PostMessage(Form1.Handle, UM_FREEFRAME, 0, 0);
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Frame soll sich selbst löschen

  Alt 27. Jan 2008, 21:33
Schau mal deine beiden Parameter an die du bisher mit 0 belegt hast. Da beide eine breite von 32-Bit haben könnte man da sicherlich irgendwelche Informationen wie einen Referenzzeiger, oder ähnliches unterbringen
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
corny2000

Registriert seit: 31. Mai 2007
3 Beiträge
 
#5

Re: Frame soll sich selbst löschen

  Alt 27. Jan 2008, 22:02
Diese Information wird in WPARAM übergeben...

PostMessage(Form1.Handle, UM_FREEFRAME, Integer(MyDynamicFrame), 0);
...und muss dann später wieder entsprechend konvertiert werden:

TFrame1(msg.WParam).Free;

Mein Problem ist hiemit gelöst. Danke für die Hilfe!
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:17 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