Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
961 Beiträge
 
#1

Fehlerhafter Zugriff auf NodeData von VirtualStringTree

  Alt 13. Mär 2017, 18:09
Ich mache grade meine ersten Schritt mit dem VirtualStringTree. Das Konzept ist ja nicht wirklich schlecht.
Nun bin ich aber auf ein Problem gestoßen, bei dem ich nicht wirklich weiter komme.

Ich will Dateien per Drag-and-Drop erfassen und für die weitere Verwendung erst mal ein einem VirtualStringTree darstellen. Das klapp auch sehr gut. Für die Daten die zu den Dateien gehören erstelle ich mir ein Objekt mit den Properties, die ich brauche. Auch keine Problem.
Jetzt will ich in einem Formular dem Anwender die Möglichkeit geben, diese Properties noch zu ändern, damit die weitere Verarbeitung individueller wird.
Aber wenn ich dann auf mein Datenobjekt zugreife, bekomme ich recht merkwürdige Daten, die Teilweise dann zu einer Exception führen.

Hier mal ein bischen Code:

Das Datenobject:
Delphi-Quellcode:
  TTreeData = class
  private
    FFilename: string;
    FIconIndex: Integer;
    FDokumentenType: TDokumentenTyp;
    FFGST: Boolean;
    FTermin: Boolean;
    FKennzeichen: Boolean;
    FFiletype: string;
    FDebitor: Boolean;
    FFGSTText: string;
    FKennzeichenText: string;
    FDebitorText: string;
    procedure SetDebitor(const Value: Boolean);
    procedure SetDokumentenType(const Value: TDokumentenTyp);
    procedure SetFGST(const Value: Boolean);
    procedure SetFiletype(const Value: string);
    procedure SetKennzeichen(const Value: Boolean);
    procedure SetTermin(const Value: Boolean);
    procedure SetDebitorText(const Value: string);
    procedure SetFGSTText(const Value: string);
    procedure SetKennzeichenText(const Value: string);
  public
    constructor Create(const AFilename: string; const Kennzeichen, FGST, Debitor, Termin: Boolean; const KennzeichenText, FGSTText, DebitorText: string; const DokumentenTyp: TDokumentenTyp);
    destructor Destroy; override;
    property IconIndex: Integer read FIconIndex write FIconIndex;
    property Filename: string read FFilename write FFilename;
    property Filetype: string read FFiletype write SetFiletype;
    property Kennzeichen: Boolean read FKennzeichen write SetKennzeichen;
    property KennzeichenText: string read FKennzeichenText write SetKennzeichenText;
    property FGST: Boolean read FFGST write SetFGST;
    property FGSTText: string read FFGSTText write SetFGSTText;
    property Debitor: Boolean read FDebitor write SetDebitor;
    property DebitorText: string read FDebitorText write SetDebitorText;
    property Termin: Boolean read FTermin write SetTermin;
    property DokumentenType: TDokumentenTyp read FDokumentenType write SetDokumentenType;
  end;
Das erstellen von Nodes:
Delphi-Quellcode:
var
  node: PVirtualNode;
  I: Integer;
begin
  for I := 0 to Files.Count-1 do
  begin
    node:=vrtlstrngtr1.AddChild(nil, TTreeData.Create(Files[i], chk_kennzeichen.Checked, chk_vin.Checked, chk_debitor.Checked, chk_termin.Checked, edt_kennzeichen.Text, edt_vin.Text, edt_debitor.Text, TDokumentenTyp(rg_dokumententyp.ItemIndex)));
  end;
Dazugehörig der Constructor von TTreeData:
Delphi-Quellcode:
constructor TTreeData.Create(const AFilename: string; const Kennzeichen, FGST, Debitor, Termin: Boolean; const KennzeichenText, FGSTText, DebitorText: string; const DokumentenTyp: TDokumentenTyp);
begin
  FFilename := AFilename;
  FKennzeichen:=Kennzeichen;
  FKennzeichenText:=KennzeichenText;
  FFGST:=FGST;
  FFGSTText:=FGSTText;
  FDebitor:=Debitor;
  FDebitorText:=DebitorText;
  FTermin:=Termin;
  FDokumentenType:=DokumentenTyp;
  FIconIndex := -1;
end;
Bis hier hin läuft das sehr gut und vor allem Fehlerfrei.

Das VirtualStringTree liegt auf einem Formular, wo der Anwender dann die Properties zu den TTreeData-Objekten einstellen können soll.
Das geschieht folgendermaßen:
Delphi-Quellcode:
  if vrtlstrngtr1.TotalCount>0 then
  begin
    Node := vrtlstrngtr1.GetFirst();
    if (vrtlstrngtr1.SelectedCount=vrtlstrngtr1.TotalCount) or (vrtlstrngtr1.SelectedCount=0) then
    begin
      while Assigned(Node) do
      begin
        Data := vrtlstrngtr1.GetNodeData(Node);
        Data.Kennzeichen:=chk_kennzeichen.Checked;
        Data.KennzeichenText:=edt_kennzeichen.Text;
        Data.FGST:=chk_vin.Checked;
        Data.FGSTText:=edt_vin.Text;
        Data.Debitor:=chk_debitor.Checked;
        Data.DebitorText:=edt_debitor.Text;
        Data.DokumentenType:=TDokumentenTyp(rg_dokumententyp.ItemIndex);
        Node := vrtlstrngtr1.GetNext(Node);
      end;
    end else begin
      while Assigned(Node) do
      begin
        if vrtlstrngtr1.Selected[Node] then
        begin
          Data := vrtlstrngtr1.GetNodeData(Node);
          Data.Kennzeichen:=chk_kennzeichen.Checked;
          Data.KennzeichenText:=edt_kennzeichen.Text;
          Data.FGST:=chk_vin.Checked;
          Data.FGSTText:=edt_vin.Text;
          Data.Debitor:=chk_debitor.Checked;
          Data.DebitorText:=edt_debitor.Text;
          Data.DokumentenType:=TDokumentenTyp(rg_dokumententyp.ItemIndex);
        end;
        Node := vrtlstrngtr1.GetNext(Node);
      end;
    end;
    vrtlstrngtr1.Refresh;
  end;
Hier treten nun Fehler auf. Im Debugger kann ich sehen, dass z.B. im TreeData.Filename beim Hinzufügen der Nodes der korrekte Dateiname steht.
Wenn ich aber wieder darauf zugreife (siehe letzter Codeabschnitt), dann bekomme einen gänzlich anderen Speicherbereich, der in das TreeData-Objekt geladen wird. Und das knallt.

Da ich zum ersten mal mit VirtualStringTree arbeite bin ich mir nicht ganz sicher, ob ich richtig auf die Daten zugreife. Also meine Frage: Wo mache ich den Fehler?

Gruß Hobbycoder
  Mit Zitat antworten Zitat