AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Excel & Delphi (Experten gefragt!)

Ein Thema von moonwhaler · begonnen am 29. Mai 2008 · letzter Beitrag vom 29. Mai 2008
Antwort Antwort
moonwhaler

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

Excel & Delphi (Experten gefragt!)

  Alt 29. Mai 2008, 12: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
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Excel & Delphi (Experten gefragt!)

  Alt 29. Mai 2008, 12:43
EmptyParam ist in der Unit VARIANTS deklariert sein...

Grüße
Mikhal
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Linkat

Registriert seit: 3. Dez 2004
Ort: nr Stuttgart
62 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Excel & Delphi (Experten gefragt!)

  Alt 29. Mai 2008, 13:41
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
  Mit Zitat antworten Zitat
moonwhaler

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

Re: Excel & Delphi (Experten gefragt!)

  Alt 29. Mai 2008, 14:20
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 von mikhal:
EmptyParam ist in der Unit VARIANTS deklariert sein...

Grüße
Mikhal
Das wars! VIEEEELEN Dank! Jetzt läufts wieder wie gewohnt...
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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