Einzelnen Beitrag anzeigen

Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
711 Beiträge
 
Delphi XE5 Professional
 
#17

AW: Excel Zahlen werden als Zahl formatiert müssen aber angeklickt werden

  Alt 21. Mai 2020, 19:56
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
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (21. Mai 2020 um 19:58 Uhr)
  Mit Zitat antworten Zitat