میخوام برنامه من قابلیت چت مثل یاهو رو داشته باشه به عبارتی بتونه در یک زمان با n نفر (که البته n تو برنامه من 255 تفر است) چت کنه .
به این صورت عمل کردم :
ابتدا یک ارایه از نوع فرم چت ساخته شده ، ساختم :
کد:
_ChatForms : array[1 .. 255] of TFrmChat;
حالا یکی از کاربرا قصد میکنه که با دیگری چت کنه . با استفاده از تابع زیر اولین فرم خالی پیدا میشه ، ساخته میشه و مشخصات tcpServer طرف مقابل به TcpClintی که در فرم چت قرار داره ست میشه .
function createChatForm(DestUid :int64; DestFormId:integer; DefoultMsg:string):integer;
var i : integer;
begin
for i:=1 to 255 do
begin
if _ChatForms[i]=nil then
begin
Application.CreateForm(TFrmChat, _ChatForms[i]);
_ChatForms[i].DestUid := DestUid ;
_ChatForms[i].DestFormId := DestFormId;
_ChatForms[i].SourceFormId := i;
_ChatForms[i].DefoultMeg := DefoultMsg;
_ChatForms[i].Show;
Result := 1;
exit;
end;
if i=255 then
Result := 0;
end;//for
end;
حالا سعی میکنه یه پیامی ارسال کنه به شکل زیر
var Lst : TStrings;
begin
try
IdTcpClientChat.Connect();
try
lst := TStringList.Create;
Lst.Add(IntToStr(MdlData.QryUsers['Uid'])) ;
Lst.Add(IntToStr(SourceFormId));
Lst.Add(IntToStr(DestFormId));
Lst.Add(EdtMsg.Text);
IdTcpClientChat.WriteStrings(Lst);
IdTcpClientChat.Disconnect;
finally
Lst.Free;
end;
except
ShowMessage('You can not connect now.');
end;
end;
که در کد بالا شماره اندیس ارایه ای که به فرم طرف مقابل نسبت داده شده ارسال میشه . که چون هنوز چیزی نیست مقدارش الان صفر میشه .
حالا در طرف مقابل زمانی که پیامی رو دیافت میکنه کد زیر اجرا میشه
var Lst :TStrings;
DestUid:int64;
DestformId, SourceFormId : Integer;
Msg : string;
begin
try
Lst := TStringList.Create;
AThread.Connection.ReadStrings(Lst, 4);
DestUid := StrToInt(Lst.Strings[0]);
DestformId := StrToInt(Lst.Strings[1]);
SourceFormId := StrToInt(Lst.Strings[2]);
Msg := Lst.Strings[3];
if (SourceFormId = 0 ) or (_ChatForms[SourceFormId]=nil) then
begin
createChatForm(DestUid, DestformId, Msg);
end
else
begin
end;
finally
Lst.Free;
end;
که البته فعلا کامل نیست اما در همین حد یه مشکلی داره .
خوب حالا اندیس فرمش رو میخونه اگر صفر باشه یا اون خونه از ارایه خالی باشه باید یک فرم جدید براش ساخته بشه .
که اینجا ساخته میشه اما نشون داده نمیشه دیگه .
بعد از بستن برنامه هم یه خطای داغون میده .
چرا ؟