AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi VirtualStringTree Daten kopieren und speichern
Thema durchsuchen
Ansicht
Themen-Optionen

VirtualStringTree Daten kopieren und speichern

Ein Thema von Alter Mann · begonnen am 3. Aug 2015 · letzter Beitrag vom 7. Aug 2015
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

VirtualStringTree Daten kopieren und speichern

  Alt 3. Aug 2015, 10:20
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?
Miniaturansicht angehängter Grafiken
testdemo.png  
Angehängte Dateien
Dateityp: pas TestDemo.pas (1,8 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: VirtualStringTree Daten kopieren und speichern

  Alt 6. Aug 2015, 19:53
Habe ich etwas verbrochen?
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: VirtualStringTree Daten kopieren und speichern

  Alt 6. Aug 2015, 20:13
Ja, du verschweigst uns, wie TNodeData deklariert ist

Ich vermute mal ein Record mit string Feldern. Da könnte auch das Problem liegen, wenn das beim CopyNodeData nicht berücksichtigt wird.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo ( 6. Aug 2015 um 20:15 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: VirtualStringTree Daten kopieren und speichern

  Alt 7. Aug 2015, 05:10
Moin, Moin,

erwischt

Die Vermutung trifft ins Schwarze

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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: VirtualStringTree Daten kopieren und speichern

  Alt 7. Aug 2015, 06:18
Zum einen ist das var in CopyNodeData ... unsinnig. Der Pointer wird doch in der Methode nicht verändert und soll (darf) nicht geändert werden. Das dokumentiert man mit
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: VirtualStringTree Daten kopieren und speichern

  Alt 7. Aug 2015, 07:21
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]

Geändert von Alter Mann ( 7. Aug 2015 um 08:37 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: VirtualStringTree Daten kopieren und speichern

  Alt 7. Aug 2015, 20:39
@Sir Rufo

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

Die Lösung ist hier versteckt

Danke

Geändert von Alter Mann ( 7. Aug 2015 um 20:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:03 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