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