2016-11-05 5 views
2

저는 Windows 10, Delphi Berlin 및 Microsoft Office 2007을 사용합니다. 열린 Excel 창 수를 얻으려고합니다. Excel 파일을 다운로드하여 열 때 별도의 Excel이 실행되므로 Excel 창 하나에 하나의 통합 문서 만 존재합니다.Excel Application.Windows.Count는 0을 반환합니다.

Microsoft Office 12.0 Object Library를 가져 와서 2 개의 절차를 작성했습니다. Button1Click은 tExcelApplication에서 작동하고 Button2Click은 CreateOleObject ('excel.application')에서 작동합니다. Excel을 실행 한 후 전자는 제대로 작동하지만 카운트는 편집기에서 오류로 인식되고 후자는 0을 반환합니다.

어떻게 작동합니까? 오류 메시지를 제거하거나 _Excel이 작동합니까? 늦게 바인딩 COM을 사용하고 있기 때문에

type 
    TForm1 = class(TForm) 
    ExcelApplication1: TExcelApplication; 
    Button1: TButton; 
    Button2: TButton; 
    procedure Button1Click(Sender: TObject); 
    procedure Button2Click(Sender: TObject); 
    end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Button1.Caption := IntToStr(ExcelApplication1.Windows.Count); 
end; 

procedure TForm1.Button2Click(Sender: TObject); 
var 
    _Excel: Variant; 
begin 
    _Excel := CreateOleObject('excel.application'); 

    Button2.Caption := _Excel.windows.count; 
end; 

enter image description here

답변

3

IDE에서 메시지입니다. 메서드 호출은 런타임에 전달되며 런타임에만 메서드가 있는지 여부를 확인합니다. 이 때문에 컴파일러는 코드의 유효성을 검사 할 수 없습니다. 코드가 올바르게 실행되기 때문에 코드가 올바르지 만 후기 바인딩 COM의 특성은 IDE에 코드에 구문 오류가 있다고 생각한다는 의미입니다. 후기 바인딩 된 COM을 사용할 때 무시해야합니다.

대신 초기 바인딩 COM으로 전환하고 컴파일러에서 코드 구문을 확인할 수있게 할 수 있습니다.

두 가지 방법 모두 장단점이 있습니다. 후기 바인딩은 더 간단하고 간결한 코드를 생성 할 수 있습니다. 하지만 당신이 실수로 런타임에 찾을 때 좌절을 희생합니다.

반환되는 값이 0이면 명백한 결론은 윈도우가 없다는 것입니다. 후기 바인딩 코드는 Excel의 새 인스턴스를 생성하지만 초기 바인딩 코드는 기존 인스턴스에 연결됩니다. 기존 인스턴스를 얻으려면 GetActiveOleObject을 사용하십시오.

+0

동일한 상황에서 두 절차는 다른 반환 값을 생성합니다. –

+0

질문의 두 번째 부분은 늦은 바운드 코드가 0을 반환하는 이유입니다. 아니면 초기 바인딩 된 코드가 0을 반환합니까? 당신은 정말로 창문이 있고 그 엑셀이 틀린 가치를 부여하는지 100 % 확실합니까? 믿기 ​​어려워 보입니다. –

+2

@JOS GetActiveOleObject를 시도해보십시오. 새로운 Excel 프로세스를 시작할 수도 있습니다. –

관련 문제