![]() |
brauche hilfe mit der VirtualTreeView.
Liste der Anhänge anzeigen (Anzahl: 1)
ja wie schon gesagt ich brauche hilfe mit der VirtualTreeView.
ich arbeite an einem language editor. es geht mir jetzt darum die kolumnen und die einträge in ein einzelne datei zu speichern/Laden. so zu sagen das Projekt speichern. was wäre die best lösung? vielleicht hat ja jemand ein code Snippet?
Delphi-Quellcode:
type
TLangData = record Text : Widestring; Name : Widestring; Ext : Widestring; end; // die kolumnen werden dynamisch erstellt TLangArray = array of TLangData; type PNodeData = ^TNodeData; TNodeData = record Level : Integer; ImageIndex : Integer; Identifirer : Widestring; Language : TLangArray; end; |
AW: brauche hilfe mit der VirtualTreeView.
Wenn ich mich recht erinnere hat der VTS die Methoden LoadFromFile und SaveToFile. Du musst dann nur noch das OnSaveNode Event implementieren.
|
AW: brauche hilfe mit der VirtualTreeView.
danke für dein antwort.
das hatte ich schon gemacht, doch leider speichert es nur die einträge. es sei denn, ich übersehe etwas,eine option oder soetwas. das problem ist dass das die kolumnen dynamisch erstellt werden und natürlich auch bewegt und gelöscht werden. sonst könnte ich die vordefinieren und somit wäre das problem meher oder weniger gelöst. |
AW: brauche hilfe mit der VirtualTreeView.
Neben den von mir genannten Methoden gibt es weiterhin LoadFromStream und SaveToStream. Die VST Komponente sorgt eigentständig dafür, dass die Hierachie der Nodes beibehalten bleibt und auch eventuelle CheckStates, etc. sollten automatisch gespeichert werden.
Die Columns kannst du einfach "per Hand" in den Stream speichern.
Delphi-Quellcode:
MS := TMemoryStream.Create;
try MS.WriteData(VST.Header.Columns.Count); for I := 0 to VST.Header.Columns.Count - 1 do begin // Write Column Name // Write Column Width // Write Column ... end; VST.SaveToStream(MS); MS.SaveToFile('C:\test.dat'); finally MS.Free; end;
Delphi-Quellcode:
MS := TMemoryStream.Create;
try MS.LoadFromFile('C:\test.dat'); MS.Position := 0; MS.ReadData(HeaderCount); for I := 0 to HeaderCount - 1 do begin Column := VirtualStringTree1.Header.Columns.Add; // Read Column Name // Read Column Width // Read Column ... end; VST.LoadFromStream(MS); finally MS.Free; end; |
AW: brauche hilfe mit der VirtualTreeView.
hi
nochmal danke fur deine hilfe. ich habe mich entschieden alles von hand zu machen. dazu benutze ich eine open source komponente von David J Butler ![]()
Delphi-Quellcode:
procedure WriteBuffer(const Buffer; const Size: Integer);
procedure WriteStrA(const Buffer: AnsiString); virtual; procedure WriteStrW(const Buffer: WideString); virtual; procedure WriteByte(const V: Byte); virtual; procedure WriteWord(const V: Word); virtual; procedure WriteLongWord(const V: LongWord); procedure WriteLongInt(const V: LongInt); procedure WriteInt64(const V: Int64); procedure WriteSingle(const V: Single); procedure WriteDouble(const V: Double); procedure WriteExtended(const V: Extended); procedure WritePackedAnsiString(const V: AnsiString); procedure WritePackedWideString(const V: WideString); procedure WritePackedString(const V: String); {$IFDEF UseInline}inline;{$ENDIF} procedure WritePackedAnsiStringArray(const V: Array of AnsiString); procedure WritePackedWideStringArray(const V: Array of WideString)
Delphi-Quellcode:
procedure TMain_Form.Project_Save_ActionExecute(Sender: TObject);
var fWriter : TFileWriter; FFilename : String; Len :Int64; I : Integer; Node : PVirtualNode; Data : PNodeData; begin FFilename := 'C:\..\Language Suite\test.dat'; fWriter := TFileWriter.Create(FFilename); try (* Write Columns Count *) fWriter.WriteInt64(LanguageTree.Header.Columns.Count); for I := 0 to LanguageTree.Header.Columns.Count -1 do begin (* Write Column Width *) fWriter.WriteInt64(LanguageTree.Header.Columns[i].Width); (* Write Column Position *) fWriter.WriteLongWord(LanguageTree.Header.Columns[i].Position); (* Write Column Text *) Len:= Length(LanguageTree.Header.Columns[i].CaptionText); fWriter.WriteInt64(Len); fWriter.WriteStrW(LanguageTree.Header.Columns[i].CaptionText); end; // Save Nodes Test (* Write LanguageTree TotalCount *) fWriter.WriteLongWord(LanguageTree.TotalCount); If LanguageTree.GetFirst = nil then Exit; Node:= nil; repeat if Node = nil then Node:= LanguageTree.GetFirst else Node:= LanguageTree.GetNext(Node); Data:= LanguageTree.GetNodeData(Node); (* Write LanguageTree NodeLevel *) fWriter.WriteInt64(Data^.Level); (* Write Identifirer *) fWriter.WriteInt64(Length(Data^.Identifirer)); fWriter.WriteStrW(Data^.Identifirer); (* Write Language *) fWriter.WriteInt64(Length(Data^.Language)); for I := 0 to Length(Data^.Language) -1 do begin fWriter.WriteInt64(Length(Data^.Language[i].Text)); FWriter.WriteStrW(Data^.Language[i].Text); fWriter.WriteInt64(Length(Data^.Language[i].Name)); FWriter.WriteStrW(Data^.Language[i].Name); fWriter.WriteInt64(Length(Data^.Language[i].Ext)); FWriter.WriteStrW(Data^.Language[i].Ext); end; until Node = LanguageTree.GetLast(); //test end finally fWriter.Free; end; //Sava_Project(); end; |
AW: brauche hilfe mit der VirtualTreeView.
So geht es natürlich auch. Mit den Standard-Streams aus der RTL wärst, du aber genauso gut weggekommen :) Hier mal ein kleiner Auszug aus der TStream Klasse:
Delphi-Quellcode:
Aäquivalent dazu gibt es natürlich auch eine ganze Reihe an WriteData() Methoden. Als einziges das Lesen und Schreiben von ganzen Strings müsste man sich in diesem Falle selbst implementieren. Aber das ist ja jeweils eine Sache von 3-4 Zeilen Code, wenn man einfach die Länge des Strings vorwegschreibt und anschließend den eigentlichen Inhalt.
function ReadData(var Buffer: Char): Longint; overload;
function ReadData(var Buffer: Char; Count: Longint): Longint; overload; function ReadData(var Buffer: Int8): Longint; overload; function ReadData(var Buffer: Int8; Count: Longint): Longint; overload; function ReadData(var Buffer: UInt8): Longint; overload; function ReadData(var Buffer: UInt8; Count: Longint): Longint; overload; function ReadData(var Buffer: Int16): Longint; overload; function ReadData(var Buffer: Int16; Count: Longint): Longint; overload; function ReadData(var Buffer: UInt16): Longint; overload; function ReadData(var Buffer: UInt16; Count: Longint): Longint; overload; function ReadData(var Buffer: Int32): Longint; overload; function ReadData(var Buffer: Int32; Count: Longint): Longint; overload; function ReadData(var Buffer: UInt32): Longint; overload; function ReadData(var Buffer: UInt32; Count: Longint): Longint; overload; function ReadData(var Buffer: Int64): Longint; overload; function ReadData(var Buffer: Int64; Count: Longint): Longint; overload; function ReadData(var Buffer: UInt64): Longint; overload; function ReadData(var Buffer: UInt64; Count: Longint): Longint; overload; function ReadData(var Buffer: Single): Longint; overload; function ReadData(var Buffer: Single; Count: Longint): Longint; overload; function ReadData(var Buffer: Double): Longint; overload; function ReadData(var Buffer: Double; Count: Longint): Longint; overload; function ReadData(var Buffer: Extended): Longint; overload; function ReadData(var Buffer: Extended; Count: Longint): Longint; overload; |
AW: brauche hilfe mit der VirtualTreeView.
hi
es kann ja sein das ich etwas übersehe aber ich finden keine der von dir genannten einträge in der TStream Class und descendants. in der embarcadero hilfe finde ich diese einträge auch erst ab XE3 ich arbeite aber nur XE2 obwohl ich die XE3 und XE4 Besitze der grund ist ich haben eine menge Komponenten eigene und fremde die nicht kompatibel sind mit XE3 und XE4 es ist schade dass viele open source projekte nicht weiter entwickelt werden so wie die Drag and Drop Component Suite von Anders Melander |
AW: brauche hilfe mit der VirtualTreeView.
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 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