Dynamische Objecte Zerstören

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Dynamische Objecte Zerstören

Beitrag von hendy »

So ich hab wieder ein Problem :)
Mein Programm erzeugt dynamisch Panels (Ja das muss dynamisch sein!)
Und zwar so

Code: Alles auswählen

quad: array[0..100] of TPanel;
{...}
quad[i]:=TPanel.Create(Preview);
 with quad[i] do
 begin
 parent:=Preview;
 Top:=Ybar.Position*5;
 Left:=Xbar.Position*5;
 Width:=wbar.Position*5;
 Height:=HBar.Position*5;
 Visible:=true;
 Hint:='Object Number '+inttostr(i);
 Showhint:=true;
end;
Ea ist so alles richtig, funktioniert auch.
Jetzt will ich aber auch welche wieder löschen, dazu hab ich auf Form1 einen neuen Button eingefügt

Code: Alles auswählen

Freeandnil(quad[Objectnumber.Value])
Objectnumber ist ein TSpinEdit Element und es ging auch gut so, nur dachte ich es währe einfacher das dynamisch in die TPanels einzufügen 8)

Code: Alles auswählen

with quad[i] do
Onclick:=Freeandnil(self);
Der Compiler meckert aber,

Code: Alles auswählen

Error: Incompatible types: got "untyped" expected "<procedure variable type of procedure(TObject) of object;Register>"
Kann mir wer sagen, wie ich das sonst machen soll? :|
Hab auf die Meldung eine procedure erstellt

Code: Alles auswählen

procedure DeleteObject(Sender:TObject);
begin
 Sender.Free;
end;
und

Code: Alles auswählen

Onclick:=DeleteObject(TPanel);
Nur der Compiler meldet immernoch einen Fehler, Das er eine Class of Tpanel bekommt, aber TObject will.
Also hab ich ihm

Code: Alles auswählen

Onclick:=DeleteObject(TObject);
gegeben und jetzt will der TObject haben bekommt aber Class of Tobject. :evil:
Jetzt kapier ich garnix mehr, deshalb frag ich hier nach, wie ich dynamisch Funktionen zuweisen kann (oder noch besser: gleich löschen)
Danke schonmal :mrgreen:
Dankt monta !!

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Dynamische Objecte Zerstören

Beitrag von Patito »

Also:
1) Du schreibst.
quad := TPanel.Create(Preview);

Das sagt, dass sich Preview um das zerstören des Panels kümmern soll, was Du ja nicht willst.
Richtig wäre also:

quad := TPanel.Create(nil);

2) quad.Onclick:=Freeandnil(self);
Eventhandler erwarten immer, dass die Methode als ersten Parameter ein (Sender: TObject) ist.
Du liegst also schon mal richtig mit deiner
procedure DeleteObject(Sender:TObject);

3) Onclick:=DeleteObject(TPanel);
Woher soll er jetzt wissen welches Panel gemeint ist?
Das sieht für den Compiler so aus, als ob Du alles was irgendwie TPanel ist zerstören willst.

4) So geht das nicht.
Sender.Free;
ist eine ganz doofe Idee. Die Komponente, die den ButtonClick verursacht hat wird dadurch mitten in ihrer
eigenen Eventbehandlung freigegeben. Was ziemlich übel ist, da sich Komponenten z.B. gerne nochmal nach einer
Eventbehandlung noch mal selbst kurz aktualisieren oder neu zeichnen wollen. Sowas kann eigentlich nur
zu einem AV führen...

Dein DeleteObject() muß irgendwoher noch mitkriegen was es eigentlich löschen soll. Z.B:

procedure DeleteObject(Sender:TObject);
begin
Freeandnil(quad[Objectnumber.Value]);
end;

5) Nochwas zur Namenskonvention:
Das SpinEdit nur Objectnumber zu nennen macht den Code sehr unklar. Nenn es doch wenigstens
SpinEditObjectnumber, dann weiss man im Code auch worum es sich handelt.

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Dynamische Objecte Zerstören

Beitrag von hendy »

ok danke, werde es mal ausprobieren
Aber was soll ich jetzt dem Onclick zuweisen?
mit

Code: Alles auswählen

Onclick:=DeleteObject(TObject);
gibt er sich nicht zufrieden :(
Dankt monta !!

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamische Objecte Zerstören

Beitrag von theo »

hendy hat geschrieben:

Code: Alles auswählen

Onclick:=DeleteObject(TObject);

Code: Alles auswählen

quad[i].Onclick:=@DeleteObject;
 
procedure DeleteObject(Sender:TObject);
begin
  Application.ReleaseComponent(TComponent(Sender));
end;

hendy
Beiträge: 80
Registriert: Sa 11. Apr 2009, 17:01
OS, Lazarus, FPC: Windoof (L 0.9.26 FPC 2.2.2)
CPU-Target: 32Bit

Re: Dynamische Objecte Zerstören

Beitrag von hendy »

ok danke sehr
Dankt monta !!

Antworten