(我要说清楚)如何将TreeView上的节点连同其关联的对象存在一个文件里并可以重新装载访问。
主 题:如何将TreeView上的节点连同其关联的对象存在一个文件里并可以重新装载访问。
我必须把问题说清楚;
type
PResNodeRec = ^TResNodeRec;
TResNodeRec = record
ID: Integer;
Name: string[64];
Flag: SmallInt;
Prop: SmallInt;
end;
procedure AddLogicNode(ATV: TTreeView);
var
resNodeRec: PResNodeRec;
begin
with ATV do
begin
New(resNodeRec);
with resNodeRec^ do
begin
ID := 555;
Name := '新建对象';
Flag := 0;
Prop := 1;
end;
Items.AddChildObject(Selected, resNodeRec.recName, resNodeRec);
SaveTV(ATV);
end;
procedure SaveTV(aTV: TTreeView);
var
strmResExp: TEncodeStream;
begin
if FileExists('ResExp.nod') then strmResExp := TEncodeStream.Create('ResExp.nod', fmOpenWrite)
else strmResExp := TEncodeStream.Create('ResExp.nod', fmOpenWrite or fmCreate);
try
aTV.SaveToStream(strmResExp);
finally
strmResExp.Free;
end;
end;
//Unit EncodeStream
//---------------------------可进行解码、编码的文件流----------------------
type
TEncodeStream = Class (TFileStream)
private
FKey: Char;
public
constructor Create(const FileName: string; Mode: Word);
function Read(var Buffer; Count: LongInt): LongInt; override;
function Write(const Buffer; Count: LongInt): LongInt; override;
property Key: Char read FKey write FKey default 'A';
end;
//---------------------------------------------------------------------
implementation
constructor TEncodeStream.Create(const FileName: string; Mode: Word);
begin
inherited Create(FileName, Mode);
FKey := 'A';
end;
function TEncodeStream.Read(var Buffer; Count: LongInt): LongInt;
var
pBuf, PEnc: PChar;
I, CountRead, EncVal: Integer;
begin
GetMem(PEnc, Count);
try
CountRead := inherited Read(PEnc^, Count);
pBuf := PChar(@Buffer);
for I := 0 to CountRead - 1 do
begin
EncVal := (Ord(pEnc[I]) - Ord(Key)) mod 256;
pBuf[I] := Chr(Encval);
end;
finally
FreeMem(PEnc, Count)
end;
end;
function TEncodeStream.Write(const Buffer; Count: LongInt): LongInt;
var
pBuf, PEnc: PChar;
I, EncVal: Integer;
begin
GetMem(pEnc, Count);
try
pBuf := PChar(@Buffer);
for I := 0 to Count - 1 do
begin
EncVal := (Ord(pBuf[I]) + Ord(Key)) mod 256;
pEnc[I] := Chr(EncVal);
end;
Result := inherited Write(pEnc^, Count);
finally
FreeMem(pEnc, Count);
end;
end;
end.
我只所以要把树上信息写到一个加了密的文件里而不是写到数据库里
(哪怕是dbf或Db或mdb),原因是我想让我的程序尽量的小,不需要数据访问链路支持。
我想写总是可以写的甚至可以按顺序写到多个文件里,但是怎样才能再组装回来,并把树上节点对应信息一一挂上!
SaveToFile我最先就是用它的,但它只能保存树上节点的标题而已。