[CODE]
Код:
unit Client;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Winsock, StdCtrls,NB30, ExtCtrls;
type
TDynStringArray = array of string;
type
TMainForm = class(TForm)
Button1: TButton;
Memo1: TMemo;
Button2: TButton;
Edit1: TEdit;
Panel1: TPanel;
Panel2: TPanel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Panel1Click(Sender: TObject);
Private
Public
//procedure Connect;
function GetIPFromHost(const HostName: string): string;
procedure SendData(Data: String);
procedure ReceiveData(Socket: TSocket; Buffer: PByte);
function Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
end;
var
MainForm: TMainForm;
Close1: Boolean;
hPort: Integer;
hHost: String;
trid,trid2 : thandle;
hSocket: TSocket;
Addr: TSockAddrIn;
wsaData: TWSAData;
implementation
{$R *.dfm}
procedure TMainForm.ReceiveData(Socket: TSocket; Buffer: PByte);
var
Data,decodeData: String;
strArr: TDynStringArray;
begin
Data := String(Buffer);
Data := Trim(Data);
decodeData:=decode(Data);
if Length(decodeData) > 0 then
begin
StrArr := Explode('|', decodeData);
if StrArr[0] = 'MSGBOX' then
begin
MessageBox(0,pchar(StrArr[1]),'System Message',MB_OK + MB_ICONINFORMATION)
end
else
if StrArr[0] = 'show' then
begin
panel1.visible:=false;
panel2.visible:=true;
end
else
if StrArr[0] = 'off' then
begin
Exitprocess(0);
end;
end
else
showmessage('Length(Data) = 0');
end;
procedure Connect;
var
Buffer: Array[0..8192] Of Char;
iRecv: Integer;
Begin
if (WSAStartup($0202, wsaData) <> 0) then
begin
Exit;
end;
Close1 := False;
repeat
hSocket := Socket(AF_INET, SOCK_STREAM, 0);
Addr.sin_family := AF_INET;
Addr.sin_port := htons(hPort);
Addr.sin_addr.S_addr := INET_ADDR(PChar(MainForm.GetIPFromHost(hHost)));
if (Winsock.Connect(hSocket, Addr, SizeOf(Addr)) = 0) then
begin
MainForm.SendData('ADDNEW|');
ZeroMemory(@Buffer, SizeOf(Buffer));
iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
while ((iRecv > 0) and (iRecv <> INVALID_SOCKET)) do
begin
MainForm.ReceiveData(hSocket, @Buffer);
ZeroMemory(@Buffer, SizeOf(Buffer));
iRecv := Recv(hSocket, Buffer, SizeOf(Buffer), 0);
end;
CloseSocket(hSocket);
end;
Sleep(3000);
until (Close1);
WSACleanup();
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
SendData('MESSAGE|' +edit1.Text);
end;
function TMainForm.GetIPFromHost(const HostName: string): string;
type
TaPInAddr = array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
begin
Result := '';
phe := GetHostByName(PChar(HostName));
if phe = nil then Exit;
pPtr := PaPInAddr(phe^.h_addr_list);
i := 0;
while pPtr^[i] <> nil do
begin
Result := inet_ntoa(pptr^[i]^);
Inc(i);
end;
end;
function TMainForm.Explode(const Separator, S :String; Limit :Integer = 0): TDynStringArray;
var
SepLen: Integer;
F, P: PChar;
begin
SetLength(Result, 0);
if (S = '') or (Limit < 0) then
Exit;
if Separator = '' then
begin
SetLength(Result, 1);
Result[0] := S;
Exit;
end;
SepLen := Length(Separator);
P := PChar(S);
while P^ <> #0 do
begin
F := P;
P := AnsiStrPos(P, PChar(Separator));
if (P = nil) or ((Limit > 0) and (Length(Result) = Limit - 1)) then
P := StrEnd(F);
SetLength(Result, Length(Result) + 1);
SetString(Result[High(Result)], F, P - F);
F := P;
if P = Separator then
SetLength(Result, Length(Result) + 1);
while (P^ <> #0) and (P - F < SepLen) do
Inc(P);
end;
end;
procedure TMainForm.SendData(Data: String);
var
Len: LongInt;
begin
Len := Length(Data);
Send(hSocket, Data[1], Len, 0);
end;
procedure TMainForm.Button1Click(Sender: TObject);
begin
hHost :='127.0.0.1';
hPort := 123;
createthread(nil,0,@Connect,0,0,trid);
end;
end.
//проблема в том что после обработки этого кода все виснет а точнее форма
можно обрабатывать только переменные и меседжи а если какой то объект вот как на примере панель то виснет в чем трабла ?
if StrArr[0] = 'show' then
begin
panel1.visible:=false;
panel2.visible:=true;
end