Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi VirtualStringTree Daten kopieren und speichern (https://www.delphipraxis.net/186094-virtualstringtree-daten-kopieren-und-speichern.html)

Alter Mann 3. Aug 2015 09:20

VirtualStringTree Daten kopieren und speichern
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo,

ich kopiere je nach Auswahl Daten von einem VST in ein anderes VST(siehe Bild).
Delphi-Quellcode:
procedure  TSourceButtonPanel.DataFromSourceToTarget(All  : Boolean);
var
  NE         : TVTVirtualNodeEnumerator;
  SourceData : PNodeData;
  DestData   : PNodeData;
begin
  if (Assigned(FSourceView) and Assigned(FTargetView)) then
  begin
    if All then FSourceView.SelectAll(true);
    NE := FSourceView.SelectedNodes(false).GetEnumerator;
    while NE.MoveNext do
    begin
      SourceData := FSourceView.GetNodeData(Ne.Current);
      DestData  := FTargetView.GetNodeData(FTargetView.AddChild(nil));
      CopyNodeData(DestData, SourceData);
    end;
    FSourceView.DeleteSelectedNodes;
  end;
end;
Da die Datensätze im unteren VST angezeigt werden, scheint das ganze zu funktionieren.
Nur funktioniert das Speichern nicht:(
Delphi-Quellcode:
procedure TToolIniLoader.WriteFile;
var
  Node : PVirtualNode;
  Data : PNodeData;
begin
  FEntryCount := 0;
  FVST.BeginUpdate;
  Node := FVST.GetFirst();
  while Node <> nil do
  begin
    Data := FVST.GetNodeData(Node);
    NodeDataToIni(Data^);
    Node := FVST.GetNext(Node);
    Inc(FEntryCount);
  end;
  FVST.EndUpdate;
end;
Data ist zwar ungleich NIL, aber leer. Nachdem Zugriff sind im VST die Nodes zwar noch da, aber GetText bringt nur ''.

Kennt jemand das Problem und/oder die Lösung?

Alter Mann 6. Aug 2015 18:53

AW: VirtualStringTree Daten kopieren und speichern
 
Habe ich etwas verbrochen?

Sir Rufo 6. Aug 2015 19:13

AW: VirtualStringTree Daten kopieren und speichern
 
Ja, du verschweigst uns, wie
Delphi-Quellcode:
TNodeData
deklariert ist :stupid:

Ich vermute mal ein Record mit
Delphi-Quellcode:
string
Feldern. Da könnte auch das Problem liegen, wenn das beim
Delphi-Quellcode:
CopyNodeData
nicht berücksichtigt wird.

Alter Mann 7. Aug 2015 04:10

AW: VirtualStringTree Daten kopieren und speichern
 
Moin, Moin,

erwischt:oops:

Die Vermutung trifft ins Schwarze:wink:

Delphi-Quellcode:
  PNodeData = ^TNodeData;
  TNodeData = record
  begin
    EntryName            : String;
    Aliasname            : String;
    Category             : TCategory;
    Datatype             : TDataType;
    Description          : String;
    DisplayName          : String;
    Enabled              : Boolean;
    OSFamily             : TOSFamily;
    Remarks              : TStringList;
    Searchstr            : TStringList;
    Usertype             : TUserType;
  end;

...

procedure  TSourceButtonPanel.CopyNodeData(var  Destination : PNodeData;
                                            const Source     : PNodeData);
begin
  with Destination^ do
  begin
    EntryName            := Source^.EntryName;
    Aliasname            := Source^.Aliasname;
    Category             := Source^.Category;
    Datatype             := Source^.Datatype;
    Description          := Source^.Description;
    DisplayName          := Source^.DisplayName;
    Enabled              := Source^.Enabled;
    OSFamily             := Source^.OSFamily;
    if (Assigned(Source^.Remarks) and (Source^.Remarks.Count > 0)) then
    begin
      Remarks            := TStringList.Create;
      Remarks.AddStrings(Source^.Remarks);
    end;
    if (Assigned(Source^.Searchstr) and (Source^.Searchstr.Count > 0)) then
    begin
      Searchstr          := TStringList.Create;
      Searchstr.AddStrings(Source^.Searchstr);
    end;
    Usertype             := Source^.Usertype;
  end;
end;
Sicherlich gibt es noch mehr Felder, aber die Datentypen sind abschließend.
Die Typen TCategory, TDataType, TOSFamily, TUserType sind normale Enums.

Was mich bei der gazen Sache wurmt ist, dass die Einträge zwar kopiert und angezeigt werden,
aber in WriteFile(siehe Anhang Pos #1) Leer sind.

Sir Rufo 7. Aug 2015 05:18

AW: VirtualStringTree Daten kopieren und speichern
 
Zum einen ist das
Delphi-Quellcode:
var
in
Delphi-Quellcode:
CopyNodeData
... unsinnig. Der Pointer wird doch in der Methode nicht verändert und soll (darf) nicht geändert werden. Das dokumentiert man mit
Delphi-Quellcode:
CopyNodeData( const Source, Dest: PNodeData );
.

Jetzt zu den Strings, ich bin mir nicht sicher, ob hier das Reference-Counting der Strings auch korrekt behandelt wird. Denn dann passiert genau das, was du beobachtest.

Du siehst den Text in der Anzeige, weil zum Zeitpunkt der Anzeige sind die alten Nodes noch nicht gelöscht. Dann schmeisst du die raus und die Strings wandern in Nirwana ab.

Alter Mann 7. Aug 2015 06:21

AW: VirtualStringTree Daten kopieren und speichern
 
Also am
Code:
const
lag es nicht.
Zitat:

Jetzt zu den Strings, ich bin mir nicht sicher, ob hier das Reference-Counting der Strings auch korrekt behandelt wird. Denn dann passiert genau das, was du beobachtest.
Geht das etwas genauer, oder andersherum gefragt, welche andere Möglichkeit wäre besser(
doch nicht etwa
Code:
SetString(var s: String; buffer : Pchar; len : Integer)
)?

[Edit]
Auf SetString umgestellt und am Ergbnis ändert sich: NICHTS
[/Edit]

Alter Mann 7. Aug 2015 19:39

AW: VirtualStringTree Daten kopieren und speichern
 
@Sir Rufo

Ich habe mir deine 'Vermutung' mal durch den Kopf gehen lassen,
(gefühlte 25T) Codezeilen umgestellt und siehe da: es geht:lol:

Die Lösung ist hier versteckt:thumb:

Danke


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