AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Form wechseln und trotzdem auf Excel zugreifen
Thema durchsuchen
Ansicht
Themen-Optionen

Form wechseln und trotzdem auf Excel zugreifen

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

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

Form wechseln und trotzdem auf Excel zugreifen

  Alt 19. Dez 2008, 07:06
Hallo alle zusammen.

Wollte hier mal fragen, ob jemand schonmal eine einfache und "saubere" Methode gefunden hat, um Excel auch beim Formwechsel (in dem gleichen Programm) weiter zu nutzen. Habe hier schonmal ein Beitrag gebracht, wie ich dies bewerkstellige:

Verwendung von Excel in Delphi

Hier jetzt das Problem: Wenn ich Excel im Hintergrund starte, das Programm aber irgendwann die Form wechselt und ich weiterhin auf Excel zugreifen möchte, dann erfolgt ersteinmal eine Fehlermeldung Ole-Fehler ... Diesen Fehler kann man umgehen, wenn man vor dem Formwechsel den allocierten Speicher für Excel wieder freigibt und ihn in der neuen Form wieder neu reserviert.
Möchte aber eigentlich gerne eine Variante wo ich vieleicht nur die "Parent"-Eigenschaft (wie bei den meisten Delphi-Komponenten möglich) einfach ändert. Bei der TExcelApplication scheint dies aber nicht über Parent möglich zu sein, da diese eine _Application-Eigenschaft hat (man scheint damit zwischen Word, Excel, PP, ... hin und her springen zu können).

Hat jemand schonmal etwas ähnliches programmiert und kann mir einen Tipp geben, wie man dies bewerkstelligt?

Vielen Dank
BAMatze
  Mit Zitat antworten Zitat
BAMatze

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

Re: Form wechseln und trotzdem auf Excel zugreifen

  Alt 19. Dez 2008, 07:40
Habe hier mal den Quellcode für meine Variante aufgeführt. Wie gesagt, wäre schön, wenn einer eine Möglichkeit kennen würde, damit die Spielereien mit dem Speicher unnötig sind. Vieleicht sind die Spielereien mit dem Speicher zur Umsetzung auch nötig. Das weiß ich nicht.

Hier der Quellcode Form1
Delphi-Quellcode:

unit Excelsteuerungsunit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OleCtnrs, ComObj, StdCtrls, ComCtrls, ExcelXP, Testunit;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  exc: TExcelApplication;
  excWB: TExcelWorkbook;
  excWS: TExcelWorksheet;
  lcid: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Speicher für Form1 freigeben
  excWB.free;
  excWS.Free;
  // Form2 öffnen
  Form2.ShowModal;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Speicher für Form1 freigeben
  excWS.free;
  excWB.free;
  exc.Quit;
end;

procedure TForm1.FormCreate(Sender: TObject);
var i, iTemp: integer;
   
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
      ComboBox1.Items.Add(excWS.Cells.Item[i+1,2]);
      i:=i+1;
    end;
  // Das erste Element in der ComboBox wird auch aktiv gesetzt
  ComboBox1.ItemIndex := 0;
end;

end.
Hier der Quellcode Form2

Delphi-Quellcode:

unit Testunit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm2 = class(TForm)
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

uses Excelsteuerungsunit;

{$R *.dfm}

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  // Speicher für Form2 freigeben
  excWB.free;
  excWS.Free;
end;

procedure TForm2.FormCreate(Sender: TObject);
var i, iTemp: integer;
begin
  // Speicher für Form2 allocieren
  excWS.Create(Nil);
  excWS.Create(Nil);
  // Laufvariable
  i:=1;
  // Combobox1 auf der Form2 befüllen
  while trystrtoint(excWS.Cells.Item[i+1,1],iTemp)=true do
    begin
      ComboBox1.Items.Add(excWS.Cells.Item[i+1,2]);
      i:=i+1;
    end;
  // Das erste Element in der ComboBox wird auch aktiv gesetzt
  ComboBox1.ItemIndex := 0;
end;

end.
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 23:36 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