Autor Beitrag
Pesse
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 18.01.04 00:07 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 133


D3 Prof, D7 PE
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1099
Erhaltene Danke: 2



BeitragVerfasst: 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:

ausblenden volle Höhe 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: So 18.01.04 01:47 
Danke sehr!
Der Workaround hilft mir doch schon sehr weiter!

Gruß Pesse
Pesse Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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