نمایش نتایج 1 تا 2 از 2

نام تاپیک: نوشتن برنامه چت با indy با قابلیت ها یی همچون یاهو

  1. #1

    نوشتن برنامه چت با 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;


    که البته فعلا کامل نیست اما در همین حد یه مشکلی داره .
    خوب حالا اندیس فرمش رو میخونه اگر صفر باشه یا اون خونه از ارایه خالی باشه باید یک فرم جدید براش ساخته بشه .
    که اینجا ساخته میشه اما نشون داده نمیشه دیگه .
    بعد از بستن برنامه هم یه خطای داغون میده .
    چرا ؟

  2. #2

    نقل قول: نوشتن برنامه چت با indy با قابلیت ها یی همچون یاهو

    شاید پست بالا یه مقداری مفهمو نباشه در نتیجه یک نمونه ساده از اون چیزی که عملا انجام میشه رو نوشتم تا ارسال کنم .
    در کد پایین دو فرم داریم .
    و یک ارایه از نمونه فرم دوم.
    به ازای هر پیغامی که دریافت میشه باید یه نمونه از فرم 2 ساخته بشه و توی اون نشون داده بشه که این کار انجام نمیشه .
    نمونه برنامه رو میزارم .
    ممنون .
    فایل های ضمیمه فایل های ضمیمه

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •