⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 client.pas

📁 网吧商品销售平台
💻 PAS
📖 第 1 页 / 共 2 页
字号:
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 + -