Einzelnen Beitrag anzeigen

moonwhaler

Registriert seit: 22. Dez 2005
57 Beiträge
 
Delphi 5 Enterprise
 
#1

Excel & Delphi (Experten gefragt!)

  Alt 29. Mai 2008, 11:36
Hallo Delphi-Praxis Experten,

ich spreche hier extra die Fortgeschrittenen an, weil ich derzeit (denke ich) kein triviales "Hilfe, ich schaff es nicht zu Excel zu verbinden"-Problem habe.

Kurz zusammengefasst: "EmptyParam" und "OLE Fehler 800A03EC".

Die lange Version:
Zur Vorgeschichte: Ich habe seit jeher (jahrelang) in Delphi 5 programmiert und mir einige recht komplexe Programme für die tägliche Arbeit gebastelt. Eines dieser Programme verbindet sich über eine COM-Schnittstelle zu Excel (2000, XP, 2003) und tat das derzeit ohne Probleme via Einbindung von "Excel2000" und "OleServer".
Mir ist leider vor kurzem der Rechner abgeraucht und deswegen habe ich einen neuen herangezogen und sogleich auf eine "neue" Delphi-Version (nämlich 2005) installiert. Erfahrungsgemäß ging einiges nicht mehr, aber das war abzusehen, weswegen ich peut-à-peut nun umbaue. Ein Problem jedoch ist mir nicht verständlich, deswegen meine Frage:

Compiliere ich den original Code (von D5) fällt mir als erstes auf, dass er "EmptyParam" nicht finden kann:
Zitat:
[Fehler] excel.pas(624): E2003 Undefinierter Bezeichner: 'EmptyParam'
Soweit ich mich erinnere habe ich diesen nirgendwo spezifiziert, also dachte ich, naja... Evtl. hat sich Borland gesagt, dass wir dies nun selber machen sollen. Gesagt getan: Ich habe jetzt in den Funktionen dies nachgeholt:

Delphi-Quellcode:
procedure TExcel.OpenTemplate( TemplateFilename: String );
var
  EmptyParam: OleVariant;
begin
  try
    // Close and disconnect the current workbook (if open)
    self.CloseOpenWorkbooks();
    FExcelWBK.Disconnect();

    self.LogEvent(
      WideFormat( _( 'Excel: Opening template using file "%s"...' ),
        [TemplateFilename] ),
      LS_NORMAL, LL_DEBUG );

    // Open the template file
    FExcel.Workbooks.Open( TemplateFileName,
                           EmptyParam, //UpdateLinks: OleVariant
                           TRUE, //ReadOnly: OleVariant
                           EmptyParam, //Format: OleVariant
                           EmptyParam, //Password: OleVariant
                           EmptyParam, //WriteResPassword: OleVariant
                           EmptyParam, //IgnoreReadOnlyRecommended: OleVariant
                           EmptyParam, //Orign: OleVariant
                           EmptyParam, //Delimiter: OleVariant
                           EmptyParam, //Editable: OleVariant
                           EmptyParam, //Notify: OleVariant
                           EmptyParam, //Converter: OleVariant
                           EmptyParam, //AddToMru: OleVariant
                           EmptyParam, //Local: OleVariant
                           EmptyParam, //CorruptLoad: OleVariant
                           FLocaleIdentifier );

    // Connect the workbook
    FExcelWBK.ConnectTo( FExcel.ActiveWorkbook );

    FLoaded := TRUE;
  except
    FLoaded := FALSE;
    FReady := FALSE;
  end;
end;
Perfekt! Der Compiler-Fehler ist weg. "Prima!", dachte ich zumindest. Leider steckt der Teufel im Detail, und sobald das Programm an die Codestelle kommt, an der die "FExcel.Workbooks.Open" Funktion aufgerufen wird, kracht das ganze Kartenhaus in sich zusammen mit der Meldung:

Zitat:
Erste Zufalls-Exception bei $7C812A5B. Exception-Klasse EOleException mit Meldung 'OLE-Fehler 800A03EC'. Prozess PSGenerator.exe (1868)
Tja. Und das ist das Ende vom Lied... Bei einer Google-Suche wurde ich auf die "LCID" aufmerksam gemacht, aber daran kann es nicht liegen. Diese wird bei mir bereits im Konstruktor der Klasse erstellt:

Delphi-Quellcode:
constructor TExcel.Create();
begin
  FExcel := TExcelApplication.Create( nil );
  FExcelWBK := TExcelWorkbook.Create( nil );
  FExcelWS := TExcelWorksheet.Create( nil );

  // Setup defaults
  FOnLogEvent := nil;
  FDefTemp := FALSE;
  FLoadedTemplate := '';
  FReady := TRUE;
  FLoaded := FALSE;
  FKeyAccount := -999;
  FSubKeyAccount := -999;
  FCurrentLine := 0;

  try
    // Get current user locale ID
    FLocaleIdentifier := GetUserDefaultLCID();

    // Setup general info
    FExcel.DisplayAlerts[FLocaleIdentifier] := FALSE;
    FExcel.AskToUpdateLinks[FLocaleIdentifier] := FALSE;
    FExcel.ScreenUpdating[FLocaleIdentifier] := FALSE;
    FExcel.Visible[FLocaleIdentifier] := ( ELogLevel( __LogLevel ) = LL_DEBUG );
    FExcel.UserControl := ( ELogLevel( __LogLevel ) = LL_DEBUG );

    // Connect to (a new or running instance of an) Excel application
    FExcel.ConnectKind := ckRunningOrNew;
    FExcel.Connect();
  except
    FreeAndNil( FExcelWS );
    FreeAndNil( FExcelWBK );
    FreeAndNil( FExcel );

    FReady := FALSE;
  end;
end;
Und ab hier bin ich nun fraglos. Kann mir evtl. jemand bei der Lösung helfen?
Vielen Dank!

Gruß,
Christian
  Mit Zitat antworten Zitat