📄 main.pas
字号:
unit main;
interface
uses
Windows, Messages, SysUtils, Winsock, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, ImgList, ToolWin, ExtCtrls, StdCtrls, XPMan, Menus,
Buttons;
const
WM_SOCKET_READ = WM_USER + 14;
type
TFrmMain = class(TForm)
ToolBar1: TToolBar;
ImageList1: TImageList;
ToolButton1: TToolButton;
StatusBar1: TStatusBar;
ToolButton2: TToolButton;
Panel_Left: TPanel;
Panel_Main: TPanel;
Memo1: TMemo;
ToolButton3: TToolButton;
Panel3: TPanel;
XPManifest1: TXPManifest;
GroupBox1: TGroupBox;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
BitBtn1: TBitBtn;
Label1: TLabel;
Label2: TLabel;
Edit2: TEdit;
Edit3: TEdit;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
Memo2: TMemo;
PopupMenu1: TPopupMenu;
N8: TMenuItem;
procedure Panel3Resize(Sender: TObject);
procedure ToolButton1Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ToolButton3Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure N8Click(Sender: TObject);
private
{ Private declarations }
hostname:string;
server_port:integer;
xl_hostent:phostent;
xl_sockaddrin:TSOCKADDRIN;
xl_socket: Integer;
psaddr:^longint;
saddr:integer;
Procedure LinkSock;
procedure InitSock;
procedure OnSocketRead(Var message: TMessage); message WM_SOCKET_READ;
public
{ Public declarations }
end;
TCarCache = Record
Pzh: String[10];
Cz: String[20];
Zs: Integer;
end;
var
FrmMain: TFrmMain;
implementation
{$R *.dfm}
procedure TFrmMain.Panel3Resize(Sender: TObject);
begin
Memo2.Width := Panel3.Width - 105;
BitBtn1.Left := Panel3.Width - 90;
end;
procedure TFrmMain.LinkSock;
Var
RET: Integer;
begin
server_port:=StrToInt(Edit3.Text);
hostname := Edit2.Text;
xl_sockaddrin.sin_port := htons(server_port);
xl_sockaddrin.sin_family := PF_INET;
xl_hostent := GetHostByName(PCHAR(HOSTNAME));
IF xl_hostent = nil then
begin
saddr := inet_addr(PCHAR(HOSTNAME));
if saddr <> -1 then
xl_sockaddrin.sin_addr.S_addr := saddr;
end
else
begin
psaddr := pointer(xl_hostent.h_addr_list^);
xl_sockaddrin.sin_addr.S_addr := psaddr^;
end;
xl_socket:=socket(PF_INET,SOCK_STREAM,0);
IF XL_SOCKET=INVALID_SOCKET THEN
begin
Application.MessageBox('SOCKET创建失败','注意',mb_ok);
end;
RET := CONNECT(xl_socket,xl_sockaddrin,sizeof(xl_sockaddrin));
if ret = socket_error then
begin
Application.MessageBox('SOCKET连接失败','注意',mb_ok);
ret:=closesocket(xl_socket);
if ret=0 then
Application.MessageBox('SOCKET释放成功!','注意',mb_ok);
end
else
begin
Application.MessageBox('SOCKET连接成功!','注意',mb_ok);
Panel_Main.Enabled := true;
//读取/关闭 事件
WSAAsyncSelect(xl_socket, FrmMain.Handle, WM_SOCKET_READ, FD_READ or FD_CLOSE);
end;
end;
procedure TFrmMain.ToolButton1Click(Sender: TObject);
begin
Panel_Left.Visible := ToolButton1.Down;
end;
procedure TFrmMain.InitSock;
Var
XL_WSADATA:TWSADATA;
RET:INTEGER;
begin
//初始化WinSock库
RET:=WSASTARTUP(MakeWord(2,2),XL_WSADATA);
IF RET<>0 THEN
begin
Application.MessageBox('初始化WInSock库失败!','错误信息',MB_OK);
end;
end;
procedure TFrmMain.FormDestroy(Sender: TObject);
begin
WSAcleanup;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
InitSock;
end;
{ TSockServer }
procedure TFrmMain.ToolButton3Click(Sender: TObject);
begin
CloseSocket(xl_socket);
StatusBar1.Panels[1].Text := '已断开';
ToolButton3.Enabled := false;
ToolButton1.Enabled := true;
end;
procedure TFrmMain.BitBtn1Click(Sender: TObject);
var
Buff: String[100];
i: Integer;
begin
{Buff.Pzh := 'JA-88888';
Buff.Cz := '国务院';
Buff.Zs := 4; }
for i := 0 to Memo2.Lines.Count - 1 do
begin
Buff := Memo2.Lines[i];
Send(xl_socket,Buff,sizeof(Buff),0);
end;
Memo2.Clear;
end;
procedure TFrmMain.OnSocketRead(var message: TMessage);
Var
Buff: String[100];
RET: Integer;
begin
CASE WSAGETSELECTEVENT(message.lParam) OF
FD_READ:
begin
Ret := Recv(xl_socket,Buff,Sizeof(Buff),0);
if Ret = SOCKET_ERROR then
begin
showmessage('Read Error!');
end
else if Ret > 0 then
begin
{Memo1.Lines.Add('========== Server Call Back ============');
Memo1.Lines.Add('牌照号:' + Buff.Pzh);
Memo1.Lines.Add('车 主:' + Buff.Cz);
Memo1.Lines.Add('轴 数:' + IntToStr(Buff.Zs));
Memo1.Lines.Add('========== Call Back End ============'); }
Memo1.Lines.Add(Buff);
end;
end;
FD_CLOSE:
begin
StatusBar1.Panels[1].Text := '已断开';
ToolButton3.Enabled := false;
ToolButton1.Enabled := true;
end;
end;
end;
procedure TFrmMain.BitBtn3Click(Sender: TObject);
begin
ToolButton1.Down := false;
ToolButton1.Click;
end;
procedure TFrmMain.BitBtn2Click(Sender: TObject);
begin
LinkSock;
ToolButton1.Down := false;
ToolButton1.Click;
StatusBar1.Panels[1].Text := '已连接';
ToolButton3.Enabled := true;
ToolButton1.Enabled := false;
end;
procedure TFrmMain.N8Click(Sender: TObject);
begin
Memo1.Clear;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -