Hallo an alle,
ich habe folgendes Problem beim dynamischen erzeugen und freigeben eines Objektes vom Typ TPanel.
Ich muss auf einer Scrollbox soviele Panels zeichnen wie Datensätze in einer Tabelle sind,
soweit alles ganz klar, aber beim freigeben der Panels bekomme ich eine "Ungültige Zeigeroperation".
Hier mal n bissle code:
Variablen
Code:
const
myLKWBreite = 175;
myLKWHoehe = 350;
myLKWAbstand = 10;
var
myLKW : Array OF TMyLKWObjekt;
Die Klasse
Code:
TMyLKWObjekt = class(TPanel)
(* Konstruktor / Dekonstruktor *)
Constructor myCreate(lkwID: Integer);
Destructor myDestroy;
(* private deklaration *)
private
id: Integer;
(* oeffentliche deklaration *)
public
end;
Konstruktor / Destruktor
Code:
Constructor TMyLKWObjekt.myCreate(lkwID: Integer);
Begin
// Erst mal das Hauptpanel erzeugen
Create (frmTourenplan.sbTouren);
Parent := frmTourenplan.sbTouren;
id := lkwID;
End;
Destructor TMyLKWObjekt.myDestroy;
Begin
// Ein LKW Objekt freigeben
Inherited Destroy;
End;
Code zum erzeugen der Panels - Klappt auch ganz wunderbar
Code:
procedure TfrmTourenplan.LkwPanelsErzeugen;
Var
i: integer;
links, oben: Integer;
begin
// Ggf. erst alte LKW's wieder freigeben
// Neue Lkw's anlegen
I := 0;
tblLKW.Refresh;
tblLkw.First;
SetLength(myLKW, tblLKW.RecordCount - 1);
Links := myLKWAbstand;
Oben := myLKWAbstand;
while not tblLkw.Eof do
begin
// LKW Panel erzeugen
myLKW[i] := TMyLKWObjekt.myCreate(i);
with myLKW[i] do
begin
// LKW Panel ausrichten
SetBounds(Links, Oben, myLKWBreite, myLKWHoehe);
// LKW Objekt mit Werten füllen
Caption := intToStr(I);
end;
// Werte Inkrementieren
inc(i);
If (Links + (myLKWBreite*2) + myLKWAbstand) > sbTouren.Width then
begin
Links := myLKWAbstand;
Inc(Oben, myLKWHoehe + myLKWAbstand);
end else
begin
Inc(Links, myLKWBreite + myLKWAbstand);
end;
tblLkw.Next;
end;
end;
Schleife zum freigeben der Panels - Bei Setlength und bei myLKW := Nil gibts den error
Code:
procedure TfrmTourenplan.LkwPanelsFreigeben;
Var
max, i: integer;
begin
IF myLKW <> nil then
begin
max := Length(myLKW);
For I := max Downto 0 do
begin
myLKW[i].myDestroy;
sleep(100);
end;
// Hier gibts den Fehler
SetLength(myLKW, 0);
// Oder hier wenn die Zeile hierdrüber ausdokumentiert wird
myLKW := NIL;
end;
end;
habt Ihr da vielleicht ne Idee?
Danke schonmal, michel