AGB  ·  Datenschutz  ·  Impressum  







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

Selbstzerstörung eines Controls

Ein Thema von Garby · begonnen am 6. Nov 2003 · letzter Beitrag vom 7. Nov 2003
Antwort Antwort
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#1

Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 14:14
Hallo,

ich habe eine Komponente myManel von TPanel abgeleitet. Dort habe ich einen Button draufgesetzt.
Frage: wie kann ich im Button.Click das Panel zerstören?
Delphi-Quellcode:
procedure TmyPanel.CloseClick(Sender: TObject);
begin
  FreeAndNil(Self); // oder einfach Free;
end;
funktioniert nicht.
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 14:20
das geht nicht. müsste ein Abstract error kommen da du du ja das ganze noch nutzt während es freigegeben werden soll. Selbstzerstörunge geht somit nicht. Du könntest einer anderen komponente das zerstören überlassen?!
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#3

Re: Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 14:32
So hab ichs bis jetzt auch gemacht, aber ich dachte vielleicht gibts noch eine elegantere Lösung
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 15:04
Geht schon musst nur sicherstellen, dass der button kein sub-object von dem panel mehr ist:

Delphi-Quellcode:
procedure TForm1.Button1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  TButton(sender).Parent := nil;
  Panel1.Free;
end;

procedure TForm1.Button1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  free;
end;
Das problem war eigentlich nur, dass er nach dem mouseDown noch mouseUp für den button erzeugt und da, bei dir kein button mehr existierte hats gekrach. ergo kannst du auch alles in mouseUp schreiben

cu,
maximov.
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#5

Re: Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 15:21
Danke ich probiers gleich aus.
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#6

Re: Selbstzerstörung eines Controls

  Alt 6. Nov 2003, 18:40
Zitat von maximov:
Geht schon musst nur sicherstellen, dass der button kein sub-object von dem panel mehr ist
Hallo Maximov,

im Destruktor von TComponent, dem (indirekten) Vorfahren von TButton wird ua diese Referenz implizit aufgelöst
Delphi-Quellcode:
destructor TComponent.Destroy;
//...
begin
//...
  if FOwner <> nil then FOwner.RemoveComponent(Self);
  inherited Destroy;
end;
Jedoch sollte man generell nicht in den Eventhandlern, das Auslösende Objekt freigeben. In vielen Fällen ist die VCL so programmiert, dass dies zu einem Absturz führt. Hier zB ein Ausschnitt aus der Implementierung von TDataset aus db.pas:
Delphi-Quellcode:
procedure TDataSet.SetActive(Value: Boolean);
begin
  //...
        DoBeforeOpen;
        try
          OpenCursor;
        finally
          if State <> dsOpening then
            OpenCursorComplete;
        end;
  //...
end;
Wenn Du also in OnBeforeOpen das ereignisauslösende Objekt freigibst, wird (abhängig von der konkreten Implementierung des Erbens) wahrscheinlich in OpenCursor spätestens aber bei if State <> dsOpening ein Fehler auftreten...
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#7

Re: Selbstzerstörung eines Controls

  Alt 7. Nov 2003, 10:35
Das is ja alles schön und gut, aber solange es funktioniert und nach dem 'mouseUp' wird der button nicht mehr von message-routinen angefasst...ergo kein fehler! Ich geb zu das es sub-optimal ist. Mir wäre auch eine lösung lieber gewesen, wie man es zB. mit formularen machen kann, in denen 'release' ( PostMessage(handle,CM_RELEASE,..) ) benutzt werden kann

cu, maximov.
  Mit Zitat antworten Zitat
choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#8

Re: Selbstzerstörung eines Controls

  Alt 7. Nov 2003, 13:43
Hallo maximov,

danke für die Idee! Für den speziellen Fall, könnte man das tatsächlich mit einem PostMessage machen, weil die Ereignissbehandlungsroutine durch die selbe Queue aufgerufen worden ist.

Eine Lösung könnte so implementiert
Delphi-Quellcode:
const
  WM_FREEVCLCONTROL = WM_USER+42;

type
  TForm1 = class(TForm)
  //...
  private
    procedure WMFreeVCLControl(var Message: TMessage);message WM_FREEVCLCONTROL;
  //...
  end;

procedure TForm1.WMFreeVCLControl(var Message: TMessage);
begin
  Assert( Message.WParam<>0 );
  TObject(Message.WParam).Free;
end;
und dann von Deinem Click-Event so verwendet werden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_FREEVCLCONTROL, Integer(Sender), 0);
end;
gruß, choose
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#9

Re: Selbstzerstörung eines Controls

  Alt 7. Nov 2003, 13:56
Hallo choose,

so hab ichs auch gemacht, ist halt nur ein wenig umständlicher.

@maximov: Was passiert bei deiner Methode der Button über Shortcut betätigt wird (da gibts ja kein OnMouseUp)
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Benutzerbild von maximov
maximov

Registriert seit: 2. Okt 2003
Ort: Hamburg
548 Beiträge
 
Delphi 2005 Professional
 
#10

Re: Selbstzerstörung eines Controls

  Alt 7. Nov 2003, 21:54
Wenn der aufruf per shortcut gemacht wird, gehe ich davon aus, dass du actions oder der gleichen beuntzt. Da actions aber keine visuellen componenten sind haben sie auch keine parent-suizid probleme ...weil sie als parent höchstens das formular haben.

mfg. mäxmov.


PS: @Choose: das mit dem 'WM_FREEVCLCONTROL' muss ich mir merken!
  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 01:21 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