Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Stringlist in Record (https://www.delphipraxis.net/63325-problem-mit-stringlist-record.html)

Thorben86 16. Feb 2006 23:54


Problem mit Stringlist in Record
 
Hi, ich hab ein Problem, und zwar crasht die unten folgende Procedure mit der Meldung "Lesefehler in Adresse...", wenn ich versuche der Stringlist im record List einen string hinzuzufügen(habs auch mit add('muh') versucht -> gleiches Resultat.)
Ich verstehe jedoch nicht warum, da das erhöhen der anzahl im Record List in der darauffolgenden Zeile funktioniert. Für mich macht es den Anschein, alls ob die Stringlist im Record nicht initialisiert wäre, jedoch initialisieren sich delphi-eigene-Klassen doch selbst, oder?
Merkwürdig ist auch, das zIndex = 4 ist (direkt nachdem er in die Procedure reingegangen ist). Jedoch verwendet er in den Puntearray[...]-zeilen den Index korrekt, also zwischen 1-3, was man durch die zuordnung der Ergebnisse ins netzarray zu erkennen ist. Wenn ich die Procedure durchgehe hat zIndex die Werte 4-1, also er fängt bei 4 an und geht dan runter.

Hoffe irgendeiner kann mir hier helfen. Auch ein Listarray[Listcount].Punkt.Create; konnte nicht helfen.

sry für den etwas unübersichtlichen Code, wollte ihn aber so posten, wie er zur Zeit ist, falls ich irgendetwas übersehen hab.

Delphi-Quellcode:
 const
  max = 10;

  type TPunkt = record
  Punkt : TPoint;
  linked : boolean;
  bindung : array[0..3] of integer;
  vor : integer;
  end;

  type List = record
  Anzahl : integer;
  Punkt : TStringlist;
  end;

var
  Netzarray : array [0..max,0..max] of Single;+
  Punktearray : array[0..max] of TPunkt;
  Listarray : array[0..max] of List;
  anzahl : integer;    
  Listcount : integer;
Delphi-Quellcode:
Aufruf:
procedure TForm1.Button3Click(Sender: TObject);
begin
abstand(0);
end;
Delphi-Quellcode:
function abstand(zPunkt:integer):single;
var zIndex : integer;
begin
   for zIndex := 0 to 3 do //abstand Punkt - Bindung
      if (Punktearray[zPunkt].bindung[zIndex] <> -1) then
       begin
          if (netzarray[zPunkt,Punktearray[zPunkt].bindung[zIndex]] = -1) then
             begin
                netzarray[zPunkt,Punktearray[zPunkt].bindung[zIndex]] := sqrt(sqr(Punktearray[zPunkt].punkt.x - Punktearray[ Punktearray[zPunkt].bindung[zIndex] ].Punkt.x) + sqr(Punktearray[zPunkt].punkt.x - Punktearray[ Punktearray[zPunkt].bindung[zIndex] ].Punkt.x));

                netzarray[ Punktearray[zPunkt].bindung[zIndex] , zPunkt ] := netzarray[zPunkt,Punktearray[zPunkt].bindung[zIndex]];

//Wenn ich die nachfolgende Zeile rausnehme klappt das ganze, andernfalls AV.
            Listarray[Listcount].Punkt.Add(inttostr(Punktearray[zPunkt].bindung[zIndex]));
            inc(Listarray[Listcount].anzahl);

                form1.ListBox1.Items.Add (inttostr(zPunkt)+'|'+inttostr(Punktearray[zPunkt].bindung[zIndex])+' : '+floattostr(netzarray[zPunkt,Punktearray[zPunkt].bindung[zIndex]]));
                Punktearray[zPunkt].linked := true;
          end;
           //Abruchbedingung
           if ( Punktearray[ Punktearray[zPunkt].bindung[zIndex]].linked = false ) then
              abstand(Punktearray[zPunkt].bindung[zIndex])
        else
          inc(Listcount);
        end;
end;

matthiasl 17. Feb 2006 02:16

Re: Problem mit Stringlist in Record
 
Hi,

dir ist hoffentlich klar, daß eine Variable vom Typ "TStringList" ein Zeiger auf eine Objekt-Struktur ist, die man erst Anlegen muß.

Im Gegensatz zu einem "Array[0..50] of String", muß man z.B. ein "Array of String" mit dem Befehl "SetLength" erst initialisieren. Eine Variable wie "xx:TStringList" muß man erst mit "xx:=tStringList.Create;" einrichten.

...und wenn man nicht ein großes Speicherproblem haben möchte, muß man eine StringList (im Gegensatz zu einem Array) nach dem letzten Gebrauch auch wieder Freigeben mit "xx.Free;".

War das hilfreich?

Thorben86 17. Feb 2006 13:24

Re: Problem mit Stringlist in Record
 
Danke, so geht es. :angel2:

Wobei ich allerdings immer noch nicht verstehe, warum der eine Laufvariable, die man verwendet, runterlaufen lässt, da intern die Variable so ja 2 mal vorhanden sein müsste, womit der Effekt des überprüfens auf nil nicht mehr vorhanden wäre?


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 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