16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"ExcelをV-Tableバインディングで動かす"
この発言に対し以下のコメントが寄せられています
#00835 TN さん RE:ExcelをV-Tableバインディングで動かす
OLE/COMの技術資料には,Invoke経由は遅い,タコだと書いてありますが,
そうとも限らないようですね.MSのアプリの場合だけかどうかわかりませんが.
以下にExcel97をNT4.0 SP3 Pen166MHzの上で動かした例を載せます.
初回はディスクキャッシュが効いていないので何秒か余計にかかりますから
注意.
・Excel_TLB.pasを作るには,プロジェクト/タイプライブラリの取り込みで
Microsoft Excel 8.0 Object Library
を取り込むとできます.
------------------------------------------------------
program Project1;
uses
Excel_TLB in 'Excel_TLB.pas',
Forms, // 順序を変えないとApplicationの宣言が重複していてだめ
Unit1 in 'Unit1.pas' {Form1},
Office_TLB in 'Office_TLB.pas';
{$R *.TLB}
{$R *.RES}
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
------------------------------------------------------
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComObj, Excel_TLB;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
// V-Tableバインディングの場合 : 約9秒で,保存しますか? が出る
procedure TForm1.Button1Click(Sender: TObject);
var
Ex_Application : _Application;
Ex_WorkBook : _WorkBook;
Ex_WorkSheet: _WorkSheet;
i: integer;
begin
Ex_Application := CoApplication.Create;
Ex_Application.WorkBooks.add(Null, 0);
Ex_WorkBook := Ex_Application.ActiveWorkBook;
Ex_WorkSheet := Ex_Application.ActiveSheet as _WorkSheet;
for i := 1 to 1000 do
Ex_WorkSheet.Cells[i,1] := 'TestTest';
Ex_Application.WorkBooks.Close(0);
end;
// レイトバインディングの場合 : 約5秒で,保存しますか? が出る(@_@)
procedure TForm1.Button2Click(Sender: TObject);
var
Excel:Variant;
Ex_Application : Variant;
Ex_WorkBook :Variant;
Ex_WorkSheet: Variant;
i: integer;
begin
Excel := CreateOleObject('Excel.Application');
Ex_Application := Excel.Application;
Ex_Application.WorkBooks.add;
Ex_WorkBook := Ex_Application.ActiveWorkBook;
Ex_WorkSheet := Ex_Application.ActiveSheet;
for i := 1 to 1000 do
Ex_WorkSheet.Cells[i,1] := 'TestTest';
Ex_Application.WorkBooks.Close;
Excel.Quit;
end;
end.
TN(CQJ01721)
Original document by TN 氏 ID:(CQJ01721)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|