抱歉前面没看程序。
看了第一遍后, 觉得很奇怪, 奇怪你怎么能运行下去而没有崩溃。
又看了两遍之后, 还是不知道这段代码到底在干什么。
procedure TForm1.ClientRead(Sender: TObject; Socket: TCustomWinSocket);
var l1,l2,l3
ByteArray;
x,y,p:integer;
strsize:integer;
bmp1:Tbitmap;
begin
strsize:=socket.ReceiveLength ;
bmp1:=Tbitmap.Create ;
Bmp1.Assign(Image1.Picture.Bitmap);
bmp1.PixelFormat :=pf8bit;
socket.ReceiveBuf(l2,strsize); <----好恐怖的错误。
------ 1、l2未初始化, 记住: l2现在是nil,
------ 2、receivebuf的参数是var buf; 即一个无类型变参, 传入的是你给出变量的地址, 即这里将把l2这个变量所在的地址传入receivebuf中。
------ 从这个地址开始写入strsize个字节。 如果运行不报错的话, 此时l2, l3, x, y, p, 甚至strsize这几个变量都可能已经被改变了(视strsize内的值)。
------ 恐怖的是l2这个指针不知道指向哪里去了(也许指向机器BIOS的绝对地址了?)。
inc(p,strsize); <------- p未初始化, 因此p的值可能是3214276,
if p>=image1.Height then <------- 极大的可能性第一次进入clientread这个事件时p就已经>=image1.height了,哪怕读的只有1字节。
------ 这个判断语句很奇怪, 大概是写错了吧? if p>= image1.width还有点意义
------ 如果p正确初始化, 这段代码也很可疑。 除非socket一次收到超过一行的像素否则不可能进入这里。
begin
for y:=0 to image1.Height-1 do
begin
l1:=bmp1.ScanLine [y];
for x:=0 to image1.Width -1 do
if l1[x]<>l2[x] then
begin
l1[x]:=l2[x];
end;
end;
------ 上面一段循环很难理解它的含义。 能不能再解释一下? 为什么要将一张图片的每一行都和传进来的单独某一行数据进行比较? 然后将这张图片变成一张由各种颜色竖线组成的图片?
image1.Picture.Bitmap.Assign(bmp1);
bmp1.Free ;
end;
end;