AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein OleContainer und Variant in einem möglich?
Thema durchsuchen
Ansicht
Themen-Optionen

OleContainer und Variant in einem möglich?

Ein Thema von BAMatze · begonnen am 9. Dez 2008 · letzter Beitrag vom 18. Dez 2008
Antwort Antwort
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#1

OleContainer und Variant in einem möglich?

  Alt 9. Dez 2008, 08:03
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:
  OleContainer1.DoVerb(ovUIActivate);
  excel := OleContainer1.OleObject;
Dies bewirkt aber bei mir nur eine Exception, wenn ich mit:

  excel.Cells[2,2].Value := 1; 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.

Danke
BAMatze
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: OleContainer und Variant in einem möglich?

  Alt 9. Dez 2008, 10:41
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:
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.
Bis dann
BAMatze
  Mit Zitat antworten Zitat
BAMatze

Registriert seit: 18. Aug 2008
Ort: Berlin
759 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: OleContainer und Variant in einem möglich?

  Alt 18. Dez 2008, 13:00
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:
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.
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):

DP über Excel, emptyParam beim laden einer Datei

Hoffe das hilft anderen, welche ähnliche Probleme haben, wie ich.

MfG
BAMatze
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:26 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