传文件需要另外的控件,可以使用NMStrm、NMStrmServ,非常简单的
我的程序使用了一个NMStrm和一个NMStrmServ控件//自定义的传送文件的函数
procedure TMainForm.SendFile(const ip: ipstr; const filename: Shortstring);
var
MyFStream: TFileStream;
Begin
MyFStream := TFileStream.Create(filename, fmOpenRead);
try
NMStrm.Host:=ip;
NMStrm.FromName:=ExtractFileName(filename);
NMStrm.PostIt(MyFStream);
finally
MyFStream.Free;
end;
end;//NMStrmServ的ONMsg事件处理程序
procedure TMainForm.NMStrmServMSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
MyFStream: TFileStream;
begin
SaveDialog.Title:='保存别人发送来的文件: '+sFrom;
SaveDialog.Filter:='所有文件|*.*';
SaveDialog.InitialDir:=YMessagePath;
SaveDialog.FileName:=sFrom;
if (pos('\',sFrom)>0) or SaveDialog.Execute then begin
If FileExists(SaveDialog.FileName) then DeleteFile(SaveDialog.FileName);
MyFStream := TFileStream.Create(SaveDialog.FileName, fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
if (pos('\',sFrom)=0) and
FileExists(SaveDialog.FileName) and
(Application.MessageBox(PChar('现在打开(运行)刚才收到的文件吗?'#13#10'文件名: '+SaveDialog.FileName),ProgramTitle,MB_YESNO)=IDYES)
then ShellExecute(0,nil,PChar(SaveDialog.FileName),Nil, Nil, SW_MAXIMIZE);
end;
end;我在UDP数据里面设置了一个标志位,收到数据的时候根据标志位区别处理,比如
readbuffer(...);
flag:=buffer[0];
msg:=buffer+1;
case flag of
'0': ShowReceivedMsg(msg);//收到消息,显示
'1': //是否接收文件
....
end;
我的程序使用了一个NMStrm和一个NMStrmServ控件//自定义的传送文件的函数
procedure TMainForm.SendFile(const ip: ipstr; const filename: Shortstring);
var
MyFStream: TFileStream;
Begin
MyFStream := TFileStream.Create(filename, fmOpenRead);
try
NMStrm.Host:=ip;
NMStrm.FromName:=ExtractFileName(filename);
NMStrm.PostIt(MyFStream);
finally
MyFStream.Free;
end;
end;//NMStrmServ的ONMsg事件处理程序
procedure TMainForm.NMStrmServMSG(Sender: TComponent; const sFrom: String;
strm: TStream);
var
MyFStream: TFileStream;
begin
SaveDialog.Title:='保存别人发送来的文件: '+sFrom;
SaveDialog.Filter:='所有文件|*.*';
SaveDialog.InitialDir:=YMessagePath;
SaveDialog.FileName:=sFrom;
if (pos('\',sFrom)>0) or SaveDialog.Execute then begin
If FileExists(SaveDialog.FileName) then DeleteFile(SaveDialog.FileName);
MyFStream := TFileStream.Create(SaveDialog.FileName, fmCreate);
try
MyFStream.CopyFrom(strm, strm.size);
finally
MYFStream.Free;
end;
if (pos('\',sFrom)=0) and
FileExists(SaveDialog.FileName) and
(Application.MessageBox(PChar('现在打开(运行)刚才收到的文件吗?'#13#10'文件名: '+SaveDialog.FileName),ProgramTitle,MB_YESNO)=IDYES)
then ShellExecute(0,nil,PChar(SaveDialog.FileName),Nil, Nil, SW_MAXIMIZE);
end;
end;我在UDP数据里面设置了一个标志位,收到数据的时候根据标志位区别处理,比如
readbuffer(...);
flag:=buffer[0];
msg:=buffer+1;
case flag of
'0': ShowReceivedMsg(msg);//收到消息,显示
'1': //是否接收文件
....
end;
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货