![]() |
Panels dynamisch erzeugen -> Ungültige Zeigeroperation
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:
Die Klasse
const
myLKWBreite = 175; myLKWHoehe = 350; myLKWAbstand = 10; var myLKW : Array OF TMyLKWObjekt;
Code:
Konstruktor / Destruktor
TMyLKWObjekt = class(TPanel)
(* Konstruktor / Dekonstruktor *) Constructor myCreate(lkwID: Integer); Destructor myDestroy; (* private deklaration *) private id: Integer; (* oeffentliche deklaration *) public end;
Code:
Code zum erzeugen der Panels - Klappt auch ganz wunderbar
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:
Schleife zum freigeben der Panels - Bei Setlength und bei myLKW := Nil gibts den error
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;
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 |
Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio
Ihhhh, Konstruktor und Destruktor anders nennen, als Create oder Destroy??? :shock:
Sorry, aber das musste raus! :lol: Versuch das ganze lieber über ne TList, als über dieses Array-Gedöns. :wink: |
Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio
Nenn den Destruktor Destroy und rufe zum Freigeben die Methode Free von TObjekt auf.
|
Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio
Ein kleiner Hinweis, wenn wir uns schon beim objekt-orientierten Programmieren befinden:
Zitat:
|
Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio
TObjectList ist die beste Wahl, sonst macht man noch Fehler wie den folgenden:
Zitat:
Und die Variable max kannst du dir eigentlich auch sparen, der Compiler optimiert die höchstwahrscheinlich sowieso weg. for i := High() downto 0 do... ist besser lesbar als for i := max downto 0 do..., weil man nicht erst nachsehen muss, was "max" eigentlich ist. Gilt natürlich nicht, wenn die Berechnung von max kompliziert ist oder max öfter als einmal benötigt wird. |
Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio
Aloa an alle und danke für eure Antworten :)
Zitat:
Zitat:
Zitat:
Zitat:
was ich auch recht seltsam fand. Ich war an der Stelle grade am testen da ich den gesagten fehler bekomme... aber ich probier das gleich mal aus und meld mich dann nachher hier wieder. michel |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz