2013-02-22 23 views
11

Excel OLE'yi, Excel olmadan PC'lerde başlatılabildiğinden programımdan kullanıp kullanamayacağımı test etmem gerekiyor. Net üzerindeki kod örnekleri Excel'in kurulu olduğunu varsayalım, ama değilse?Excel OLE'nin kullanılabilir olup olmadığını kontrol etmenin doğru yolu nedir?

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; 

Excel'in yüklü olup olmadığını bulmak için doğru kod mu bu?

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

makul görünüyor bana. – Joe

cevap

15

Excel kullanılabilir olup olmadığını kontrol etmek Scalabium's tip dayalı bir kod kullanabilirsiniz. Ya da bir şey gibi:

uses ComObj, ActiveX; 

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

Excel Aşağıdaki kodu kullanarak çalışıyorsa da kontrol edebilirsiniz: Bazı prosedür veya olay

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; 

Ve sonra:

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 Ancak uygulamamda 'CreateOleObject dışında 'kullanmayı deneyin, çünkü aslında bir nesne örneği oluşturabildiğimden emin olmanın tek güvenilir yolu olduğuna inanıyorum (' CoCreateInstance 'aracılığıyla). Yukarıdaki yöntem, sınıfın doğru bir şekilde kaydedildiğini kontrol etmek için bir ön test olarak kullanılabilir. – kobik

+0

@kobik, Katılıyorum. Cevabımda OP'nin sadece yüklü olan Excel'in nasıl kontrol edileceğini bilmesi gerektiğine ve 'CreateOleObject' nesnesinin nesne örneği oluşturma parçası için kullanılacağını varsaydım. –

+1

@Guilem, 'CreateOleObject' aynı zamanda OleCheck'i de (CLSIDFromProgID ...' ('ProgIDToClassID') yapıyor olacak.O yüzden denemeyi düşünüyorsanız, ilk etapta bunu tekrar yapmanın gerçekten bir noktasını göremiyorum. Herhangi bir durumda CreateOleObject' ... – kobik

İlgili konular