Q&A

  • sendmessage 를 쓸때요 sendmessage 를 여러번 쓰면 프로그램이종료 되는데요 어떻게..?
Frm9001 폼
...
procedure TFrm9001.StringGrid1DblClick(Sender: TObject);
var
//  jumun : Jumun_List;
  IRow,ICol : integer;
begin
try
  Irow := StringGrid1.Row;
  ICol := StringGrid1.col;
  
//  UH_FRM8001 := 0;

//  if UH_FRM8001 < 0 then
    UH_FRM8001 := Windows.FindWindow(pchar('Tfrm8001'),PChar('주문'));
//  else
  if UH_FRM8001 > 0 then
   begin
     if trim(StringGrid1.Cells[8,IRow]) = '미체결' then
     begin
       jumun.Accno    := trim(ComboBox4.text);
       if MaskEdit3.Text <> '' then
         jumun.Passwd   := trim(MaskEdit3.Text)
       else
       begin
         showmessage('비밀번호를 입력하세요');
         exit;
       end;
       jumun.Number    := '2';
       jumun.CodeNum  := trim(StringGrid1.Cells[10,IRow]); //6자리
       if trim(StringGrid1.Cells[0,IRow]) <> '' then
         jumun.Orderno   := trim(StringGrid1.Cells[0,IRow])
       else
       begin
         showmessage('주문번호가 없습니다.');
         exit;
       end;
       windows.SendMessage(UH_FRM8001,JONGMOK_CODE,WPARAM(9001),LPARAM(@jumun));
     end
     else
     begin
       showmessage('체결된것은 정정할수 없습니다');
       exit;
     end;
   end;
//FreeMemory(@jumun);
except
showmessage('try StringGrid1DblClick except 9001');
end;
end;  


Frm8001 폼
....
Procedure TFrm8001.OnJONGMOKFind(var MSG: TMessage);
var
//   jumun : ^Jumun_List;
   i    : integer;
   temp_Boolean : boolean;
   Jumun_Number, jumun_Accno, jumun_Passwd, jumun_CodeNum,
   jumun_Orderno : string;
begin
try
  jumun := Pointer(MSG.LParam);

  Jumun_Number  := jumun.Number;
  jumun_Accno   := jumun.Accno;
  jumun_Passwd  := jumun.Passwd;
  jumun_CodeNum := jumun.CodeNum;
  jumun_Orderno := jumun.Orderno;

  U_Jong_Code := '';
  temp_boolean := true;
  if msg.WParam = 9001 then //체결조회화면
//  if StrTOint(jumun_Number) < 5 then //체결조회에서 더블클릭한경우
  begin
    case StrToint(jumun_Number) of
      1 : //매도
      begin
        PageControl1.ActivePageIndex := 1;
        for i := 0 to ComboBox3.Items.Count -1 do
        begin
          if (trim(ComboBox3.Items[i]) = trim(jumun_Accno)) then
          begin
            ComboBox3.ItemIndex := i;
            temp_boolean := false;
            break;
          end;
//          temp_boolean := true;
        end;
        if temp_Boolean then
        begin
          showmessage('해당계좌가없습니다. 확인하세요');
          exit;
        end;
        MaskEdit7.Text := jumun_Passwd;
        U_Jong_Code     := jumun_CodeNum;
        Orderno         := jumun_Orderno;
        PageControl1Change(PageControl1);
      end;
      2 : // 정정
      begin
        PageControl1.ActivePageIndex := 2;
        for i := 0 to ComboBox10.Items.Count -1 do
        begin
          if (trim(ComboBox10.Items[i]) = trim(jumun_Accno)) then
          begin
            ComboBox10.ItemIndex := i;
            temp_boolean := false;
            break;
          end;
//          temp_boolean := true;
        end;
        if temp_Boolean then
        begin
          showmessage('해당계좌가없습니다. 확인하세요');
          exit;
        end;
        MaskEdit10.Text := jumun_Passwd;
        U_Jong_Code     := jumun_CodeNum;
        Orderno         := jumun_Orderno;
        PageControl1Change(PageControl1);
      end;
    end;
  end
  else if msg.WParam = 1001 then //예측신호화면
  begin
    case PageControl1.activepageindex of
      0 : MaskEdit4.text := jumun_CodeNum;
  end;
end;

Frm9001 폼의 스트링그리드에서 더블클릭해서 센드메세지를 여러번 보내면
Frm8001 폼에서 몇번을 잘 되는데 몇번이상 넘어가면 프로그램에 종료가 됩니다 어떻게 해야 할지 부탁드립니다.
그리고 메모리 해제를 해보라고 했는데
freemem, freemomery(@jumun) 이런식으로 해봤는데 똑 같더군요
1  COMMENTS
  • Profile
    장용준 2003.04.08 20:51


    제 생각에는 보내주는쪽에서 그리드를 여러번 메시지를 보낼수 있네요..
    즉 보내는쪽에서 메시지를 보내고 받는쪽에서 메시지를 받아 처리중일때 다시 메시지를 보낼수 있군요..

    받는쪽에서 메시지를 받아 처리하는중에 다시 메시지가 들어와서
    헝클어 놓는것 같군요...

    전역 변수 하나 주어서 처음시작때 false 주고 false가 아니면 빠져나가고 sendmessage 밑에 true 주면
    sendmessage 끝날때 까지 한번만 실행 되겠금 하면 되겠네요..

    아니면 제가 예전에 했던 방법인데
    받는쪽에 메시지큐를 만들어 메시지를 저장했다가 순차적으로
    처리 하는 방법도 있으니 참고하세요 ...

    그럼 성공하시길 ~~