Entwickler-Ecke

Multimedia / Grafik - OnClick-Event bei dem der Button gelöscht wird


Pesse - So 18.01.04 00:07
Titel: OnClick-Event bei dem der Button gelöscht wird
Hi zusammen

Ich habe folgendes Problem:

Ich erstelle zur Laufzeit einen Button 'Start'. Dieser hat ein onClick-Event 'createNewNavi'.
Dieses Event allerdings löscht den sendenden Button 'Start' und setzt später einen neuen. Ich bekomme nun immer wieder Zugriffsverletzungen.
Was kann ich da tun? Bzw. liegen die Fehler vielleicht wo anders?

Gruß Pesse


Michael Stenzel - So 18.01.04 01:09

Hi Pesse.

Soweit wie ich Dich verstanden habe löscht Du den Start-Button im ereignis desselbigen. Das kanst Du so nicht machen, weil du die Ereignismethode gleich mit löscht. Setze doch die Eigenschaft Visible des Button auf false und anstatt immer einen neuen Start-Button zu erstellen setzt Du dann die Visible-Eigenschaft wieder auf True.

mfg
Michael.


toms - So 18.01.04 01:11

Hi,

Die Delphi Hilfe schreibt, dass man ein Objekt nicht in einem Ereignis
Handler freigeben sollte (Wegen Speicher Allozierung)

Eine Workaround bietet eine benutzerdef. Nachricht, welche im
OnClick Ereignis an die Form geschickt wird und in einem Handler
behandelt wird, indem man dort das Objekt freigibt.

Beispiel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
const
  MyFreeButtonMsg = WM_USER + 101;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
      MyButton: TButton;
      // OnClick handler
      procedure ButtonClickHandler(Sender: TObject);
      // MyFree handler
      procedure MyFreeButtonMsgHandler( var Msg :TMessage );  message MyFreeButtonMsg;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MyFreeButtonMsgHandler(var Msg :TMessage);
begin
  TButton(Msg.WParam).Free;
end;

procedure TForm1.ButtonClickHandler(Sender: TObject);
begin
  PostMessage(Handle, MyFreeButtonMsg, Integer(Sender), 0);
end;

procedure TForm1.FormCreate(Sender: TObject); 
begin
  MyButton := TButton.Create(Self);
  MyButton.Parent := Self;
  MyButton.Name := 'MeinButton';
  MyButton.Caption := 'Mein Button';
  MyButton.SetBounds(20, 20, 80, 40);
  MyButton.OnClick := ButtonClickHandler;
end;


Pesse - So 18.01.04 01:47

Danke sehr!
Der Workaround hilft mir doch schon sehr weiter!

Gruß Pesse


Pesse - So 18.01.04 11:11

Hi, hab nochmal ein Problem mit dem Workaround:

Ich habe die Event-Funktion, die den Button löschen soll in einer eigenen Klasse, TNavi.
Irgendwie verstehe ich das mit dem 'Handle' in der Message nicht so genau. Könnte mir das vielleicht jemand erklären.

Ach ja - ich bin ziemlicher Delphi-Noob.

Gruß Pesse