お世話になります。
Excelのアクセス処理を記述しているのですが、
作成したクラスの property の値を利用する側で変数に代入しようとしているのですが、代入できなくて困っています。
代入する行でデバッガで止めて代入元(クラスのプロパティ)を参照すると、文字列が見えるのですが、
その行を実行すると代入先には Unassigned が設定されてしまいます。
なにかおかしいのでしょうか?
作成したクラスは以下の通りです。
--
unit ExcelAccess;
interface
uses SysUtils, Controls, ADODB, ExcelXP, OleCtrls ;
type
TExcelAccess = class
private
{ Private 宣言 }
FApp: TExcelApplication;
Fbook: TExcelWorkbook;
Fsheet: TExcelWorksheet;
function CellsRange(cols, rows: Integer): String;
procedure SetCells(cols, rows: Integer; Values: Variant);
function GetCells(cols, rows: Integer): Variant;
public
{ Public 宣言 }
constructor Create(); overload;
destructor Destroy; override;
property Cells[ACol, ARow: Integer]: Variant read GetCells write SetCells;
end;
implementation
constructor TExcelAccess.Create();
begin
FApp := TExcelApplication.Create(nil);
FBook := TExcelWorkbook.Create(nil);
FSheet := TExcelWorkSheet.Create(nil);
//エクセル起動
FApp.Connect;
//エクセル表示
FApp.Visible[0] := True;
//ブック追加
FBook.ConnectTo(FApp.Workbooks.Add(EmptyParam, 0));
//シートを ExcelWorksheetに接続
FSheet.ConnectTo(Fbook.Worksheets[1] as _Worksheet);
end;
destructor TExcelAccess.Destroy;
begin
Fsheet.Free;
Fbook.Free;
FApp.Free;
//inherited Destroy;
end;
procedure TExcelAccess.SetCells(cols, rows: Integer; Values: Variant);
begin
Fsheet.Range[CellsRange(cols, rows), CellsRange(cols, rows)].Value2 := Values;
end;
function TExcelAccess.GetCells(cols, rows: Integer): Variant;
begin
result := Fsheet.Range[CellsRange(cols, rows), CellsRange(cols, rows)].Value2;
end;
function TExcelAccess.CellsRange(cols, rows: Integer): String;
begin
result := Char(64 + cols) + IntToStr(rows);
end;
end.
--ここまで
また、代入先では以下の処理を行っています。
--
procedure TForm1.Button1Click(Sender: TObject);
var
Excel: TExcelAccess;
sss: Variant;
begin
Excel := TExcelAccess.Create();
Excel.Cells[1,1] := 'hoge';
sss := 'aaaa'; //お試しで入れてみた
sss := Excel.Cells[1,1]; //←ここでなぜかUnassignedが代入されてしまう
end;
--ここまで
最後の代入だけだと意味をなさないということなのか、
代入後にその値を使う処理を入れてみたところ、
sssに値が入りました。
最適化オプションをはずしていてもコンパイラで代入処理が省略されているように見えます。こんなこともあるのですね。
今回は、クラスの試験をしていたので代入されていることを確認したくて
代入で終了の処理だったのですが本来はあり得ないので良しとしようと思います。
無事解決できました。ありがとうございました。
--
文字化けしたのはタイトルのせいかしら。。。
ツイート | ![]() |