2013-02-22 30 views
11

Muszę przetestować, czy mogę używać programu Excel OLE z mojego programu, ponieważ można go uruchomić na komputerach bez programu Excel. Próbki kodu w Internecie zakładają, że program Excel jest zainstalowany, ale co jeśli nie?Jaki jest właściwy sposób sprawdzenia, czy program Excel OLE jest dostępny?

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; 

Czy to byłby prawidłowy kod, aby sprawdzić, czy program Excel jest zainstalowany?

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

wydaje się rozsądne, aby mnie. – Joe

Odpowiedz

15

Można użyć kodu w oparciu o Scalabium's tip sprawdzić czy Excel jest dostępna. Lub coś podobnego:

uses ComObj, ActiveX; 

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

Można również sprawdzić, czy Excel jest uruchomiony za pomocą następującego kodu:

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; 

a potem w jakiejś procedury lub zdarzenia:

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 Ale nadal używałbym 'try CreateOleObject except' w mojej aplikacji, ponieważ uważam, że jest to jedyny niezawodny sposób, aby upewnić się, że rzeczywiście mogę * stworzyć * instancję obiektu (poprzez" CoCreateInstance "). Powyższą metodę można wykorzystać jako test wstępny w celu sprawdzenia, czy klasa jest poprawnie zarejestrowana. – kobik

+0

@kobik, zgadzam się. W mojej odpowiedzi zakładałem, że OP musi tylko wiedzieć, w jaki sposób sprawdzić, czy program Excel jest zainstalowany, i czy 'try CreateOleObject' zostanie użyty w części tworzenia instancji obiektu. –

+1

@Guilem, 'CreateOleObject' będzie także robić' OleCheck (CLSIDFromProgID ... '(' ProgIDToClassID') i tak naprawdę nie widzę sensu w zrobieniu tego ponownie w pierwszej kolejności, jeśli masz zamiar spróbować CreateOleObject' w każdym przypadku ... – kobik