当前位置:主页>销售管理软件> 列表

IdTCPServer端在传送文件的时候如何显示进度? 找下载财务软件

销售管理软件版1楼: 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分块发送了