Hallo Mirko,
die Programmzeile
ExcelApp.Range['A1','A1'].EntireColumn.Numberformat := '@';
wird auch bei mir als undeklariert markiert, weil bei der vorliegenden "Frühen Bindung ohne Verwendung der Typbibliothek" die
IDE über die importierten Routinen noch nichts "weiß". Die Stunde (Sekunde) der Wahrheit schlägt somit erst zur Laufzeit... Du mußt also die Routinen ausgiebig testen.
Noch etwas habe ich bei meiner Delphi-Version (XE5 Pro) unter Windows 10 beobachtet: Die übliche Anbindung von Excel mittels
Delphi-Quellcode:
Var
Excel: Variant;
Begin
Try
Excel:= GetActive0le0bject('Excel.Application');
Except
Excel:= CreateOleObject('Excel.Application');
End;
...
ist bei mir unzuverlässig, weil
GetActive0le0bject('Excel.Application');
bei mir beim Fehlen des Excel-Servers zwar eine EOLESysError-
Exception auslöst, aber merkwürdigerweise nicht in den Except-Block springt, sondern einen Programm-Abbruch zur Folge hat. Daher mußte ich eine ich aus den beiden obigen Routinen eine zusammengefasste GetOrCreateOleObject(..) machen:
Delphi-Quellcode:
Uses
,
Vcl.OleAuto
,
Winapi.Ole2
;
Function MyOleCheck(Res: HResult): Boolean;
Begin
Result:= Failed(Res);
End;
{MyOleCheck}
{--------------}
Function GetOrCreateOleObject(
Const ClassName:
String): Variant;
VAR
Unknown : IUnknown;
ClassID : TCLSID;
WideCharBuf:
Array[0..127]
of WideChar;
Fehler : Boolean;
Begin
StringToWideChar(ClassName, WideCharBuf, SizeOf(WideCharBuf)
div 2);
OleCheck(CLSIDFromProgID(WideCharBuf, ClassID));
// GetActiveOleObject:
Fehler:= MyOleCheck(GetActiveObject(ClassID,
NIL, Unknown));
// CreateOleObject:
IF Fehler
Then
Fehler:= MyOleCheck(CoCreateInstance(ClassID,
NIL, CLSCTX_INPROC_SERVER
OR CLSCTX_LOCAL_SERVER, IID_IUnknown, Unknown));
Try
Result:= VarFromInterface(Unknown);
Finally;
Unknown.Release;
End;
End;
{GetOrCreateOleObject}
{------------------------}
...
Begin
Try
Excel:= GetOrCreateOleObject('
Excel.Application');
...
Auf diese Weise konnte ich auch nicht-visuelle Konsolen-Anwendungen "wasserdicht" machen. Vielleicht hilft es jemandem hier weiter.
Gruß, Andreas