AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Panels dynamisch erzeugen -> Ungültige Zeigeroperation
Thema durchsuchen
Ansicht
Themen-Optionen

Panels dynamisch erzeugen -> Ungültige Zeigeroperation

Ein Thema von mika · begonnen am 26. Nov 2004 · letzter Beitrag vom 26. Nov 2004
Antwort Antwort
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#1

Panels dynamisch erzeugen -> Ungültige Zeigeroperation

  Alt 26. Nov 2004, 10:57
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
:: don't Panic ::
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio

  Alt 26. Nov 2004, 12:13
Ihhhh, Konstruktor und Destruktor anders nennen, als Create oder Destroy???
Sorry, aber das musste raus!

Versuch das ganze lieber über ne TList, als über dieses Array-Gedöns.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio

  Alt 26. Nov 2004, 12:27
Nenn den Destruktor Destroy und rufe zum Freigeben die Methode Free von TObjekt auf.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#4

Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio

  Alt 26. Nov 2004, 12:36
Ein kleiner Hinweis, wenn wir uns schon beim objekt-orientierten Programmieren befinden:
Zitat:
Code:
var
  myLKW : Array OF TMyLKWObjekt;
Benutze TObjectList.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
Taweluki

Registriert seit: 26. Nov 2004
2 Beiträge
 
#5

Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio

  Alt 26. Nov 2004, 13:10
TObjectList ist die beste Wahl, sonst macht man noch Fehler wie den folgenden:

Zitat von mika:
Code:
    max := Length(myLKW);
    For I := max Downto 0 do
    begin
      myLKW[i].myDestroy;
      sleep(100);
    end;
Length() liefert die Anzahl der Elemente, diese ist bei offenen Arrays aber um eins größer als der höchste zulässige Index (anders als bei den mit Index 1 beginnenden Strings, wo Length den Index des letzten Zeichens liefert). Mit myLKW[Lenght(myLKW)] greifst du fröhlich auf uninitialisierten bzw. ungültigen Speicher zu. Ersetze Length(myLKW) durch High(myLKW) und gut ist.

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.
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#6

Re: Panels dynamisch erzeugen -> Ungültige Zeigeroperatio

  Alt 26. Nov 2004, 14:29
Aloa an alle und danke für eure Antworten



Zitat von Stevie:
Ihhhh, Konstruktor und Destruktor anders nennen, als Create oder Destroy???
die heissen ja auch MYcreate und MYdestroy



Zitat von Luckie:
Nenn den Destruktor Destroy und rufe zum Freigeben die Methode Free von TObjekt auf.
probier ich gleich mal aus.

Zitat von Sprint:
Ein kleiner Hinweis, wenn wir uns schon beim objekt-orientierten Programmieren befinden:
Zitat:
Code:
var
  myLKW : Array OF TMyLKWObjekt;
Benutze TObjectList.
kenn ich leider nicht

Zitat von Taweluki:
TObjectList ist die beste Wahl, sonst macht man noch Fehler wie den folgenden:

Length() liefert die Anzahl der Elemente, diese ist bei offenen Arrays aber um eins größer als der höchste zulässige Index (anders als bei den mit Index 1 beginnenden Strings, wo Length den Index des letzten Zeichens liefert). Mit myLKW[Lenght(myLKW)] greifst du fröhlich auf uninitialisierten bzw. ungültigen Speicher zu. Ersetze Length(myLKW) durch High(myLKW) und gut ist.
Ja aber wenn ich High nehme dann hat er im fenster das vorletzte element des arrays gelöscht.
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
:: don't Panic ::
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:31 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz