![]() |
Treviw in Ini incl. DataEigenschaft sichern
Hallo,
im Forum ist eine tolle Beschreibung wie ich die Knoten eines Treevies sicher. ![]() Leider sehe ich derzeit keine Möglichkeit die DataEigenschaft auch zu sichern. Hat hier jemand eine Idee, Empfehlung ?? mfg Tom |
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:
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:
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;
Delphi-Quellcode:
Grüße vom marabu
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; |
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Freeware" nach "VCL / WinForms / Controls" verschoben.
Ist keine Programmvorstellung |
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 ![]() Greetz alcaeus |
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:
[edit=alcaeus]Delphi-Tags korrigiert. Mfg, alcaeus[/edit]
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; |
Re: Treviw in Ini incl. DataEigenschaft sichern
Hallo,
habs dann doch noch gelöst. Zitat:
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:
[edit=alcaeus]Wieder Delphi-Tags korrigiert. Zu jedem oeffnenden Tag gehoert auch ein schliessendes ;) Mfg, alcaeus[/edit]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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz