?? transport.~pas
字號(hào):
unit transport;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
StdCtrls, ComCtrls, IdTCPServer;
type
Ttrans = class(TForm)
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
IdTCPClient1: TIdTCPClient;
Edit1: TEdit;
Button3: TButton;
Button4: TButton;
ProgressBar1: TProgressBar;
IdTCPServer1: TIdTCPServer;
StatusBar1: TStatusBar;
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
AFileStream: TFileStream; //傳輸?shù)奈募? procedure ButtonBegin;
procedure ButtonEnd;
{ Private declarations }
public
{ Public declarations }
end;
var
trans: Ttrans;
implementation
uses csMain;
{$R *.dfm}
procedure Ttrans.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute then
Edit1.Text := OpenDialog1.FileName;
end;
procedure Ttrans.Button4Click(Sender: TObject);
begin
StatusBar1.SimpleText := '傳輸取消...';
AFileStream.Free; //釋放文件流
ButtonEnd; //VCL結(jié)束狀態(tài)設(shè)置
close;
end;
procedure Ttrans.Button1Click(Sender: TObject);
begin
if not FileExists(Edit1.Text) then //檢測(cè)文件是否存在
begin
Showmessage('文件不存在,請(qǐng)選擇文件!');
exit;
end;
//建立文件流
AFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
ProgressBar1.Max := AFileStream.Size;
ProgressBar1.Position := 0;
ButtonBegin; //VCL開始狀態(tài)設(shè)置
//服務(wù)器準(zhǔn)備好連接
IdTCPServer1.DefaultPort := StrToIntDef(Edit3.Text, 9925);
if not IdTCPServer1.Active then IdTCPServer1.Active := True;
end;
procedure Ttrans.ButtonBegin;
begin //VCL開始狀態(tài)設(shè)置
Button1.Enabled := False;
Button2.Enabled := False;
Button3.Enabled := True;
Button4.Enabled := False;
end;
procedure Ttrans.ButtonEnd;
begin //VCL結(jié)束狀態(tài)設(shè)置
Button1.Enabled := True;
Button2.Enabled := True;
Button3.Enabled := False;
Button4.Enabled := True;
end;
procedure Ttrans.IdTCPServer1Execute(AThread: TIdPeerThread);
var
cmd: string; //接收到客戶端的字符串信息
ASize: Integer; //需要傳輸?shù)牧鞔笮?begin
with AThread.Connection do //已經(jīng)連街上的一個(gè)進(jìn)程
begin
cmd := UpperCase(ReadLn); //客戶端發(fā)送的命令字符串
if cmd = 'BEGIN' then //開始傳輸
begin
//告訴遠(yuǎn)程傳輸文件的大小和文件名
WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(Edit1.Text)]));
StatusBar1.SimpleText := '準(zhǔn)備傳輸...';
Exit;
end;
if cmd = 'END' then
begin //傳輸完成
Button3.Click;
StatusBar1.SimpleText := '傳輸完成...';
Exit;
end;
if cmd = 'CANCEL' then
begin //傳輸取消
StatusBar1.SimpleText := '傳輸取消...';
//保持傳輸狀態(tài)
Exit;
end;
//按照指定位置傳輸文件
AFileStream.Seek(StrToInT(cmd), soFromBeginning); //轉(zhuǎn)到文件流傳輸?shù)奈恢? if (AFileStream.Size - AFileStream.Position) >= RecvBufferSize then
ASize := RecvBufferSize
else ASize := AFileStream.Size - AFileStream.Position;
//計(jì)算需要發(fā)送的大小,Min()函數(shù)在Math單元
OpenWriteBuffer; //準(zhǔn)備發(fā)送緩沖
WriteStream(AFileStream, false, false, ASize);
//注意這個(gè)函數(shù)的參數(shù)。
CloseWriteBuffer; //結(jié)束發(fā)送緩沖
StatusBar1.SimpleText := Format('當(dāng)前傳輸位置%s/大小%d', [cmd, AFileStream.Size]);
ProgressBar1.Position := ProgressBar1.Position + ASize;
end;
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -