大家帮帮我,这段代码我搞了一个通宵都不知错在哪在!!!!(100分)

S

shopman

Unregistered / Unconfirmed
GUEST, unregistred user!
代码要产生 “意外错误”情况如下
这段代码的作用是将客户端用户调整的树形结构保存在一个结构里放在TList内,之后
将 TList -> TStream -> OLEVarian 传送到服务器,我这样做的目的是客户无论对树形
结构做任何调整只调用一次AppServer就可以将数据库更新。当然服务器要完成
OLEVarian -> TStreazm -> TList的转换进而处理每一个结构。但是我在代码里看不到任
何错误同样的代码我在单进程环境下又无任何问题。但一放在三层中就要出现“意外错误”
从咋天下午一直搞到今天早上5点实在是不知错在哪里。。。请高手指点。
实在不行我就只有将结构中的数据存成字符串再在服务器中解析出来,但我不知道为什么
用我的自定义结构就不行呢!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//结构如下
type
TTreeItem = record
Command :String;
Layer :Integer;
PID :String;
KID :String;
DisPlayName :String;
FS :String;
end;
type
PTreeItem = ^TTreeItem;
//客户端
/////////////////////////////////////////////////////////////////
//TList -> TStream
procedure TForm1.SaveListToStream(List: TList;
Stream: TStream);
var
i :Integer;
begin
Stream.Position := 0;
for i := 0 to List.Count - 1do
Stream.WriteBuffer(PTreeItem(List.Items)^, SizeOf(TTreeItem));
end;

//TStream -> OLEVariant
procedure TForm1.StreamToOleVariant(ova: OleVariant;
Stream: TStream);
var
P: Pointer;
begin
ova := VarArrayCreate([0, Stream.Size - 1], varByte);
P := VarArrayLock(ova);
try
Stream.Position := 0;
Stream.Read(P^, Stream.Size);
finally
VarArrayUnlock(ova);
end;
end;

//调用处
procedure TForm1.Button9Click(Sender: TObject);
var
ito :OLEVariant;
it :TStream;
begin
it := TMemoryStream.Create;
//SaveTreeItem 是全局性TList类变量,其中就保存着所有用户修改过的数形单元
SaveListToStream(SaveTreeItem, it);
StreamToOleVariant(ito, it);
//更新服务器树形单元数据库
SocketConnection1.AppServer.Modify_DBTree(ito);
it.Free;
end;

//服务器
////////////////////////////////////////////////////////////////
//OLEVariant -> TStream
procedure TGrade.OLEVariantToStream(ova: OLEVariant;
Stream: TStream);
var
P: Pointer;
begin
P := VarArrayLock(ova);
try
Stream.Write(P^, VarArrayHighBound(ova,1) + 1);
finally
VarArrayUnlock(ova);
end;
end;

//TStream -> TList
procedure TGrade.ReadStreamToList(List: TList;
Stream: TStream);
var
i, n :Integer;
P :pTreeItem;
begin
n := Stream.Size div SizeOf(ttreeitem);
Stream.Position := 0;
for i := 0 to n - 1do
begin
New(P);
Stream.ReadBuffer(P^, SizeOf(TTreeItem));
List.Add(P);
end;
end;

//调用处
procedure TGrade.Modify_DBTree(ito: OleVariant);
var
i :Integer;
it :TStream;
mytreeitem :pTreeItem;
TreeUnit :TList;
begin
it := TMemoryStream.Create;
TreeUnit := TList.Create;
OLEVariantToStream(ito, it);
ReadStreamToList(TreeUnit, it);
for i := 0 to TreeUnit.Count - 1do
begin
mytreeitem := PTreeItem(TreeUnit.Items);
//跟踪代码到这就出现“意外错误”只要一访问mytreeitem.Command马上出错。。。
if mytreeitem.Command = 'Inster' then
begin
//..............
end;
if mytreeitem.Command = 'Delete' then
begin
//..........................
end;
if mytreeitem.Command = 'Modify' then
begin
//.................
end;
end;
end;
 
对了忘说了我这个三层是用SocketConnection1没用DCOM,这样客户端不需要做什么配制
拿来就能用。
 
写了半天不小心按了esc全没了.
 
晕。。。。。。。。。。。。。。。。。。。。。
这也算回答了??????。。。哈哈
再来一道。。。亲爱的
 
刚才犯了错误,全清除了,再重写一次:
你的错误有一下几处:
首选定义的结构有问题:
type
TTreeItem = record
Command :String;
Layer :Integer;
PID :String;
KID :String;
DisPlayName :String;
FS :String;
end;

这里你要往流中写入这些数据,你必须确定数据的大小,而你的定义不能体现出来.
比如a:TTreeitem;
stream.write(a)这时stream根本不知道该写多少字节??
所以要这样定义
type
TTreeItem = record
Command :String[100];
Layer :Integer;
PID :String[100];
KID :String[100];
DisPlayName :String[100];
FS :String[100];
end;

当然大小你可以字节定 ,不一定要100,但这是必须的.
如果你不能确定大小,那么就不能使用这个结构进行读写.
你可以这样:
var a:string;
sizea:integer;
begin
sizea:=length(a);
stream.writebuffer(sizea,sizeof(integer));
stream.writebuffer(a[1],sizea);
//注意这里[1]是必须的,因为string类型是从1开始的.
end;
 
嗯。楼主与www有非常特殊的关系。[:D]
 
to 影 子, 我与shopman什么关系呀??你猜猜.
 
另外因为 mytreeitem 是个指针所以最后这样调用:
mytreeitem^.command:=....
mytreeitem^.Layer:=
 
他多半是看到我那个“亲爱的”以为......................................
亲爱的没什么呀。。老外经常叫亲爱 的。。。。都有特殊关系呀
 
有意思,我们什么关系问问楼主吧......
呵呵,呵呵
 
来自:shopman, 时间:2002-12-12 15:44:00, ID:1505414
晕。。。。。。。。。。。。。。。。。。。。。
这也算回答了??????。。。哈哈
再来一道。。。亲爱的

shopman应该是男的吧?www,你是女的?从上面的[red]亲爱的[/red]看...不言而喻了。
 
中国人有中国人的习惯。所有才有入乡随俗这句话。[:D]
 
哈哈,我在大富翁呆了四年了,我怎么不知道我在这里是个女的,看来我得到医院检查一下了.
 

我被误导了。不过,有空去检查一下也好。说不定...[:D][:D][:D]
 
我是男的,www 是男的还是女的俺就不得而知了。。。。。。。
亲爱的是我对此问题久久不能解决有如一只迷失在茫茫大海中的小帆船如此无助如此
惶恐如此迷茫如此彷徨!在无边无际的大海上忽然看到了www这座灯塔!!引领我前进使
我走向光明而发自内心深深深深深深处纳喊。。。。是无比纯洁、无比响亮、无比丰
富、无比无比无比无比那个的。。。。。。。。
 
不过影 子你似乎也该检查一下呀,是不是太敏感了?
你的捕风捉影的功力也真够厉害的.佩服佩服.
 
我说楼主呀,我帮你回答问题,你竟然....
本人当然是男的,如假包换!!下次不答你的问题了,免得麻烦多.....
 
www兄!咱的确不知你是男是女呀。我有问过你吗?没有吧!!!!
难道我不知道你男是女也有错呀???????
 
哈哈,说说笑可以放松一下。[:)]
我身体很好,不用检查。谢谢关心。[8D]
有点象聊天,不回复此帖了。[:D]
 
顶部