IdTCPServer端在传送文件的时候如何显示进度? 找下载财务软件
IdTCPClient有onwork事件,可以实现,现在是IdTCPServer端不知道如何显示文件传输的进度。
还有一个问题,我的
procedure TForm1.TCPClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Max := AWorkCountMax;
end;
为什么AWorkCountMax老为0,不过我通过server在发送文件前writeln一个字节数过来了,所以这个问题如果不知道还可以跳过去。
2楼: 查看一下aworkcountmax是干什么的,不过也可以用别的方法来做,比如说是发送的字节数来处理 如下载财务软件
3楼: 你得在窗体创建时
IDTCPClient.onWorkBegin := TCPClientWorkBegin;
4楼: 第一个问题如何处理?
TCPServer没onWork事件呀
再说biechangjiang的方法编译通不过呀TCPClientWorkBegin未定义
改成TCPClient.onWorkBegin := IDTCPClientWorkBegin;可以通过编译但aworkcountmax还是为0
5楼: 楼主:给我留个邮箱我给你发个DEMO你自己看吧。
6楼: 不好意思呀!哪个程序没有了。
你把你的代码贴出来呀。我给你看看呀!
销售管理软件版7楼: 我的Email:hyjem@21cn.com
服务器端:
unit fserver;
interface
uses
SysUtils, Classes, graphics, controls, FORMs, dialogs,
IdBaseComponent, IdComponent, IdTCPServer, StdCtrls, ExtCtrls,
IdAntiFreezeBase, IdAntiFreeze, Buttons, IdTCPConnection, IdTCPClient,
IdFTP, ComCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
OpenDialog1: TOpenDialog;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
SpeedButton3: TSpeedButton;
IdTCPServer1: TIdTCPServer;
ProgressBar1: TProgressBar;
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure SpeedButton3Click(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
SendFileName: string;
BThread: TIdPeerThread;
implementation
{$R *.dfm}
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
if OpenDialog1.Execute then//执行文件选择标准对话框,选择要发送的文件
begin
SendFileName := OpenDialog1.Filename;//文件名赋值给SendFileName变量
memo1.Lines.Add(SendFileName) ;
end;
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
idTCPServer1.Active := True;//启动服务器
SpeedButton3.Enabled := False;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
sendFile: TFileStream;
begin
BThread :=AThread;
with AThread.Connection do
begin
Memo1.Lines.Add(''Sending file ''+SendFileName);//在Memo里添加要发送的文件名称
WriteLn(SendFileName);//把文件名发送给客户端
SendFile := TFileStream.Create(SendFileName, fmOpenRead);//创建一个TFileStream,打开我们要发送的文件
WriteLn(inttostr(SendFile.Size));//把文件大小发送给客户端
WriteStream(SendFile);//使用流模式把文件发送到客户端
Memo1.Lines.Add(''Total '' + IntToStr(SendFile.Size) + '' Bytes sent'');//显示总共发送的字节数
Disconnect;//断开连接
SendFile.Free;//释放流对象
end;
end;
end.
客户端:
unit fclient;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPConnection,
IdTCPClient, ComCtrls;
type
TForm1 = class(TForm)
lstmain: TListBox;
TCPClient: TIdTCPClient;
Button1: TButton;
ProgressBar1: TProgressBar;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure TCPClientWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
procedure TCPClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ReadFile: TMemoryStream;
RecevFileName: string;
begin
with TCPClient do
begin
Connect;//连接到服务器
while Connected do
begin
ReadFile := TMemoryStream.Create;//创建一个TMemoryStram对象
try
RecevFileName := ReadLn;//从服务器端获得文件名
lstMain.Items.Add(''Receving file ''+ RecevFileName);//显示到ListView中
ProgressBar1.Max := strtoint(ReadLn);
ReadStream(ReadFile, -1, True);//以流模式从服务器端获得文件内容,参数分别是ReadFile表示流对象,-1表示一直读取直到对方断开,True表示在NT操作系统下提高性能,对9x无效
lstMain.items.Add(''Total '' + IntToStr(ReadFile.Size) + '' Bytes recevied'');//显示总共接收到多少数据
ReadFile.Seek(0, soFromBeginning);//定位流指针到开始
ReadFile.SaveToFile(ExtractFileName(RecevFileName));//把流中的内容保存到文件中去
finally
Disconnect;//断开连接
ReadFile.Free;//释放流对象
end;
end;
end;
end;
procedure TForm1.TCPClientWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
ProgressBar1.Position := AWorkCount;
if TCPClient.Connected then
TCPClient.WriteLn(inttostr(AWorkCount));
end;
procedure TForm1.TCPClientWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
ProgressBar1.Position := ProgressBar1.Max;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ProgressBar1.Position := ProgressBar1.Max;
end;
end.
8楼: procedure TForm1.TCPClientWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Max := AWorkCountMax;
end;
这是事件怎么没有呢。还有在窗体创建时
idtcpclient.onWork := TCPClientWork;
idtcpclient.onWorkBegin := TCPClientWorkBegin;
idtcpclient.onWorkEnd := TCPClientWorkEnd;
9楼: 客户端这个问题不能解决好办一点,哪位老大帮我想想办法如何解决server端没有onwork这个事件如何显示进度的问题!
这个事件原来有,但我检查到值老是为0才去掉的,另外你给的窗体创建时的那三句编译通不过。
提示:
[Error] fclient.pas(103): Undeclared identifier: ''onWork''
[Error] fclient.pas(103): Not enough actual parameters
[Error] fclient.pas(104): Undeclared identifier: ''onWorkBegin''
[Error] fclient.pas(104): Not enough actual parameters
[Error] fclient.pas(105): Undeclared identifier: ''onWorkEnd''
[Error] fclient.pas(105): Not enough actual parameters
[Fatal Error] client.dpr(5): Could not compile used unit ''fclient.pas''
10楼: 盒子上有代进程条传送文件的例子,可以搜索一下
11楼: 算了,我用UDP分块发送了