نوشتن برنامه چت با indy با قابلیت ها یی همچون یاهو
میخوام برنامه من قابلیت چت مثل یاهو رو داشته باشه به عبارتی بتونه در یک زمان با 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;
که البته فعلا کامل نیست اما در همین حد یه مشکلی داره .
خوب حالا اندیس فرمش رو میخونه اگر صفر باشه یا اون خونه از ارایه خالی باشه باید یک فرم جدید براش ساخته بشه .
که اینجا ساخته میشه اما نشون داده نمیشه دیگه .
بعد از بستن برنامه هم یه خطای داغون میده .
چرا ؟
1 ضمیمه
نقل قول: نوشتن برنامه چت با indy با قابلیت ها یی همچون یاهو
شاید پست بالا یه مقداری مفهمو نباشه در نتیجه یک نمونه ساده از اون چیزی که عملا انجام میشه رو نوشتم تا ارسال کنم .
در کد پایین دو فرم داریم .
و یک ارایه از نمونه فرم دوم.
به ازای هر پیغامی که دریافت میشه باید یه نمونه از فرم 2 ساخته بشه و توی اون نشون داده بشه که این کار انجام نمیشه .
نمونه برنامه رو میزارم .
ممنون .