2013-02-22 26 views
11

Tôi cần kiểm tra xem tôi có thể sử dụng Excel OLE từ chương trình của mình vì nó có thể được khởi chạy trên PC không có Excel hay không. Mã mẫu trên mạng giả định Excel được cài đặt, nhưng nếu không thì sao?Cách thích hợp để kiểm tra xem Excel OLE có khả dụng không?

XLApp := CreateOleObject('Excel.Application'); 
try 
    // Hide Excel 
    XLApp.Visible := False; 
    // Open the Workbook 
    XLApp.Workbooks.Open(aPath); 
    ...snip... 
finally 
    // Quit Excel 
    if not VarIsEmpty(XLApp) then 
    begin 
    XLApp.Quit; 
    XLAPP := Unassigned; 
    end; 
end; 

Đó có phải là mã đúng để tìm hiểu xem Excel có được cài đặt không?

//Try to create Excel OLE 
try 
    XLApp := CreateOleObject('Excel.Application'); 
except 
    ShowMessage('Error opening Excel'); 
    Exit; 
end; 
+5

Có vẻ hợp lý với tôi. – Joe

Trả lời

15

Bạn có thể sử dụng mã dựa trên Scalabium's tip để kiểm tra xem Excel có khả dụng hay không. Hoặc một cái gì đó như:

uses ComObj, ActiveX; 

function IsObjectAvailable(const ClassName: string): Boolean; 
var 
    ClassID: TCLSID; 
begin 
    Result := Succeeded(CLSIDFromProgID(PWideChar(WideString(ClassName)), 
    ClassID)); 
end; 

Bạn cũng có thể kiểm tra xem Excel đang chạy bằng cách sử dụng đoạn mã sau:

function IsObjectActive(const ClassName: string): Boolean; 
var 
    ClassID: TCLSID; 
    Unknown: IUnknown; 
begin 
    Result := False; 
    if Succeeded(CLSIDFromProgID(PWideChar(WideString(ClassName)), ClassID)) then 
    Result := Succeeded(GetActiveObject(ClassID, nil, Unknown)); 
end; 

Và rồi trong một số thủ tục hoặc sự kiện:

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    if IsObjectAvailable('Excel.Application') then 
    ShowMessage('Excel is available'); 
    if IsObjectActive('Excel.Application') then 
    ShowMessage('Excel is running'); 
end; 
+7

+1 Nhưng tôi sẽ tiếp tục sử dụng 'try CreateOleObject ngoại trừ' trong ứng dụng của tôi, bởi vì tôi tin rằng đó là cách đáng tin cậy duy nhất để đảm bảo rằng tôi có thể tạo * một thể hiện đối tượng (thông qua' CoCreateInstance'). Phương pháp trên có thể được sử dụng như một bài kiểm tra sơ bộ để kiểm tra xem lớp đó đã được đăng ký đúng chưa. – kobik

+0

@kobik, tôi đồng ý. Trong câu trả lời của tôi, tôi cho rằng OP chỉ cần biết cách kiểm tra Excel đang được cài đặt, và 'try CreateOleObject' sẽ được sử dụng cho phần tạo đối tượng ví dụ. –

+1

@Guilem, 'CreateOleObject' cũng sẽ đang thực hiện' OleCheck (CLSIDFromProgID ... '(' ProgIDToClassID'). Vì vậy, tôi không thực sự thấy điểm trong việc thực hiện lại nó ngay từ đầu, nếu bạn định thử ' CreateOleObject' trong mọi trường hợp ... – kobik

Các vấn đề liên quan