2016-11-05 3 views
2

Я использую Windows 10, Delphi Berlin и Microsoft Office 2007. Я пытаюсь получить количество открытых окон Excel. Когда я загружаю файл Excel и открываю его, отдельный Excel запускается, поэтому в одном окне Excel существует только одна книга.Excel Application.Windows.Count возвращает 0

Я импортировал библиотеку объектов Microsoft Office 12.0 и написал 2 процедуры. Button1Click работает с tExcelApplication и Button2Click делает с CreateOleObject ('excel.application'). После запуска Excel работает хорошо, но граф распознается как ошибка только в редакторе, а последний возвращает 0.

Как удалить раздражающее сообщение об ошибке или заставить _Excel работать?

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. Вызов метода отправляется во время выполнения и только во время выполнения вы узнаете, существует или нет метод. Из-за этого компилятор не может проверить правильность вашего кода. Ваш код в порядке, потому что он выполняется правильно, но характер позднего связанного COM означает, что среда IDE считает, что ваш код содержит синтаксические ошибки. Вы просто должны игнорировать его при использовании позднего связанного COM.

Вы можете переключиться вместо этого на ранний связанный COM и предоставить компилятору возможность проверить синтаксис вашего кода.

Есть плюсы и минусы обоих подходов. Поздняя привязка часто дает более простой и более сжатый код. Но за счет разочарования, когда вы только узнаете свои ошибки во время работы.

Если возвращаемое значение равно нулю, то, я думаю, очевидный вывод состоит в том, что нет окон. Поздний связанный код создает новый экземпляр Excel, но ранний связанный код прикрепляется к существующему экземпляру. Чтобы получить существующий экземпляр, если он есть, используйте GetActiveOleObject.

+0

В этой же ситуации две процедуры производят отличное возвращаемое значение. –

+0

Итак, вторая часть вашего вопроса - почему поздний связанный код возвращает ноль? Или это то, что ранний связанный код возвращает ноль? Вы на 100% уверены, что действительно есть окно, а excel дает неправильное значение. Кажется, трудно поверить. –

+2

@JOS попробуйте GetActiveOleObject, вы можете запустить новый процесс excel. –

Смежные вопросы