Q&A

  • 챗팅구현시 대화창 여러개 띠우기
챗팅을 공부 삼아서 구현해 볼려고 하는데요...궁금한 점이 있습니다.

예를들어 msn 메신저에서 대화상대를 선택하고 더블클릭하면 상대방과의 대화할수 있는
대화창이 화면에 생성되잖아요.. 요부분이 궁금합니다.
1:1 채팅이라면 미리 정적으로 준비해둔 대화창 폼을 모달리스로 띄우면 될것같은디.
만약 n:n 이라면 각기 대화 상대하고의 대화창이 생성되어야 하잖아요....
미리 준비해둔 대화창폼을 어떻게 하면 여러번 생성할 수 있을까요? 상속 같은 방법이 필요한건가요? 일종의 표준 템플릿이 필요하다고 생각되는데요.. 방법좀 자세히 부탁드립니다.
2  COMMENTS
  • Profile
    이중철 2004.09.22 20:28
    쩝 그냥 뛰우세요
      TA : Main폼
      TB : 클라이언트 폼(대화폼) Public 또는 Property 속성에 ID추가

    예)  A에서
          대상아이디 클릭시

          for i := 0 to Screen.FormCount - 1 do
            if Self.Forms[i] as TB then
               if Self.Forms[i] as TB.ID = '대상아이디' then
                begin
                   Self.Forms[i] as TB.Show;
                   exit;
                end;  
           //위에서 없으니 생성
           With TB.Create(Self) do
           begin
               ID := 대상아이디
                    ...
               Show;
           end;

            대상아이디에서 메세지 수신(WriteMessage 가상으로 만든 메소드 또는 함수)
          for i := 0 to Screen.FormCount - 1 do
            if Self.Forms[i] as TB then
               if Self.Forms[i] as TB.ID = '대상아이디' then
                begin
                   Self.Forms[i] as TB.Show;
                   Self.Forms[i] as TB.WriteMessage(메세지);
                   exit;
                end;  
           //위에서 없으니 생성
           With TB.Create(Self) do
           begin
               ID := 대상아이디
                    ...
               Show;
               WriteMessage(메세지);
           end;
          


    무슨 이야기인지 아시겠죠

    그냥 뛰우세요 아무생각없이(클라이언트 Close에 Cafree  필수,
    또한, Project 옵션 클라이언트폼은 제거하는것도 필수?(있어도 무방하
    지만 메모리 낭비))

    그리고 제어는 담과 같이
          for i := 0 to Screen.FormCount - 1 do
            if Self.Forms[i] as TB then
               if Self.Forms[i] as TB.ID = '대상아이디' then
                begin
                   .....(알아서 하심됨)
                end;  


    참 될수 있으면 Fnction 으로 만드세요 이것도 쓸까
    Function GetChildFormWithID(ID : string) : TB;
    var i : integer;
    begin
         Result := nil;
          for i := 0 to Screen.FormCount - 1 do
            if Self.Forms[i] as TB then
               if Self.Forms[i] as TB.ID = '대상아이디' then
                begin
                   Result := Self.Forms[i];
                   exit;
                end;  
           With TB.Create(Self) do
           begin
               ID := 대상아이디;
                ...
                Result := Self;
           end;
        


    end;

  • Profile
    김춘경 2004.09.22 18:34
    폼을 배열로 잡아 실시간에 생성해서 사용하면 되지 않을까요...

    예를 들어 화면에서 키보드를 구현한다고 가정할 때, 폼 위에 모든 버튼을 디자인 타임에 깔아 놓을 수도 있겠지만, 이건 정말 무식한 방법이겠지요...^^

    일일이 모든 이벤트에 코딩도 반복해야 되고....

    그래서 TButton을 1차원 배열 전역변수로 선언하고 메인폼의 Create 부분에서 배열을 실시간으로 생성해 줍니다.

    물론 Click, KeyPress, KeyDown 같은 이벤트도 컴포넌트 생성시에 만들어야 합니다. 해당 컴포넌트의 모든 이벤트를 만들 필요는 없고 자신이 필요한 이벤트만 만들면 됩니다.

    컴포넌트 실시간 생성 방법은 팁란이나 묻고 답하기에 많이 나와 있습니다.

    그걸 응용해서 대화창을 배열로 만들고, 새로운 대화명을 클릭했을 때 대화창 배열을 검색해서 현재 닫혀 있는 폼을 띄우면 될 것 같습니다.

    아래는 버튼을 생성하는 예제입니다. 참고하세요.


      private
        { Private declarations }
        procedure Create_NUMKEY;
        procedure KeyButtonClick(Sender: TObject);
    WM_NCHITTEST;
      public
        { Public declarations }
      end;

    var
      frmCard: TfrmCard;

    implementation

    {$R *.DFM}

    const
      Card_QTY_ = 25;

    var
      NUMKEY_BTN: array[1..Card_QTY_] of TSpeedButton;

    //----------------------------------------------------------------
    //   카드종류키  : 버튼 생성
    //----------------------------------------------------------------
    procedure TfrmCard.Create_NUMKEY;
    var
      bTop, bLeft, i: integer;
    begin
      bLeft := 10;
      bTop  := 7;
      for i := 1 to Card_QTY_ do begin
        NUMKEY_BTN[i] := TSpeedButton.Create(Self);
        with NUMKEY_BTN[i] do begin
          Parent      := pnlKeypad;
          Color       := clWhite;
          Height      := 50;
          Tag         := i;
          Top         := bTop;
          Left        := bLeft;
          Width       := 130;
          Caption := _CardNames[i];

          if i mod 7 =0 then begin
            bLeft := bLeft +132;
            bTop := 7;
          end else bTop := bTop +52;
          OnClick     := KeyButtonClick;
        end;
      end;
    end;

    //--------------------------------------------------------------------
    //   화면 카드종류 키 클릭 처리
    //--------------------------------------------------------------------
    procedure TfrmCard.KeyButtonClick(Sender: TObject);
    var
      TempButton: TSpeedButton;
      ClickBtn: integer;
      s: string[2];
    begin
      TempButton := TSpeedButton(Sender);
      ClickBtn := TempButton.Tag;   <-- 몇번째 버튼이 클릭되었는지 배열번호


    end;

    //--------------------------------------------------------------------
    //   화면 생성
    //--------------------------------------------------------------------
    procedure TfrmCard.FormCreate(Sender: TObject);
    begin
      SetBounds(0, 0, 305, 405);
      SetWindowLong(Handle, GWL_STYLE, GetWindowLong(Handle, GWL_STYLE) and not WS_CAPTION);
      ClientHeight := Height;

      Panel1.Align := alClient;
      pnlKeypad.Align := alClient;

      Create_NUMKEY;
    end;