Toon posts:

[DELPHI] Freeen van owner.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo;

Ik heb een panel met daarop een TButton. Nu wil ik ervoor zorgen datals ik op die knop druk, dat dan het panel waar de knop opstaat wordt verwijderd en dus ook de knop zelf. Als ik dit echter doe dan krijg ik steeds een accessviolation! Hieronder een voorbeeldje die ik even snel gemaakt heb waarin ik die accessviolation krijg (alleen relevante code). De code is volledig nutteloos maar is even als voorbeeld bedoeld:

procedure TForm1.FormCreate(Sender: TObject);
var
TestButton: TButton;
begin
TestButton := TButton.Create(Panel1);
TestButton.Caption := 'Verwijder mij!!';
TestButton.OnClick := DeletePanel;
Panel1.InsertControl(TestButton);
end;

procedure TForm1.DeletePanel(Sender: TObject);
begin
TButton(Sender).Parent.Free;
end;

end.

(Het panel wordt, inclusief knop wel verwijderd maar ik krijg dus die accessviolation |:( )

  • MPEG
  • Registratie: Oktober 2000
  • Laatst online: 21-10-2020
En als je eerst de button een free geeft?

Kan ook zijn dat het niet mag omdat de button nog bezig is met het afhandelen van een event

AMD 64 X2 4800+ @2,41Ghz,
2048MB DDRRAM,
ATI X800GTO,
2x Samsung 930BF 19" TFT


  • MPEG
  • Registratie: Oktober 2000
  • Laatst online: 21-10-2020
Je moet in ieder geval de button als volgt aanmaken:
code:
1
2
   btnNieuweKnop := btnNieuweKnop.Create(pnlPaneel);
   btnNieuweKnop.Parent := pnlPaneel;

AMD 64 X2 4800+ @2,41Ghz,
2048MB DDRRAM,
ATI X800GTO,
2x Samsung 930BF 19" TFT


Verwijderd

Na het afhandelen van een OnClick event van een component wordt nog meer code van dat component uitgevoerd. [zie VCL source]

Als je in de OnClick event van een component het component zelf free-t [zoals je nu doet] krijg je dan dus een access violation.

Oplossing: verstuur een message naar je zelf, dmv PostMessage, als je dit bericht ontvangt free je de objecten de je wilt free-en. Hierdoor zal eerst alle code van het component uitgevoerd worden als je op de button clickt, en hierna pas dit component gefree-d worden

Verwijderd

Topicstarter
Inderdaad, DiFool, als de Button zichzelf verwijderd wordt er nog code afgehandeld van dat component. Je uitleg is me echter een beetje onduidelijk. Wat bedoel je precies met het sturen van een message naar jezelf?

Verwijderd

Probeer dit maar 's:
code:
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
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

const
  CM_TEST = WM_USER +1;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    procedure CMTest(var Message: TMessage); message CM_TEST;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostMessage(Handle, CM_Test, 0, 0);
end;

procedure TForm1.CMTest(var Message: TMessage);
begin
  Button1.Free;
end;

end.
Pagina: 1