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/)
-   -   Treviw in Ini incl. DataEigenschaft sichern (https://www.delphipraxis.net/47459-treviw-ini-incl-dataeigenschaft-sichern.html)

waldforest 11. Jun 2005 15:08


Treviw in Ini incl. DataEigenschaft sichern
 
Hallo,
im Forum ist eine tolle Beschreibung wie ich die Knoten eines Treevies sicher.

http://www.delphipraxis.net/internal...eeview+sichern

Leider sehe ich derzeit keine Möglichkeit die DataEigenschaft auch zu sichern.
Hat hier jemand eine Idee, Empfehlung ??
mfg Tom

marabu 12. Jun 2005 08:39

Re: Treviw in Ini incl. DataEigenschaft sichern
 
Hallo Tom,

die von dir gefundene Methode dient nur zum speichern einer äqivalenten Textdarstellung der Knotenbeschriftungen. Um da noch einen Integer-Wert aus TreeNode.Data dran zu hängen musst du doch wieder eine Schleife über alle Knoten laufen lassen und ein eigenes Zeilenformat erzeugen.

Delphi-Quellcode:
procedure TreeSave(tv: TTreeView; ini: TInifile; section: string);
const
  SEP = '#';
var
  i: integer;
  tn: TTreeNode;
begin
  tn := tv.Items.GetFirstNode;
  ini.EraseSection(section);
  while Assigned(tn) do begin
    ini.WriteString(section,
      IntToStr(tn.AbsoluteIndex),
      IntToStr(Integer(tn.Data)) + SEP + IntToStr(tn.Level) + SEP + tn.Text
    );
    tn := tn.GetNext;
  end;
end;
Oder du speicherst die Zahlenwerte aus TTreeNode.Data in einem eigenen Abschnitt der INI-Datei und fügst die Werte deinen Knoten später wieder hinzu:

Delphi-Quellcode:
procedure TreeDataSave(tv: TTreeView; ini: TInifile; section: string);
var
  i: integer;
  tn: TTreeNode;
begin
  tn := tv.Items.GetFirstNode;
  ini.EraseSection(section);
  while Assigned(tn) do begin
    ini.WriteString(section,
      'Node' + IntToStr(tn.AbsoluteIndex),
      IntToStr(Integer(tn.Data))
    );
    tn := tn.GetNext;
  end;
end;
Grüße vom marabu

DP-Maintenance 12. Jun 2005 08:40

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Freeware" nach "VCL / WinForms / Controls" verschoben.
Ist keine Programmvorstellung

alcaeus 12. Jun 2005 08:46

Re: Treviw in Ini incl. DataEigenschaft sichern
 
Moin ihrs,

es gibt ein anderes Problem: die Data-Eigenschaft ist zwar eigentlich nur ein Integer, aber ich kann durchaus einen Pointer reinschreiben, und so irgendein Objekt im Speicher referenzieren. Wenn ich diesen Integer-Wert aber speichere, und das Objekt nicht, dann wird meine Data-Property eines Items auf irgendeinen Speicherbereich zeigen, was bestimmt nicht gut ausgeht, da hoechstwahrscheinlich irgendwas anderes dort sein wird.
Was genau willst du speichern? Eventuell kannst du mit Hilfe der dpCollectiondpCollection das machen, was du willst. Du wirst aber wahrscheinlich nicht drum herum kommen, alles einzeln abzuspeichern.

Greetz
alcaeus

waldforest 12. Jun 2005 09:43

Re: Treviw in Ini incl. DataEigenschaft sichern
 
Hallo,
zuerst einmal vielen Dankf für die Tipps.
wie Andreas beschreibt reicht mir nicht, nur den Pointer zu sichern, ich benötige den Inhalt.

Was benötige ich ?

Ich baue mir über den Tree stufenweise eine Inventarnummer (String) zusammen, die es ermöglicht, in einem separaten Grid die Selektion zu verfeinern. Da der erste Aufbau relativ lange dauert, TreeView wird durch Auslesen einer großen Datei mit Teilstring der Inventarnummer. Da sich die Inhalte der Datei nicht ändern ist es sinnvoll, einmal diesen TreeView aufzubauen und anschließend aus einer INI.-Datei zu laden.
Das Wegschreiben in die Inidatei funtioniert sauber. Ich habe nun, ich denke ein Anfängerproblem, nur noch die Schwierigleit nach dem Lesen der Datei die Infos wieder dem entsprechenden Kontoen in die Datamethode zu schreiben.

mfg Thom

Delphi-Quellcode:
procedure TQueryForm.TreeToIni(Tree: TTreeView; INI: TIniFile; Section: string);
var
  n: integer;
  MS: TMemoryStream;
  tTv: TStringList;
  node : string;
begin
  tTv := TStringList.Create;
  MS := TMemoryStream.Create;

  try
    Tree.SaveToStream(MS);
    MS.Position := 0;
    tTv.LoadFromStream(MS);
    INI.EraseSection(Section);

    for n := 0 to tTv.Count - 1 do
        INI.WriteString(Section, 'Node' + IntToStr(n), StringReplace(tTv[n], #9,
        '#', [rfReplaceAll]));

    for n := 0 to tTv.Count - 1 do
    begin
       Tree.Select(Tree.Items[n]);
       node := STRING(TreeView1.Selected.data^);
       INI.WriteString(Section+'_Data', 'Data' + IntToStr(n), node);
    end;

  finally
    tTv.Free;
    MS.Free;
  end;
end;


procedure TQueryForm.TreeFromIni(Tree: TTreeView; INI: TIniFile; Section: string;
  Expand: boolean);
var
  n: integer;
  MS: TMemoryStream;
  tTv: TStringList;
  tTDat: TStringList;
  id :Pstring;
  node :TTReeNode;

begin
  tTv := TStringList.Create;
  tTDat := TStringList.Create;
  MS := TMemoryStream.Create;
  try
    INI.ReadSection(Section, tTv);
    for n := 0 to tTv.Count - 1 do
      tTv[n] := StringReplace(INI.ReadString(Section, tTv[n], ''), '#', #9,
        [rfReplaceAll]);

    tTv.SaveToStream(MS);
    MS.Position := 0;
    Tree.LoadFromStream(MS);
    if (Expand = True) and (Tree.Items.Count > 0) then
    begin
      Tree.Items[0].Expand(True);
      Tree.Items[0].MakeVisible;
    end;

   

    INI.ReadSection(Section+'_Data', tTDat);
    for n := 0 to tTDat.Count - 1 do
    begin
      Tree.Select(Tree.Items[n]);
      node := Tree.Selected;
      new(id);

////// Hier fehlt mir noch die Möglichkeit den Wert wieder in die Data-Methode zu bekommen. Sicher nur ne kleinigkeit, die einem "Anfänger" aber so seine Probleme macht.
      id^:= tTDat.Values[tTDat.Strings[n]];


      node.Data :=id;
    end;

  finally
    tTv.Free;
    tTDat.Free;
    MS.Free;
  end;
end;
[edit=alcaeus]Delphi-Tags korrigiert. Mfg, alcaeus[/edit]

waldforest 12. Jun 2005 10:59

Re: Treviw in Ini incl. DataEigenschaft sichern
 
Hallo,
habs dann doch noch gelöst.
Zitat:

(Manchmal sieht man die Bäume vor lauter Wald nicht mehr).
Geht bestimmt noch professioneller aber, hauptsache schnellund funktioniert.

Ich denke, im Forum wurde diese Herausforderung öfters formuliert. Von daher werden sich einige über die Lösung freuen.
Im Übrigen, das Laden des Trees ist wirklich super schnell.

Tom

Hier die Ergänzung, die ich glatt vergessen habe.
Delphi-Quellcode:

procedure TQueryForm.TreeFromIni(Tree: TTreeView; INI: TIniFile; Section: string;
  Expand: boolean);
var
  n: integer;
  MS: TMemoryStream;
  tTv: TStringList;
  tTDat: TStringList;
  id :Pstring;
  node :TTReeNode;
  feld :string;
begin
  tTv := TStringList.Create;
  tTDat := TStringList.Create;
  MS := TMemoryStream.Create;
  try
    INI.ReadSection(Section, tTv);
    for n := 0 to tTv.Count - 1 do
      tTv[n] := StringReplace(INI.ReadString(Section, tTv[n], ''), '#', #9,
        [rfReplaceAll]);

    tTv.SaveToStream(MS);
    MS.Position := 0;
    Tree.LoadFromStream(MS);
    if (Expand = True) and (Tree.Items.Count > 0) then
    begin
      Tree.Items[0].Expand(True);
      Tree.Items[0].MakeVisible;
    end;

    INI.ReadSection(Section+'_Data', tTDat);
    for n := 0 to tTDat.Count - 1 do
    begin
      Tree.Select(Tree.Items[n]);
      node := Tree.Selected;
      feld := tTDat.Strings[n];
      feld := INI.ReadString(Section+'_Data', feld, '');
      new(id);
      id^ := feld;
      node.Data :=id;
    end;

  finally
    tTv.Free;
    tTDat.Free;
    MS.Free;
  end;
end;
[edit=alcaeus]Wieder Delphi-Tags korrigiert. Zu jedem oeffnenden Tag gehoert auch ein schliessendes ;) Mfg, alcaeus[/edit]


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