Einzelnen Beitrag anzeigen

Benutzerbild von Tormentor32
Tormentor32

Registriert seit: 27. Okt 2005
Ort: Düsseldorf
369 Beiträge
 
Delphi XE5 Professional
 
#1

Problem mit einer Stringlist und Pointern

  Alt 11. Jan 2007, 08:00
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
Richard Mahr
  Mit Zitat antworten Zitat