Q&A

  • 판넬위에 엑셀을 올렸을 때 종료 시키는 법?
폼을 하나 만들고 판넬을 하나 얹었습니다.
판넬 위에 엑셀을 불러 앉힌 다음 이런저런 작업을 하고 난 뒤
폼을 닫으면 엑셀이 그냥 살아있습니다.

질답란이며 자료란, 강좌란 등을 다 뒤져가며 참고로 이리저리 고쳐보았는 데
도무지 답이 안나옵니다.

좀 도와주십시오.
소스입니다.

////////////////
procedure TExcel_Frm.SpeedButton56Click(Sender: TObject);
var
c_Day : String;
XLAPP, WBK, WS : Varient;
begin
               c_Day := Copy(DateEdit1.Text, 1, 4) + Copy(DateEdit1.Text, 6, 2) + Copy(DateEdit1.Text, 9, 2);

     DateQuery.DisableControls;
     Try
     with DateQuery do begin
     Close;
     DateQuery.SQL.Clear;
     DateQuery.SQL.ADD('Select * From F1Data');
     DateQuery.SQL.ADD('Where Fdate = "' + c_Day + '"');
     DateQuery.SQL.ADD('Order by Fcode');
     DateQuery.Open;
     Open;
     end;
     finally
     DateQuery.EnableControls;
     end;

     if OpenDLG.Execute then begin
          if DateQuery.RecordCount > 0 then begin
               try
                    XLAPP := CreateOLEObject('Excel.Application');
               except
                    Application.MessageBox ( '엑셀을 열 수 없습니다' + chr(13) +
                            '엑셀이 설치되어있는지 확인하십시요' , '알림' , MB_OK ) ;
                    Result := 0;
                    Exit;
               end;


               Try
                    XLAPP.Visible         := True;
                    XLAPP.DisplayAlerts   := False;

                    WBK   :=  XLAPP.WorkBooks.Open(OpenDLG.FileName);
                    WBK   :=  XLAPP.WorkBooks.item[1];
                    WS := WBK.Worksheets.Item['d' + IntToStr(StrToInt(Copy(DateEdit1.Text, 9, 2)))];
                    WS.Activate;


                    ///// 판넬 위에 얹히는 부분. 이 부분을 없애면 엑셀이 독자적으로 실행. 반드시 판넬 위에서 실행되어야 함
                    Wnd := findwindow('XLMain', nil );
                    Windows.SetParent(wnd, Panel1.Handle); //Panel1.Handle
                    SetWindowPos( wnd, Panel1.Handle , 0, -26, Panel1.clientwidth, Panel1.clientheight , SWP_NOZORDER or sWP_SHOWWINDOW );  
                    


...... 실제 작업을 하는 곳



                    //XLAPP.WorkBooks.Close;   // 이곳을 살리면 엑셀이 죽어버림
                    //XLAPP.quit;
                    //XLAPP := unassigned;
               Except
                    on err : exception do  begin
                    XLAPP.WorkBooks.Close;
                    XLAPP.quit;
                    XLAPP := unassigned;
                    ShowMessage('작업이 취소되었습니다. Data확인요망-'+err.message);
               end;

          end;
          end
          else begin
               Application.MessageBox ( 어쩌구저쩌구 + chr(13) +
                            '확인해주십시오' , '알림' , MB_OK ) ;
          end;
     end;
end;

2  COMMENTS
  • Profile
    최용일 2006.05.30 22:22
    안녕하세요. 최용일입니다.

    엑셀은 다뤄본지 오래되서...

    XLAPP.Quit;

    하시면 될겁니다.

    ^^ 항상 즐코하세요...

  • Profile
    황채현 2006.06.01 20:57
    우선 답변에 감사드리구요.
    XLAPP.Quit;를 어디에 넣어야 하는 지...

    예제를 보시면 아시겠지만
    try
       ... 작업하고
       ...
       XLAPP.Quit;   // 이렇게 하면 엑셀 창이 판넬위에 있어야 하는 데 엑셀이 실행되지말자 바로
       죽어버립니다. 다른 작업을 할 여유도 주지않고 말입지요.
    Except
       ...
    end;


    판넬 위에 얹지않고 독립된 창으로 실행하면 XLAPP.Quit;를 사용하면 프로그램을 닫을 때 엑셀이 죽죠. 문제는 현재 엑셀의 실행 위치가 폼위에 얹힌 판넬의 위라는 거거든요.

    try
       .... 작업

    except

    end;
    이렇게 했을 때 엑셀을 열고 무언가 엑셀 작업을 하고 엑셀을 종료했을 때 폼은 살아있고 엑셀만 없어져야 하는 데 도무지....

    죄송합니다만 방법이 없을까요? 독립 실행이 아닌 판넬 위에서 실행하고 죽이는 방법이....?