메인폼에서 서브폼을 생성하고
서브폼에서 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;
하루종일 이것가지고 씨름하다 이렇게 질문올립니다.
그럼 부탁합니다.
소스가 길어서 대충만 봤는데 맞을지 모르겟군요..
일단 메인폼에서 버튼을 누르면 전송을 하는걸로 보이는군요..
루틴을 제대로 봐야 하겠지만 일단 의심스러운건 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;
뭐 이런식으로요 물론 메세지는 정의하시고 프로시져도 만들어주시구요
그럼..