unit KomponentenUnit;
interface
uses Windows, SysUtils, Dialogs, Messages, Controls, Classes,StdCtrls, ExcelXP, Variants,
ActiveX;
Type TMyComponentWithExcel =
Class(TWinControl)
private
FExcelApplication: TExcelApplication;
FExcelWorkbook: TExcelWorkbook;
FExcelWorksheet: TExcelWorksheet;
FExcelWert: Variant;
FEdEingabe: TEdit;
FBtSpeichern, FBtLoeschen: TButton;
function CreateEdit(PosX, PosY: integer): TEdit;
function CreateButton(PosX, PosY: integer; Text:
string): TButton;
function ProgIDExists(
const ProgID:WideString):Boolean;
function ExcelVerfuegbarkeit: boolean;
procedure OnEditChange(Sender: TObject);
procedure OnLoeschenClick(Sender: TObject);
procedure OnSpeichernClick(Sender:TObject);
procedure CreateTestdatei(sName:
string);
procedure openTestdatei(sName:
string);
procedure WriteEdit;
protected
procedure CreateWnd;
override;
published
public
constructor create(AOwner: TComponent);
override;
destructor destroy;
override;
End;
implementation
constructor TMyComponentWithExcel.create(AOwner: TComponent);
begin
inherited create(AOwner);
// Verhinder, dass andere Controls auf die Komponente gezogen werden kann
Controlstyle := Controlstyle - [csAcceptsControls];
Visible := true;
Width := 200;
Height := 100;
end;
destructor TMyComponentWithExcel.Destroy;
begin
try
if Enabled
then
begin
if not (csDesigning
in Self.ComponentState)
then FExcelWorkbook.Close(true);
// Speichert die Änderungen in Excel
FExcelWorksheet.Free;
FExcelWorkbook.Free;
FExcelApplication.Free;
end;
finally
FEdEingabe.Free;
FBtSpeichern.Free;
FBtLoeschen.Free;
inherited Destroy;
end;
end;
function TMyComponentWithExcel.CreateEdit(PosX: Integer; PosY: Integer): TEdit;
begin
result := TEdit.Create(
nil);
result.Parent := Self;
result.Left := PosX;
result.Top := PosY;
result.Width := 190;
result.Height := 20;
end;
function TMyComponentWithExcel.CreateButton(PosX: Integer; PosY: Integer; Text:
string): TButton;
begin
result := TButton.Create(
nil);
result.Parent := Self;
result.Left := PosX;
result.Top := PosY;
result.Height := 20;
result.Width := 80;
result.Caption := Text;
result.Enabled := false;
end;
procedure TMyComponentWithExcel.CreateTestdatei(sName:
string);
var sOrdner:
string;
iUserLCID: integer;
begin
iUserLCID := GetUserDefaultLCID;
FExcelApplication := TExcelApplication.Create(
Nil);
FExcelApplication.Workbooks.Add(emptyparam, iUserLCID);
FExcelWorkbook := TExcelWorkbook.create(
Nil);
FExcelWorkbook.ConnectTo(FExcelApplication.ActiveWorkbook
as ExcelWorkbook);
FExcelWorkbook.Worksheets.Add(emptyParam, emptyParam, emptyParam, emptyParam, iUserLCID);
FExcelWorksheet := TExcelWorksheet.create(
Nil);
FExcelWorksheet.ConnectTo(FExcelWorkbook.ActiveSheet
as ExcelWorksheet);
FExcelWorkbook.Close(true,sName, emptyParam, iUserLCID);
// Speichert die Änderungen in Excel }
FExcelWorksheet.Free;
FExcelWorkbook.Free;
FExcelApplication.Free;
end;
procedure TMyComponentWithExcel.openTestdatei(sName:
string);
var iUserLCID: integer;
DWResult: DWord;
begin
iUserLCID := GetUserDefaultLCID;
// Wenn die Datenbank extern über Excel geöffnet ist dann wird sie geschlossen.
// wenn diese Datei nicht geschlossen wird, dann kommt es zu einer Exception!!!
if FindWindow('
XLMain','
Microsoft Excel - ' + '
Test.xls') <> 0
then
SendMessageTimeout(FindWindow('
XLMain','
Microsoft Excel - ' + '
Test.xls'), WM_CLOSE, 0, 0,
SMTO_ABORTIFHUNG
or SMTO_NORMAL, 5000, DWResult);
FExcelApplication := TExcelApplication.Create(
Nil);
FExcelWorkbook := TExcelWorkbook.create(
Nil);
FExcelWorksheet := TExcelWorksheet.create(
Nil);
// vorhandener Exceldatei laden !!! wichtig !!! Die Anzahl der emtyParam ist Office-Versions abhängig
FExcelApplication.Workbooks.Open(sName, emptyParam, emptyParam, emptyParam, emptyParam,
emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam, emptyParam,
emptyParam, emptyParam, iUserLCID);
// false = Excel soll NICHT angezeigt werden// true Excel soll angezeigt werden
FExcelApplication.visible[iUserLCID] := true;
// verbinden des Workbooks und des Worksheets mit der in der exc geladenen Datei
FExcelWorkbook.ConnectTo(FExcelApplication.ActiveWorkbook);
FExcelWorksheet.ConnectTo(FExcelWorkbook.ActiveSheet
as ExcelWorksheet);
end;
procedure TMyComponentWithExcel.WriteEdit;
var sTemp:
string;
begin
// Überprüfen des Wertes in A1
sTemp := FExcelWorksheet.Cells.Item[1,1];
if sTemp <> '
'
then
begin
FEdEingabe.Text := sTemp;
FBtLoeschen.Enabled := true;
end
else FEdEingabe.Text := '
empty';
end;
procedure TMyComponentWithExcel.OnEditChange(Sender: TObject);
var sTemp:
string;
begin
if (FEdEingabe.Text <> '
')
and (FEdEingabe.Text <> '
empty')
then
begin
sTemp := FExcelWorksheet.Cells.Item[1,1];
if FEdEingabe.Text <> sTemp
then
begin
FBtLoeschen.Enabled := true;
FBtSpeichern.Enabled := true;
end
else
begin
FBtLoeschen.Enabled := true;
FBtSpeichern.Enabled := false;
end;
end
else
begin
FBtLoeschen.Enabled := false;
FBtSpeichern.Enabled := false;
end;
end;
procedure TMyComponentWithExcel.OnLoeschenClick(Sender: TObject);
begin
FEdEingabe.Text := '
empty';
FExcelWorksheet.Cells.Item[1,1] := '
';
end;
procedure TMyComponentWithExcel.OnSpeichernClick(Sender: TObject);
begin
FBtSpeichern.Enabled := false;
FExcelWorksheet.Cells.Item[1,1] := FEdEingabe.Text;
end;
function TMyComponentWithExcel.ProgIDExists(
const ProgID:WideString):Boolean;
var
tmp : TGUID;
begin
Result := Succeeded(CLSIDFromProgID(PWideChar(ProgID), tmp));
end;
function TMyComponentWithExcel.ExcelVerfuegbarkeit: boolean;
begin
// Es muss das Office-Packet 2003 auf dem Rechner installiert sein, damit diese
// Komponente funktioniert. Dies ist nötig, da in jeder Version des Office-Packetes
// unterschiedlich viele Parameter zum öffnen einer Datei benötigt werden.
// Wenn kein oder ein falsches Office-Packet installiert ist, wird die Komponente
// in der CreateWnd-Procedure disabled.
if ProgIDExists('
Excel.Application.11')
then result := true
else result := false;
end;
procedure TMyComponentWithExcel.CreateWnd;
var sOrdner:
string;
begin
inherited createWnd;
FEdEingabe := CreateEdit(5,10);
FEdEingabe.OnChange := OnEditChange;
FBtSpeichern := CreateButton(5,50,'
Speichern');
FBtSpeichern.OnClick := OnSpeichernClick;
FBtLoeschen := CreateButton(100,50,'
Löschen');
FBtLoeschen.OnClick := OnLoeschenClick;
// Dieser Teil wird nur zur Laufzeit ausgeführt
if not (csDesigning
in Self.ComponentState)
then
begin
if Excelverfuegbarkeit
then
begin
sOrdner := ExtractFilePath(ParamStr(0));
if not FileExists(sOrdner + '
Test.xls')
then CreateTestdatei(sOrdner + '
Test.xls');
// Laden der Datei und eintragen des Wertes aus A1 in das Edit
// je nach Eintrag in A1 Button Löschen freigeben.
openTestdatei(sOrdner + '
Test.xls');
writeEdit;
end
else
begin
Showmessage('
Komponente kann leider nicht aktiviert werden, da sie nicht das OfficePacket 2003 installiert haben');
Enabled := false;
end;
end;
end;
end.