Autor |
Beitrag |
Peter18
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: So 21.09.08 14:46
Hallo Leute,
ich schreibe in eine Excel-Tabelle Daten und will sie dann wieder speichern. Das soll allerdings im "Verborgenen" geschehen und nicht mit Speichern-Dialog oder als Kopie gespeichert werden.
Save führt zu einem Dialog. Lasse ich Save weg, erscheint bei Close der Dialog "sollen die Änderungen gespeichert werden?".
(Delphi 4)
Delphi-Quelltext 1: 2: 3:
| excel.ActiveWorkbook.Save; excel.Workbooks.Close; excel.Application.Quit; |
Unter VBA ist das kein Problem, dann gebe ich den Parameter "True" oder "False" mit, je nach dem, ob ich speichern möchte oder nicht.
Delphi-Quelltext 1:
| excel.Workbooks.Close(True); |
Diese Zeile führt zu der Fehlermeldung "Unzulässige Parameterzahl".
Kann mir jemand einen Tipp geben, wie sich das Problem lösen lässt??
Dank euch allen mit Grüßen von der sonnigen Nordsee
Peter
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: So 21.09.08 23:10
Moin!
Such mal nach DISPLAYALERTS, das war glaub ich die Eigenschaft, die die Dialoganzeige steuert.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mo 22.09.08 16:29
Hallo Narses,
Der Tipp war gut, so klappt es.
Leider ergeben sich aber neue Probleme: Anscheinend wird die OLE-Instanz nicht abgebaut, oder der Vermerk, "Datei zum Schreiben geöffnet" wird nicht entfernt.
Delphi-Quelltext 1: 2: 3: 4: 5:
| Vertrieb.excel.DisplayAlerts := FALSE; Vertrieb.excel.ActiveWorkbook.SaveAs(Vertrieb.FilePath); Vertrieb.excel.DisplayAlerts := TRUE; Vertrieb.excel.Workbooks.Close; Vertrieb.excel.Application.Quit; |
Delphi kann die Tabelle mehrfach lesen. Wenn sie aber aus dem Programm mit Excel geöffnet wird, meint Excel "Hab keine Lust." Wahrscheinlich erscheint der "Schreibgeschützt-Dialog" verdeckt und Excel hängt. Die Meldung ausgeschaltet zu lassen hilft auch nicht weiter. Erst wenn die Anwendung beendet wird, ist die Tabelle wieder frei. (Typisch Windoof) Läst sich zwar mit dem Taskmanager austrixen aber das ist nix für DAUs.
Kennt jemand einen Weg, wie das Problem zu lösen ist??
Grüße von Peter
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
|
Verfasst: Mo 22.09.08 18:58
Hallo Peter18,
man muss wenn man die OLE-Automation benutzt, alles anschließend wieder aufräumen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Vertrieb.Excel.DisplayAlerts := FALSE; Vertrieb.Excel.ActiveWorkbook.Close (saveChanges:=True, FileName:= Vertrieb.FilePath); Vertrieb.Excel.DisplayAlerts := TRUE; if not VarIsEmpty(Vertrieb.excel)then begin Vertrieb.excel.Quit; end; Vertrieb.excel := Unassigned; |
Wenn Du evt. noch ein Sheet angelegt hast muss das natürlich zuvor geschlossen und die Instanc auch auf Unassigned gestellt werden.
In Excel verhält es sich genauso wie in Delphi. Die Erstellten Objekte müssen auch ordentlich wieder freigegeben werden.
Wenn man Excel im Delphi Programm schließt, dann sollte keine Excel-Instanc mehr im Taskmanager zu sehen sein.
Bis bald Chemiker
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Di 23.09.08 09:47
Hallo Chemiker,
das war der entscheidende Tipp, nun läuft alles sauber. Hatte es mit "nil" versucht, was aber anscheinend keine Wirkung hatte. Danke!
Die Hilfe enthält leider keine entsprechenden Beispiele. Da muss man wissen, was man sucht. Meine Literatur gibt leider auch nichts her. Gibt es Literatur oder Internetseiten, die solche Infos liefern?
Für alle, die mit solchen Problemen zu kämpfen haben noch einmal die vollständige Befehlssequenz (ohne Prüfungen):
Excel öffnen:
Delphi-Quelltext 1: 2: 3:
| excel := CreateOleObject( 'Excel.Application'); excel.Workbooks.Open( FilePath ); Sheet := Vertrieb.excel.ActiveWorkbook.Worksheets[WorkSheet]; |
Excel schließen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| excel.DisplayAlerts := FALSE; excel.ActiveWorkbook.SaveAs(FilePath); excel.DisplayAlerts := TRUE; excel.Workbooks.Close; excel.Application.Quit; Sheet := Unassigned; excel := Unassigned; |
Grüße von der Nordsee
Peter
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
|
Verfasst: Di 23.09.08 22:53
Hallo Peter18,
um Informationen über die OLE-Automation zu bekommen, würde ich mal einen Blick in den Ordner von Delphi werfen.
Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\ActiveX\OleAuto
Die Beispiele befassen sich zwar mit Word, können aber auch auf Excel angewendet werden, mit entsprechenden Änderungen. Um bestimmte Befehl in Excel umzusetzen kann es sehr hilfreich sein, sich zuvor einen Macro aufzuzeichnen und diese Befehle in Delphi umzusetzen. Weitere Hilfe bekommt man, wenn man in den Delphi – Foren nach dem Begriff „Excel“ sucht.
Zu bedenken ist das es 2 verschiede OLE-Automationen gibt, die mit den Begriffen mit „frühe Bindung“ (das währe z.B.: mit den Komponenten in Dephi) und „späte Bindung“ umschrieben werden. Beide haben ihre Vor- und Nachteile.
Ich persönlich, benutze lieber die späte Bindung, weil sie den für mich entscheiden Vorteil hat, dass sie nicht von der Excel-Version abhängig ist.
Das Bedeutet konkret im meinen Fall, das ich ein Programm das ich unter Delphi 7 für Excel 2000 entwickelt habe, ohne Konvertierung auch unter Delphi 2009 mit Excel 2007 läuft.
Als Alternative um mit Excel von einem Delphi-Programm aus zu kommunizieren, gibt es noch ADO.
Bis bald Chemiker
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 24.09.08 10:05
Hallo Chemiker,
Danke für die Info. Anscheinend habe ich eine derbe abgespeckte Version. Den Ordner "Borland\BDS" gibt es bei mir schon nicht. Kein Wunder, dass ich mich immer im Dunkeln bewege. Gibt es Möglichkeiten da ran zu kommen?
Und wieder ein neues Problem:
Ich möchte in Excel einen Hyperlink anlegen. Dabei erhalte ich immer eine Fehlermeldung, dass die Typen inkompatibel sind. Dank der Minimalversion habe ich dazu auch nichts finden können.
Sowohl die Übergabe als String-Konstante scheiterte als auch mit einer Variablen.
Delphi-Quelltext 1:
| Sheet.Cells[Index+1, K+1].Hyperlinks.Add('ff@feuer.de'); |
Delphi-Quelltext 1:
| Sheet.Cells[Index+1, K+1].Hyperlinks.Add(StrPCopy('ff@feuer.de')); |
Delphi-Quelltext 1:
| Sheet.Cells[Index+1, K+1].Hyperlinks.Add(CB.Text); |
Auch verschiedene Konvertierungen wurden als Fehler angemeckert.
Grüße von der Nordsee
Peter
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
|
Verfasst: Mi 24.09.08 20:00
Hallo Peter18,
Zitat: | Den Ordner "Borland\BDS" gibt es bei mir schon nicht. |
Sorry, war mein Fehler ich habe nicht darauf geachtet, dass Du mit Delphi 4 arbeitest. Vermutlich hast Du einen „Borland\Delphi4“ Ordner.
Um Dein Problem zu lösen, hast Du mal einen Macro in Excel aufgezeichnet um einen Hyperlink zu erzeugen?
Bis bald Chemiker
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Mi 24.09.08 20:35
Hallo Chemiker,
stimmt.
Ja mit einem Macro habe ich auch getestet. Dort kann ich einfach einen String mit der Adresse eintragen. Da Delphi diverse String-Typen kennt nehme ich an, ich hab noch nicht den richtigen zu fassen bekommen. Hatte gehofft, man kann es ev. irgendwo nachlesen.
Quelltext 1:
| Cells(1, 1).Hyperlinks.Add('ff@feuer.de') |
Du hattest 2 OLE-Typen erwähnt. mir ist es auch wichtig Version-unabhängig zu sein. deshalb bin ich von VBA zu Delphi übergegangen. Worin bestehen denn die Unterschiede?
Grüße von der Nordsee
Peter
|
|
Chemiker
      
Beiträge: 194
Erhaltene Danke: 14
XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit
D7, BDS 2006, RAD Studio 2009+C++, Delphi XE2, XE3, VS 2010 Prof.
|
Verfasst: Mi 24.09.08 21:12
Hallo Peter18,
Früh- Späte Bindung:
www.delphi-treff.de/...utomation%20steuern/
Bis bald Chemiker
|
|
Peter18 
      
Beiträge: 489
Erhaltene Danke: 2
Delphi4
|
Verfasst: Fr 26.09.08 13:31
Hallo an alle,
Problem gelöst:
was als Makro funktioniert muss mit OLE nicht auch funktionieren.
In diesem Fall will "Add" anscheinend als 1. Parameter ein Range-Objekt, daher die Inkompatibilität.  Und so funktioniert es:
Delphi-Quelltext 1:
| Sheet.Hyperlinks.Add( Sheet.Cells[Index+1, K+1], 'mailto:' + CB.Text, CB.Text); |
Grüße von der Nordsee
Peter
|
|
|