Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi brauche hilfe mit der VirtualTreeView. (https://www.delphipraxis.net/176109-brauche-hilfe-mit-der-virtualtreeview.html)

Wishmaster 12. Aug 2013 23:31

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;

Zacherl 13. Aug 2013 00:49

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.

Wishmaster 13. Aug 2013 03:15

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.

Zacherl 13. Aug 2013 13:23

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;

Wishmaster 15. Aug 2013 03:49

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
cStreams die ist nicht kompatibel mit der VirtualTreeView und TMemoryStream/TStream aber die komponente hat einige nette properties wie
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;

Zacherl 15. Aug 2013 12:52

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:
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;
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.

Wishmaster 17. Aug 2013 03:39

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

Aviator 17. Aug 2013 15:26

AW: brauche hilfe mit der VirtualTreeView.
 
Zitat:

Zitat von Wishmaster (Beitrag 1225170)
es ist schade dass viele open source projekte nicht weiter entwickelt werden
so wie die Drag and Drop Component Suite von Anders Melander

Hier hat ein DPler die Version für XE4 überarbeitet und ins Netz gestellt. Im dem dazugehörigen Thread findest du auch Versionen für XE2 und XE3.


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