如何将TList里面的内容保存为文件?(100分)

  • 主题发起人 主题发起人 chenzy89
  • 开始时间 开始时间
C

chenzy89

Unregistered / Unconfirmed
GUEST, unregistred user!
type
PMyRec = ^TMyRec;
TMyRec = record
aa: integer;
bb: string;
end;
...
var
tmpList: TList;
Pointer1,Pointer2: PMyRec;
...
tmpList.add(Pointer1);
tmpList.add(Pointer2);
...
请问各位大侠我能否将tmpList里的内容(ITEM)保存为文件,以便于以后可以重载?
 
也就是为TList的Item定义一种存储结构,重载进来的时候做一下算法,把原来的值读出来或转化过来
 
能不能说具体点?这样等于没说!
 
PMyRec = ^TMyRec;
TMyRec = record
aa: integer;
[red] bb: string
//这里要用定长的 char[/red]
end;
...
 
针对你的声明:

type
PMyRec = ^TMyRec;
TMyRec = record
aa: integer;
bb: string;
end;

给你个代码,参考吧:

写入文件:


procedure TForm1.Button1Click(Sender: TObject);
const
c:String=#0;
var
tmpList: TList;
Pointer1, Pointer2: PMyRec;
i: integer;
ms: TMemoryStream;
begin
tmpList := TList.Create;
New(Pointer1);
Pointer1.aa := 1;
Pointer1.bb := 'hello1';
New(Pointer2);
Pointer2.aa := 2;
Pointer2.bb := 'hello2';
tmpList.add(Pointer1);
tmpList.add(Pointer2);

ms := TMemoryStream.Create;
for i := 0 to tmpList.Count - 1 do
begin
ms.Write(PMyRec(tmpList.Items).aa, SizeOf(Integer));
if PMyRec(tmpList.Items).bb='' then
ms.Write(c,SizeOf(Char))
else
ms.Write(PMyRec(tmpList.Items).bb[1], Length(PMyRec(tmpList.Items).bb)+1);
end;
ms.SaveToFile('c:/test.dat');
ms.Free;

Dispose(Pointer1);
Dispose(Pointer2);
tmpList.Free;
end;

从文件读出:

procedure TForm1.Button2Click(Sender: TObject);
var
tmpList: TList;
i: integer;
ms: TMemoryStream;
p:pchar;
my:PMyRec;
begin
ms:=TMemoryStream.Create;
ms.LoadFromFile('c:/test.dat');
p := ms.Memory;
tmpList:=TList.Create;

while MS.Position<ms.Size do
begin
New(my);
my.aa:=Integer(p^);
p:=p+Sizeof(my.aa);
my.bb:=p;
p:=p+length(my.bb)+1;
tmpList.Add(my);
ms.Position:=p-ms.memory;
end;

//这里可以用tmplist 了,
showmessage(inttostr(tmpList.Count));
ShowMessage(pMyRec(tmpList.Items[1]).bb);

//下面是释放
for i:=0 to tmpList.Count -1 do
Dispose(pMyRec(tmpList.Items));
tmpList.Free;
ms.Free;
end;
 
非常感谢shangshang的回答。
还有一点不太明白——
ms.Write(PMyRec(tmpList.Items).bb[1], Length(PMyRec(tmpList.Items).bb)+1);为什么不是
ms.Write(PMyRec(tmpList.Items).bb[1], Length(PMyRec(tmpList.Items).bb));

为何长度要+1呢?
 
+1是为了补充一个#0 字符。用来表明字符串的结尾,方便使用 pchar类型来取值
 
shangshang:
我发现你的代码有点问题,如果Pointer1.bb := ''的话,出现问题,保存的结果不正确。不信你试试。
 
chenzy89,谢谢指正,是我疏于测试了。非常感谢。

ms.Write(c,SizeOf(Char))
应该改为
ms.Write(c[1],SizeOf(Char))

否则的话,写入的不是#0,而是一个不可预测值。
 
type
PMyRec = ^TMyRec;
TMyRec = record
aa: integer;
bb: string;
end;
...
var
tmpList: TList;
Pointer1,Pointer2: PMyRec;
...
tmpList.add(Pointer1);
tmpList.add(Pointer2);
...

请问各位高手,有什么好办法利用TUDP组件在网络中发送tmpList到另一台电脑?
 
shangshang大侠,求救了!!
 
噢,按规矩你得另开一帖才是.呵呵.
其实你会了上面用TMemoryStream来保存整个tmpList ,那么就不难用这个TMemoryStream发送到另一台电脑.我不知道你用什么组件.不过TmemoryStream已经是一个现成的好缓冲区了.Memory属性就是缓冲区头指针,size就是缓冲区大小
通常的send函数就可以直接发送出去了.当然,如果数据很大,就的好好写一个网络发送过程了.
 
shangshang:
再次感谢你的回答,我之所以在《问题:如何将TList里面的内容保存为文件?》里面问你问题,是因为我知道只有在这才能找到你(系统会给你发email),换句话说,如果我知道你的邮箱,我就不会在这里问问题了。其实我早就另开一帖——
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3418008。
另外,我用的是TUDP组件,你应该知道吧。
 
唉呀,你菜啊,点我名字就能看到我的联系方式了嘛.呵呵.
说你应该另开一帖,也是跟你开个玩笑,别介意.
Tudp组件我确实没用过,一定要他的话,我想所有socket组件必定有类似sendbuf的方法.我上面所说也是没问题的了.
 
后退
顶部