unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls,
StdCtrls;
type
noteob = class
strs : WideString;
constructor Create;
destructor Destroy; override;
end;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Memo1: TMemo;
TreeView1: TTreeView;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
procedure TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
private
{ private declarations }
procedure AddNode( LastNode : TTreeNode; nodelevel : integer; lbl : string; note : noteob );
function ReadChars( numchars : integer; fs : TFileStream ) : string;
procedure DoLoad( fn : string );
procedure DoSave( fn : string );
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
constructor noteob.Create;
begin
inherited Create;
// := TStringList.Create;
end;
destructor noteob.Destroy;
begin
// strs.Free;
inherited Destroy;
end;
{ TForm1 }
procedure TForm1.AddNode( LastNode : TTreeNode; nodelevel : integer; lbl : string; note : noteob );
begin
if (TreeView1.Items.Count = 0) then
{ NewNode := } TreeView1.Items.AddChildObject(nil, lbl, note)
else if (nodelevel > LastNode.level) then
{ NewNode:= } TreeView1.Items.AddChildObject(LastNode, lbl, note)
else
begin // if this node is 'outdented' (it has a lower nodelevel than the
// node above it) find the first existing node at its nodelevel
// and add the NewNode to it.
while nodelevel < LastNode.level do
LastNode := LastNode.Parent;
{ NewNode := } TreeView1.Items.AddObject(LastNode, lbl, note);
end;
end;
function TForm1.ReadChars( numchars : integer; fs : TFileStream ) : string;
var
i : integer;
c : char;
s : string;
begin
for i := 1 to numchars do
begin
fs.ReadBuffer(c,sizeof(c));
s := s + c;
end;
result := s;
end;
procedure TForm1.DoLoad( fn : string );
// File Open
var
fs : TFileStream;
i, slen, NumOfNodes, nodelevel : integer;
note : noteob;
lbl : String[255];
s : string;
LastNode : TTreeNode;
begin
LastNode := nil;
fs := TFileStream.Create( fn, fmOpenRead );
TreeView1.Items.Clear;
TreeView1.Repaint;
try // ...finally
try // ...except
// READ: Number of Nodes
fs.ReadBuffer(NumOfNodes, sizeof(NumOfNodes));
for i := 0 to NumOfNodes-1 do
begin
// READ: Node Label
fs.ReadBuffer(lbl,sizeof(lbl));
// READ: Node level
fs.ReadBuffer(nodelevel, sizeof(nodelevel));
// READ: Length of String data
fs.ReadBuffer( slen, sizeof( slen ) );
s := '';
// READ: and Construct String S from them
s := ReadChars( slen, fs ) ;
// CREATE noteob, assign String S to its text field
note := noteob.create;
note.strs := s;
AddNode( LastNode, nodelevel, lbl, note );
LastNode := TreeView1.Items[TreeView1.Items.Count-1];
Treeview1.FullExpand;
memo1.Text := noteob(Treeview1.Items[0].Data).strs;
end;
except on E:Exception do
ShowMessage( ' Couldn''t load from stream: ' + E.message );
end;
finally
fs.Free;
end;
Caption := ExtractFileName(fn);
end;
procedure TForm1.DoSave( fn : string );
var
fs : TFileStream;
lbl : string[255];
s : string;
i, stri, slen, NumOfNodes, nodelevel : integer;
begin
fs := TFileStream.Create( fn, fmCreate );
try // ...finally
try // ...except
// WRITE: Num of nodes in TreeView
NumOfNodes := TreeView1.Items.Count;
fs.WriteBuffer(NumOfNodes, sizeof(NumOfNodes));
// WRITE: the labels and data of the nodes
for i := 0 to TreeView1.Items.Count-1 do
begin
// WRITE: node label
lbl := TreeView1.Items[i].Text; //!! NEED to supply LEVEL too
fs.WriteBuffer(lbl,sizeof(lbl));
// WRITE: Node level
nodelevel := TreeView1.Items[i].Level;
fs.WriteBuffer(nodelevel, sizeof(nodelevel));
// assign txt data to String S
s := noteob(TreeView1.Items[i].Data).strs;
slen := length(s);
// WRITE: Length of String S
fs.WriteBuffer(slen, sizeof(slen));
// WRITE: String S one char at a time.
for stri := 1 to slen do
fs.WriteBuffer( s[stri], sizeof( char ) );
end;
except on Exception do
ShowMessage( 'Stream could not be written! ' );
end;
finally
fs.free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Node : TTreeNode;
note : noteob;
begin
note := noteob.create;
Node := TreeView1.Items.AddObject(TreeView1.Selected, 'NewItem', note);
Node.Selected := true;
Node.EditText;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DoSave('zz.txt');
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
DoLoad('zz.txt');
end;
procedure TForm1.Button4Click(Sender: TObject);
Var
I : integer;
begin
for i := 0 to treeview1.Items.Count - 1 do
noteob(TreeView1.Items[i].Data).free;
end;
procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
if Treeview1.Selected <> nil then
memo1.Text := noteob(Treeview1.Selected.Data).strs;
end;
procedure TForm1.TreeView1Changing(Sender: TObject; Node: TTreeNode;
var AllowChange: Boolean);
begin
if Treeview1.Selected <> nil then
Begin
If memo1.Modified = True then
noteob(Treeview1.Selected.Data).strs := memo1.Text;
End;
end;
end.