Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Excel & Delphi (Experten gefragt!) (https://www.delphipraxis.net/114675-excel-delphi-experten-gefragt.html)

moonwhaler 29. Mai 2008 11:36


Excel & Delphi (Experten gefragt!)
 
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: :o
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. :wall: Kann mir evtl. jemand bei der Lösung helfen?
Vielen Dank!

Gruß,
Christian

mikhal 29. Mai 2008 11:43

Re: Excel & Delphi (Experten gefragt!)
 
EmptyParam ist in der Unit VARIANTS deklariert sein...

Grüße
Mikhal

Linkat 29. Mai 2008 12:41

Re: Excel & Delphi (Experten gefragt!)
 
Hallo moonwhaler,

gestern hatte ich ein ähnliches Problem. Hängt wahrscheinlich mit den unterschiedlichen Units Excel2000 bzw. ExcelXP zusammen. Bei einem müssen zwei Paramter mehr sein.
Der Link Delphi Praxis
hat mir weiter geholfen.

Gruß, Linkat

moonwhaler 29. Mai 2008 13:20

Re: Excel & Delphi (Experten gefragt!)
 
Zitat:

Zitat von Linkat
Hallo moonwhaler,

gestern hatte ich ein ähnliches Problem. Hängt wahrscheinlich mit den unterschiedlichen Units Excel2000 bzw. ExcelXP zusammen. Bei einem müssen zwei Paramter mehr sein.
Der Link Delphi Praxis
hat mir weiter geholfen.

Gruß, Linkat

Das habe ich gesehen, Danke!

Folgende zwei sind dazugekommen:

Delphi-Quellcode:
EmptyParam, //Local: OleVariant
EmptyParam, //CorruptLoad: OleVariant
Hat jemand eine Idee wozu "Local" oder "CorruptLoad" (da habe ich eine Ahnung) benötigt wird?


Zitat:

Zitat von mikhal
EmptyParam ist in der Unit VARIANTS deklariert sein...

Grüße
Mikhal

Das wars! VIEEEELEN Dank! Jetzt läufts wieder wie gewohnt... ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz