![]() |
OleContainer und Variant in einem möglich?
Hallo wieder mal,
Möchte mal gern wissen, ob jemand schonmal Excel in seinem Programm so mit Ole eingebunden hat, dass man dort auch vom Programm auf die Zeilen und Spalten zugreifen konnte oder ob ich dafür immer Variant-Variablen benutzen muss. Möchte in meinem Programm nicht Excel zusätzlich starten, sondern eine Tabelle einfach in meinem Programm bearbeiten. Problem bis jetzt ist eigentlich, dass ich noch kein vergleichbares Beispiel hier gefunden hab. In einem Buch (Borland Delphi 6) lösen sie das Problem anscheinend wie folgt:
Delphi-Quellcode:
Dies bewirkt aber bei mir nur eine Exception, wenn ich mit:
OleContainer1.DoVerb(ovUIActivate);
excel := OleContainer1.OleObject;
Delphi-Quellcode:
Auf eine Zelle in Excel zugreifen will. Meldung lautet: "Exception-Klasse EOleError mit Meldung 'Die Methode 'Cells' wird vom Automatisierungsobjekt nicht unterstützt'. Hoffe jemand kann mir einen Verweis für ein ähnliches Threat hier geben oder vieleicht einen Tip, wie ich es machen könnte.
excel.Cells[2,2].Value := 1;
Danke BAMatze |
Re: OleContainer und Variant in einem möglich?
Also nach ein wenig Experimentieren hab ich nun eine Lösung gefunden. Für alle die eventuell mal ähnliche Probleme haben, hier meine Lösung zu der gestellten Frage:
Delphi-Quellcode:
Bis dann
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtnrs, ComObj; type TForm1 = class(TForm) OleContainer1: TOleContainer; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; excel: Variant; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // Öffnet Excel seperat und schreibt eine 1 in die obere rechte Ecke {excel := CreateOleObject('Excel.Application'); excel.visible := true; wObj := excel.Application.Workbooks.add; excel.Worksheets['Tabelle1'].Activate; Excel.Worksheets['Tabelle1'].Cells[1,1] := 1; } // Öffnet das in der Form über einen OleContainer eingebundene Excel und // schreibt in die obere rechte Ecke die 1 OleContainer1.DoVerb(ovUIActivate); excel := OleContainer1.OleObject; excel.Worksheets[1].Cells[1,1] := 1; end; end. BAMatze |
Re: OleContainer und Variant in einem möglich?
Also habe hier auch nochmal eine Möglichkeit für die, die mit einbinden von Excel in ihre Projekte schwierigkeiten haben und so wie ich vor ein paar Tagen nicht wirklich viel davon wussten. Habe sämtliche wahrscheinlich mögliche Fehlermeldungen bekommen und folgende, wie ich finde, sehr einfache Möglichkeit gefunden, Excel in mein Programm einzubinden. Diesmal aber als externe Variante (damit meine ich Excel wird seperat geladen).
Delphi-Quellcode:
Habe euch auch den kompletten Quellcode mal reingestellt, da ich meistens nur Beispiele gefunden hab, wo man nicht alle eingebundenen Units oder andere interessante Teile des Quellcodes nicht gesehen hat. Für alle die nicht so wie ich Excel 2003 benutzen sondern eine andere Version hier noch einen Link, den ich hier in DP gefunden hab, wo die Anzahl der emptyParam in der "Open"-Funktion aufgelistet sind und vor allem auch, wofür sie stehen (6.Beitrag):
unit Excelsteuerungsunit;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OleCtnrs, ComObj, StdCtrls, ComCtrls, ExcelXP; type TForm1 = class(TForm) ComboBox1: TComboBox; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; excel: Variant; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var i, iTemp, lcid: integer; exc: TExcelApplication; excWB: TExcelWorkbook; excWS: TExcelWorksheet; begin // Speicher für Excel, ExcelWorkbook und ExcelWorksheet allocieren // Dies ist nötig, da sonst bei dem verbinden (connectTo) mit dem Workbook und // Worksheet fehler auftreten exc := TExcelApplication.Create(Nil); excWB := TExcelWorkbook.create(Nil); excWS := TExcelWorksheet.create(Nil); // User ID ermitteln // dies ist nicht unbedingt nötig, es kann beim laden der Exceldatei (nächster Schritt) // auch Problemlos eine Null an Stelle dieser Variablen eingetragen werden lcid := GetUserDefaultLCID; //vorhandener Exceldatei laden !!! wichtig !!! Die Anzahl der emtyParam ist Office-Versions abhängig exc.Workbooks.Open('D:\Tischsteuerung\Steuerungsprogramm Version 1.103\Sensoren.xls', emptyParam, emptyParam, emptyParam, emptyParam , emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam , emptyParam, emptyParam, lcid); // Excel soll angezeigt werden exc.visible[lcid] := true; // verbinden des Workbooks und des Worksheets mit der in der exc geladenen Datei excWB.ConnectTo(exc.ActiveWorkbook); excWS.ConnectTo(excWB.ActiveSheet as ExcelWorksheet); // Laufvariable i := 1; // in dieser Schleife werden Zahlen in den Zellen in eine ComboBox eingetragen // mit ähnlichen Schleifen können auch strings als Einträge in eine ComboBox // ermöglicht werden. while trystrtoint(excWS.Cells.Item[i+1,1],iTemp)=true do begin Showmessage('Hallo'); ComboBox1.Items.Add(excWS.Cells.Item[i+1,1]); i:=i+1; end; // Das erste Element in der ComboBox wird auch aktiv gesetzt ComboBox1.ItemIndex := 0; end; end. ![]() Hoffe das hilft anderen, welche ähnliche Probleme haben, wie ich. MfG BAMatze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz