Q&A

  • 자신의 폼을 자기가 닫으려는데 문제가.
메인폼에서 서브폼을 생성하고
서브폼에서 Grid에서 선택된 항목을
FTP로 전송하는 프로그램을 만들고 있습니다.
FTP전송를 할때는
전송량을 표시하는 게이지를 보여서 전송하고
전송이 끝난다음에는
Form을 닫으려고 하는데요 폼이 그대로 남아있어서요..
어떻게 해야하는지 문의 드립니다.

각 부분의 소스는 다음과 같습니다.

//서브 폼에서 전송 버튼을 눌렀을때 입니다.
procedure TformAutoMgr.btnSingleTransClick(Sender: TObject);
var
   MediaTrans : TTransform;
   STransData : array of TTransData;
begin
   SetLength(STransData,1);

   with AutoNonGrid.DataSource.DataSet do
   begin
      STransData[0].BrdID := FieldByName('F_BRD_ID').AsString;
      STransData[0].SaveFile := FieldByName('F_SAVE_FILE').AsString;
   end;
   MediaTrans := TTransform.Create(self);
   MediaTrans.SetBrdType(true); //자동방송
   MediaTrans.SetTransData(STransData,1);
   MediaTrans.ShowModal;
   RefreshNonRegGrid;
end;

//전송 폼이 시작되면 전송을 바로 시작하기 위해서
//OnShow에서 수행을 합니다.
procedure TTransform.FormShow(Sender: TObject);
begin
   if bBrdType then
      TransFileAutoBrd
   else
      TransFileEmBrd;
end;


//FTP를 이요해서 서버에 전송을 하는 부분입니다.
//이부분에서 Close를 사용해서 닫았습니다.
procedure TTransform.TransFileAutoBrd;
var
   i, nCount : integer;
   bTransSucc : Boolean;
   strFileName : string;
   strBrdID : string;
begin
   nCount := m_nScheCount;
   bTransSucc := false;
   for i := 0 to nCount-1 do
   begin
      strFileName := m_aScheArray[i].SaveFile;
      strBrdID := m_aScheArray[i].BrdID;
      lTransFile.Caption := strFileName + ' 파일이 전송중입니다.';
      bTransSucc := TransServer(strFileName);
      if not bTransSucc then
         Break;

      DataCtrl.UpdateBrdScheRegState(strBrdID,bTransSucc);
   end;

   if not bTransSucc then
   begin
      ShowMessage('파일 전송에 실패하였습니다.');
   end
   else
   begin
      ShowMessage('파일 전송에 성공하였습니다.');
      self.Close;
   end;
end;


//실질적인 FTP 전송부 입니다.
function TTransform.TransServer(AFileName:string):Boolean;
var
   LocalPath : string;
   LocalFileName : string;
begin
   Result := false;
   if IdFTPClient.Connected then
      IdFTPClient.Quit;

   with IdFTPClient do
   try
      Username := msMediaID;
      Password := msMediaPass;
      Host := msMediaIP;
      Port := StrToInt(msMediaPort);
      Connect;
   except
      ShowMessage('미디어 서버 접속에 실패하였습니다.');
   end;

   if IdFTPClient.Connected then
   begin
      LocalPath := msLMediaPath;
      LocalFileName := LocalPath+'\'+AFileName;
      if not FileExists(LocalFileName) then
      begin
         ShowMessage('<'+AFileName+'> 파일이 존재하지 않습니다.');
         Exit;
      end;

      IdFTPClient.Put(LocalFileName,AFileName);
      IdFTPClient.Disconnect;
      Result := true;
   end;
end;

하루종일 이것가지고 씨름하다 이렇게 질문올립니다.
그럼 부탁합니다.
1  COMMENTS
  • Profile
    하얀까마귀 2004.07.29 03:34
    안녕하세요 하얀까마귀 입니다.

    소스가 길어서 대충만 봤는데 맞을지 모르겟군요..

    일단 메인폼에서 버튼을 누르면 전송을 하는걸로 보이는군요..

    루틴을 제대로 봐야 하겠지만 일단 의심스러운건 FormShow 입니다.

    FormShow는 아시겠지만 폼이 보여질때 발생되는 이벤트죠

    그런데 여기서 다운로드를 받으시는거고 또 해당이벤트에서 닫는걸로
    보이네요 맞는가요? ㅎㅎ

    이걸 메세지로 처리해 보세요..

    예를들면
    procedure Form1.FormShow..
    begin
      Close;
    end;
    라고 하면 안되거든요? 이렇게 되면 닫힐것 같지만 폼종료 안됩니다.

    이렇게 하면 되죠
    procedure TForm1.FormShow(...);
    begin
      PostMessage(self.handle, WM_Close, 0, 0);
    end;
    폼이 보여질때 다시 메세지를 보내는거니까. 프로시져가 끝난다음이겟죠?

    다시 설명드리면 님은 formShow라는 이벤트내에서
    '전송' 이라는 프로시져를 실행했는데 이 프로시져 내부에서 close를 발생
    시켜서 닫히질 않는것으로 보이네요..

    따라서 종료시키는걸 위처럼 바꾸면 잘 동작 되겠지만 그것보다는
    전송시키는것 자체를 메세지로 바꿔주는게 더 좋을듯 하네요.
    예를들면
    procedure TForm1.FormShow(..);
    begin
      SendMEssage(self.Handle, MYM_TRANSFILE, 0, 0);
    end;
    뭐 이런식으로요 물론 메세지는 정의하시고 프로시져도 만들어주시구요

    그럼..