![]() |
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; |
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? |
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 19:56 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