📄 client.pas
字号:
unit client;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, WinSkinData, ComCtrls, StdCtrls,about,inifiles,IdTCPConnection,
IdTCPClient,IdSocketHandle, Sockets, ExtCtrls,math, IdBaseComponent,
IdComponent,wait,WinSock,StrUtils, IdTCPServer, MPlayer,
IdAntiFreezeBase, IdAntiFreeze, IdHTTP,update1;
type
TClientForm = class(TForm)
SkinData1: TSkinData;
Label1: TLabel;
PageControl1: TPageControl;
Drinks: TTabSheet;
Food: TTabSheet;
Ciga: TTabSheet;
Button1: TButton;
Button2: TButton;
SaleList: TListView;
DrinkListview: TListView;
FoodListview: TListView;
CigaListview: TListView;
Button3: TButton;
Button4: TButton;
Label2: TLabel;
Label3: TLabel;
Button5: TButton;
Label4: TLabel;
Button6: TButton;
ComboBox1: TComboBox;
IdTCPClient1: TIdTCPClient;
Timer1: TTimer;
Timer2: TTimer;
Shape1: TShape;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Timer3: TTimer;
IdTCPServer1: TIdTCPServer;
IdHTTP: TIdHTTP;
AntiFreeze: TIdAntiFreeze;
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure DrinkListviewClick(Sender: TObject);
procedure FoodListviewClick(Sender: TObject);
procedure CigaListviewClick(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure SaleListClick(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Button6Click(Sender: TObject);
procedure ComboBox1KeyPress(Sender: TObject; var Key: Char);
procedure Timer2Timer(Sender: TObject);
procedure Timer3Timer(Sender: TObject);
procedure IdTCPServer1Execute(AThread: TIdPeerThread);
private
{ Private declarations }
public
not_allowed_close:Bool;
{ Public declarations }
end;
var
ClientForm: TClientForm;
sendcount:integer;
WaitReceiveForm:TWaitReceiveForm;
Clientname,ClientIP,ClientMac:string;
implementation
{$R *.dfm}
uses MMsystem;
function GetFileVersion(FileName: String):string; //取得文件版本
var
InfoSize, unuse: DWORD;
VerBuf: Pointer;
FI: PVSFixedFileInfo;
VerSize: DWORD;
MajorMinor,ReleaseBuild :DWORD;
begin
unuse :=0;
MajorMinor := 0;//Major,Minor 如:00010001代表1.1
ReleaseBuild := 0;//Release,Build 如00121208代表12.1208 则版本为1.1.12.1208
result :='unknown';
InfoSize := GetFileVersionInfoSize(PChar(FileName), unuse);
if InfoSize <> 0 then
begin
GetMem(VerBuf, InfoSize);
try
if GetFileVersionInfo(PChar(FileName), unuse, InfoSize, VerBuf) then
if VerQueryvalue(VerBuf,'\', Pointer(FI), VerSize) then
begin
MajorMinor := FI.dwFileVersionMS;
ReleaseBuild := FI.dwFileVersionLS;
end;
finally
FreeMem(VerBuf);
end;
result :=IntToStr(MajorMinor shr 16) +'.' + IntToStr(MajorMinor and $ffff) +'.' + IntToStr(ReleaseBuild shr 16) +'.' + IntToStr(ReleaseBuild and $ffff);
end;
end;
function NeedUpdate():Bool;
var i:integer;
g_path:string;
url:string;
myini:Tinifile;
s: TStringlist;
NewVersion,OldVersion:string;
HTTPFile:TIdHTTP;
begin
result:=false;
try
url:='http://www.zt123.net/saleclient/ver.txt'; //要升级的服务器
g_path:=ExtractFilePath(application.ExeName); //升级程序的路径
//下载升级信息文件
if not DirectoryExists(g_path+'Update') then mkdir('Update');
ClientForm.AntiFreeze.OnlyWhenIdle:=False;
HTTPFile:=TIdHTTP.Create(nil);
HTTPFile.ReadTimeout := 1500; //此处是用来限制得到服务器列表所用的时间,用处请自行研究,本人认为1500左右较好
s := TStringlist.Create;
s.Clear;
s.Add(HTTPFile.Get(url)); //读取配置文件
s.SaveToFile(Pchar(g_path+'update\update.ver'));
s.Free;
HTTPFile.Free;
if FileExists(g_path+'update\update.ver') then
begin
try
myini:=Tinifile.Create(g_path+'update\update.ver');
NewVersion:=myini.ReadString('update','version',GetFileVersion(application.ExeName));
OldVersion:=GetFileVersion(application.ExeName);
if trim(OldVersion)=trim(NewVersion) then Result:=False
else Result:=True;
finally
myini.free;
end;
end;
except
result:=false; //取得升级信息出错!,不用再继续
exit;
end;
end;
procedure ClearMemory;
begin
if Win32Platform = VER_PLATFORM_WIN32_NT then
begin
SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
Application.ProcessMessages;
end;
end;
procedure TClientForm.Button4Click(Sender: TObject);
begin
application.Terminate;
end;
procedure TClientForm.Button5Click(Sender: TObject);
var aboutform:Taboutform;
begin
try
aboutform:=taboutform.Create(self);
aboutform.Label3.Caption:='版本:'+GetFileVersion(application.ExeName)+' [Build 2008.07.03]';
aboutform.ShowModal;
finally
aboutform.Free;
end;
end;
procedure TClientForm.FormCreate(Sender: TObject);
var myini:Tinifile;
MessageList,DrinkList,FoodList,CigaList:Tstrings;
m,d,f,c:integer;
cmd:string;
ASize, TotalSize: Int64;
RecFileStream: TFileStream;
RecFilename:string;
var
wVersionRequested : WORD;
wsaData : TWSAData;
p : PHostEnt;
s : array[0..128] of char;
p2 : pchar;
var UpdateForm:TUpdateForm;
begin
//检查是否有新版本
try
if NeedUpdate=True then
begin
try
UpdateForm:=TUpdateForm.Create(self);
UpdateForm.Timer1.Enabled:=True;
UpdateForm.ShowModal;
finally
UpdateForm.Free;
end;
end;
except
exit;
end;
//连接服务器获取列表文件
not_allowed_close:=False;
sendcount:=0;
if (FileExists(ExtractFilePath(paramstr(0))+'SalesInfo.dat')) and (DeleteFile(ExtractFilePath(paramstr(0))+'SalesInfo.dat')=False) then
begin
application.MessageBox('无法重新创建商品列表文件!','错误',MB_ICONERROR);
application.Terminate;
end;
if not FileExists(ExtractFilePath(paramstr(0))+'system.dat') then
begin
myini:=Tinifile.Create(ExtractFilePath(paramstr(0))+'system.dat');
myini.WriteString('SYSTEM','ServerIP','192.168.1.254');
myini.WriteInteger('SYSTEM','ServerPort',5208);
myini.Free;
end;
myini:=Tinifile.Create(ExtractFilePath(paramstr(0))+'system.dat');
IdTCPClient1.Host:=myini.ReadString('SYSTEM','ServerIP','192.168.1.254');
IdTCPClient1.Port:=myini.ReadInteger('SYSTEM','ServerPort',5208);
myini.Free;
if IdTCPClient1.Connected then IdTCPClient1.Disconnect;
IdTCPClient1.Connect; //连接
try
IdTCPClient1.WriteLn('BEGIN_CFG_FILE'); //提示服务器开始接收
cmd := IdTCPClient1.ReadLn;
//以“|”符号分离文件名
Recfilename := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));
TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小
//建立文件流准备接收
RecFileStream := TFileStream.Create(Recfilename, fmCreate);
try //循环开始接受
repeat
IdTCPClient1.WriteLn(IntToStr(RecFileStream.Size));//发送当前传输的位置
ASize := Min(TotalSize - RecFileStream.Size, IdTCPClient1.RecvBufferSize);
//选择剩余大小和缓冲区大小小的一个作为传输的大小
IdTCPClient1.ReadStream(RecFileStream, ASize); //接收流
Application.ProcessMessages;
until RecFileStream.Size = TotalSize; //大小一致了表示结束
finally
RecFileStream.Free; //释放文件流
end;
except
application.MessageBox('连接服务器失败,请检查您的设置!','错误',MB_ICONERROR);
application.Terminate;
end;
IdTCPClient1.Disconnect;
{启动 WinSock}
wVersionRequested := MAKEWORD(1, 1);
WSAStartup(wVersionRequested, wsaData);
{计算机名}
GetHostName(@s, 128);
p := GetHostByName(@s);
ClientName:=p^.h_Name; //计算机名
{IP地址}
p2 := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
ClientIP:=p2; //IP地址
WSACleanup;
PageControl1.ActivePageIndex:=0;
if FileExists(ExtractFilePath(paramstr(0))+'SalesInfo.dat') then
begin
myini:=Tinifile.Create(ExtractFilePath(paramstr(0))+'SalesInfo.dat');
ClientForm.Caption:=' 网吧商品销售平台客户端 '+'('+myini.ReadString('授权','UserInfo','授权给:顶尖高手网吧城')+')';
ClientForm.label2.Caption:=myini.ReadString('提示','NoteCaption','友情提示:请上机的同时保管好自己的物品,买东西时请准备好现金!');
MessageList:=TStringList.Create;
MessageList.Clear;
Combobox1.Clear;
myini.ReadSection('消息',MessageList);
for m:=0 to MessageList.Count -1 do
begin
Combobox1.Items.Add(myini.ReadString('消息',MessageList[m],''));
end;
MessageList.Free;
//获取'饮料'列表
DrinkList:=Tstringlist.Create;
DrinkList.Clear;
myini.ReadSection('饮料',DrinkList);
DrinkListview.Update;
DrinkListview.Clear;
for d:=0 to DrinkList.Count -1 do
begin
with DrinkListview.Items.Add do
begin
caption:=DrinkList[d];
subitems.Add(myini.ReadString('饮料',Drinklist[d],''));
end;
end;
Drinklist.Free;
//获取'食品'列表
Foodlist:=Tstringlist.Create;
Foodlist.Clear;
myini.ReadSection('食品',Foodlist);
FoodListview.Update;
Foodlistview.Clear;
for f:=0 to Foodlist.Count -1 do
begin
with Foodlistview.Items.Add do
begin
caption:=Foodlist[f];
subitems.Add(myini.ReadString('食品',Foodlist[f],''));
end;
end;
Foodlist.Free;
//获取'烟类'列表
Cigalist:=Tstringlist.Create;
Cigalistview.Update;
Cigalist.Clear;
myini.ReadSection('烟类',Cigalist);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -