Q&A

  • 엑셀을 StringGrid에 올리면 Paradox DB 연결이 끊어집니다...(소스포함)
<!--CodeS-->
var
  XL, ExcelBook, ExcelSheet : Variant;
  intCnt, i, j : integer;
begin
   try
      //엑셀을 실행
      XL := CreateOLEObject('Excel.Application');
   except
      ShowMessage('Excel이 설치되어 있지 않습니다!!!');
      Exit;
   end;

   Try
      XL.Visible := False;
      XL.DisplayAlerts := False;
      if OpenDialog1.Execute then begin
         MeResult.Clear;
         MeResult.Lines.Add('파일을 읽어드립니다.');
         lbFile.Caption  := '파일 : ' + OpenDialog1.FileName;
         lbCount.Caption := '자료건수 : ' + '0건';
         ExcelBook := XL.WorkBooks.Open(OpenDialog1.FileName);
         ExcelBook := XL.WorkBooks.item[1]; //워크 쉬트 설정

         ExcelSheet := ExcelBook.Worksheets.Item[1];

         SExGrid.RowCount := ExcelSheet.UsedRange.Rows.count;
         SExGrid.ColCount := ExcelSheet.UsedRange.Columns.count;
        
         ProgressBar1.max := ExcelSheet.UsedRange.Rows.count;
         ProgressBar1.Position := 0;
         For I := 1 to ExcelSheet.UsedRange.Rows.count do begin
             if Trim(XL.cells[I,1].formula)  = '' then begin
                SExGrid.RowCount := j - 1;
                lbCount.Caption := '자료건수 : ' + FormatFloat('###,##0건', j-2);
                Break;
             end;
             For J := 1 to ExcelSheet.UsedRange.Columns.count do
                 SExGrid.Cells[J,I-1] := VarToStr(ExcelSheet.Cells[I,J]);  //스트링그리드에 뿌리기
             ProgressBar1.Position := I;
         end;
         MeResult.Lines.Add(IntToStr(ExcelSheet.UsedRange.Rows.count) + '건의 자료를 변환하였습니다');
         XL.WorkBooks.Close;
         XL.quit;
         XL := unassigned;
         if bCheckExcelFile = False then begin
            MessageDlg('정상적인 엑셀 파일이 아닙니다.', mtInformation,[mbOK], 0);
            ClearGrid;
         end;
      end;
   Except
      on err:exception do begin
         XL.WorkBooks.Close;
         XL.quit;
         XL := unassigned;
         ShowMessage('작업이 취소되었습니다. Data확인요망-'+err.message);
      end;
   end;
   ProgressBar1.Position := 0;
end;
<!--CodeE-->
이게 올리는 폼인데 무슨 문제가 있는지 모르겠네요
스트링 그리드에 올리기만 하면 파라독스 .db파일을 못찾습니다.
2  COMMENTS
  • Profile
    nilriri™ 2005.02.24 00:08
       if OpenDialog1.Execute then begin

    이부분이 실행된후에 프로그램의 현재 디렉토리(용어선택이 이해가 가시는지..^^)가 변경이 되어서 그렇습니다.

    그러니까..

    프로그램 내부에서 listbox.items.loadfromfile('aaa.txt');  라고 햇을때..

    기본적으로 프로그램에서 프로그램이 현재 실행된 디렉토리 에서 aaa.txt를 찾게 됩니다.

    하지만    if OpenDialog1.Execute then  가 실행된후에 기본 디렉토리가 바뀌면???

    해당 디렉토리에서 aaa.txt를 찾으면서 없다고 에러가 나겠죠?

    그래서..

    path := ExtractFilePath(ParamStr(0)) + 'data\employee.db';

    이런식으로 하면.. path는 현재 프로그램이 실행된 위치의 data란 하위폴더에서 해당 파일을 검색하므로

    .db파일을 찾지못하는 것과 같은 오류는 발생하지 않을겁니다.

    지금까지 오류원인에 대한 추측과 해결방안이었습니다..^^;

    즐프~
  • Profile
    심재용 2005.02.24 00:01
    "스트링 그리드에 올리기만 하면 파라독스 .db파일을 못찾습니다. "

    파라독스.db 파일을 못 찾는 것인지... 아니면, .db파일에 Session 이 연결되어있었는데 엑셀로 자료 옮긴후 Session 이 끈긴 것인지는 불분명합니다만,

    OpenDialog1.Execute <= 이 부분이 의심이 가는군요. OpenDialog 컴포넌트를 통해서 엑셀파일을 오픈하셨다면 현재디렉토리가 변경되었을 가능성이 있습니다. 현재 디렉토리는 ShowMessage(GetCurrentDir); 이렇게 확인해 보실수 있습니다.

    예를 들어 엑셀파일은 프로그램 실행파일과 다른 디렉토리에 위치해 있고 파라독스 파일은 실행파일과 같은 디렉토리에 존재할 경우 엑셀파일을 오픈하면서 현재 디렉토리가 변경되어 이후 파라독스 파일을 오픈하려 하니 파일이 없다라는 추측이 됩니다. 이와같은 경우라면 파라독스파일을 찾을때 아래와 같이 파일명을 절대경로를 포함해서 해결할수 있습니다.

    aFileName := ExtractFilePath( Application.ExeName ) + <파라독스파일명>;