AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Treviw in Ini incl. DataEigenschaft sichern

Ein Thema von waldforest · begonnen am 11. Jun 2005 · letzter Beitrag vom 12. Jun 2005
Antwort Antwort
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#1

Treviw in Ini incl. DataEigenschaft sichern

  Alt 11. Jun 2005, 15:08
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Treviw in Ini incl. DataEigenschaft sichern

  Alt 12. Jun 2005, 08:39
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
  Mit Zitat antworten Zitat
12. Jun 2005, 08:40
Dieses Thema wurde von "alcaeus" von "Freeware" nach "VCL / WinForms / Controls" verschoben.
Ist keine Programmvorstellung
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#4

Re: Treviw in Ini incl. DataEigenschaft sichern

  Alt 12. Jun 2005, 08:46
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#5

Re: Treviw in Ini incl. DataEigenschaft sichern

  Alt 12. Jun 2005, 09:43
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]
  Mit Zitat antworten Zitat
waldforest

Registriert seit: 8. Mai 2005
366 Beiträge
 
Delphi XE3 Enterprise
 
#6

Re: Treviw in Ini incl. DataEigenschaft sichern

  Alt 12. Jun 2005, 10:59
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]
  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 02:42 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