:= で代入できないのはなぜ?

解決


みみ  2005-07-06 19:57:03  No: 16222

お世話になります。

Excelのアクセス処理を記述しているのですが、
作成したクラスの property の値を利用する側で変数に代入しようとしているのですが、代入できなくて困っています。

代入する行でデバッガで止めて代入元(クラスのプロパティ)を参照すると、文字列が見えるのですが、
その行を実行すると代入先には Unassigned が設定されてしまいます。
なにかおかしいのでしょうか?


みみ  2005-07-06 20:00:17  No: 16223

作成したクラスは以下の通りです。
--
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;
--ここまで


みみ  2005-07-06 22:11:42  No: 16224

最後の代入だけだと意味をなさないということなのか、
代入後にその値を使う処理を入れてみたところ、
sssに値が入りました。

最適化オプションをはずしていてもコンパイラで代入処理が省略されているように見えます。こんなこともあるのですね。
今回は、クラスの試験をしていたので代入されていることを確認したくて
代入で終了の処理だったのですが本来はあり得ないので良しとしようと思います。

無事解決できました。ありがとうございました。

--
文字化けしたのはタイトルのせいかしら。。。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加