Einzelnen Beitrag anzeigen

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, 08: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