Hallo DPler!
Ich habe in meinem Programm folgendes vor: Ich will einen Stromkreis darstellen, der auch ineinander verschachtelte Parallel und Reihenschaltungen beimhalten kann, dazu habe ich mir folgendes überlegt:
Delphi-Quellcode:
// Ich habe zunächst meinen Typ TBauteil
type
TBauteil = Record
ID,Parent: string; // Jedes Bauteil hat eine eindeutige ID
Typ: TBauteilTyp;
Next: Array of PBauteil
end;
// und einen Pointertyp für TBauteil
PBauteil = ^TBauteil;
// Und zu guter Letzt noch meine Klasse für das verketten von Bauteilen
TBauteilListe=class(Tobject)
private
FRoot: PBauteil;
function GetBauteil(ID: string): PBauteil;
function GetLines: TStringlist;
procedure NilBauteile;
public
constructor Create;
destructor Destroy; override;
function AddBauteil(ID: string; Typ: TBauteilTyp; Parent: string): boolean;
property Items[ID: string]: PBauteil read GetBAuteil;
property Lines: TStringlist read GetLines;
end;
Jetzt habe ich ein Prozedur zum einfügen neuer Bauteile
Delphi-Quellcode:
function TBauteilListe.AddBauteil(ID: string; Typ: TBauteilTyp;
Parent: string): boolean;
var p: PBauteil;
begin
p := GetBauteil(Parent);
if p <> nil
then
begin
setlength(p^.Next,length(p^.Next)+1);
new(p^.Next[high(p^.next)]);
p^.Next[high(p^.next)]^.ID := ID;
p^.Next[high(p^.next)]^.Typ := Typ;
result := true;
end
else
result := false;
end;
// wobei GetBauteil so aussieht
function TBauteilListe.GetBauteil(ID: string): PBauteil;
procedure Rekursiv(p: PBauteil; Search: string; var result: PBauteil);
var i: integer;
begin
if p <> nil
then
if p^.ID = Search
then
result := p
else
if p^.Next <> nil
then
for i := low(p^.next) to high(p^.next) do
Rekursiv(p^.next[i],Search,p);
end;
begin
Result := nil;
Rekursiv(FRoot,ID,Result);
end;// Man Gibt also bei den Parent (also Vorgänger) des Einzufügenden Bauteils an, dann wird das Dynamische Array of Pointer um eins erweitert und ein Neues Bauteil eingefügt
Bis dahin klappts auch, aber bei dieser Methode knallts, weil die Stringlist leer ist, obwohl ich per Breakpoint gesehen habe, dass die Inhalte ewrkannt werden
Delphi-Quellcode:
function TBauteilListe.GetLines: TStringlist;
procedure Rekursiv(p: PBauteil; var Lst: TStringlist);
var i: integer;
begin
if p <> nil
then
begin
if p^.Next <> nil
then
for i := low(p^.next) to high(p^.next) do
begin
Rekursiv(p^.next[i],Lst);
end;
Lst.Add(p^.ID) // #1 Hier wird die ID hinzugefügt, was ich mit Breakpoint herausfand
end;
end;
var Lst: TStringlist;
begin
Lst := TStringList.Create;
Lst.Clear;
Rekursiv(FRoot,Lst);
Result := Lst; // Das Result ist leer, und list ist auch leer, obwohl an #1 mein Hinzugefügter EIntrag zu sehen ist
Lst.Free;
end;
Was mache ich bei der benutzung der Stringlist falsch? Daran wirds wohl liegen, denn der Fehler tritt genau dann auf, wenn er die Listbox1.Items setzt, und zwar auf das Result, das trotzdem nur den wert
Result = ()
Danke schonmal für die Hilfe!
Richard
Edit: Ich habe mal den Titel geändert, das Problem bezieht sich ja gar nicht auf die Pointer
Edit: Titel nochmals geändert, jetzt sinds doch Pointer