自定义属性仅触发读取语句

时间:2016-04-19 14:30:44

标签: excel delphi components delphi-10-seattle

所以,我正在尝试创建一个组件来完成设置excel,libreoffice等单元格的设置。起初我只是想设置值,但现在,我需要更改单元格背景颜色,更改字体名称,样式,设置公式等等......所以,为此,我决定做一个将保留所有的类型我想改变的事情,所以,我这样做了:

type
  TMyCell = class
private
  FBgColor: TColor;
  FValue: String;
  FFormula: String;
  FFormat: String;
  FFont: TFont;

public
  constructor Create;
  destructor Destroy;

  property Value: String read FValue write FValue;
  property Formula: String read FFormula write FFormula;
  property Format: String read FFormat write FFormat;
  property BgColor: TColor read FBgColor write FBgColor;
  property Font: TFont read FFont write FFont;

end;

{ TMyCell }

constructor TMyCell.Create;
begin
  FFont := TFont.Create;
end;

destructor TMyCell.Destroy;
begin
  FFont.Free;
end;

我的组件看起来像这样:

type
  TMyPlan = class(TComponent)
private
  FExcel: Variant;
  procedure SetMyCell(Row, Column: Integer; Value: TMyCell);
  function GetMyCell(Row, Column: Integer): TMyCell;

public
  constructor Create(AOwner: TComponent);
  destructor Destroy;

  property Cell[Row, Column: Integer]: TMyCell read GetMyCell write SetMyCell;
end;

{ TMyPlan }

constructor TMyPlan.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FExcel := CreateOleObject('Excel.Application');
  FExcel.Workbooks.Add(1);
end;

destructor TMyPlan.Destroy;
begin
  FExcel := Unassigned;
  inherited;
end;

function TMyPlan.GetMyCell(Row, Column: Integer): TMyCell;
begin
  Result := TMyCell.Create;
  Result.Value := FExcel.Cells[Row, Column];;
end;

procedure TMyPlan.SetMyCell(Row, Column: Integer; Value: TMyCell);
begin
  FExcel.Cells[Row, Column] := Value.Value;
end;

只是为了让你知道,我已经做了一些组件,我还在学习如何正确地完成它们,所以这可能有一个不太合适的结构,无论如何,这是我第一次试图做这样的事情,一个具有子属性的输入参数的属性,它似乎不会像我一样工作。

回到主题,我如何称呼我的财产

并不重要

设置: MyPlan.Cell [1,1]。值:='1';

获取: ShowMessage(MyPlan.Cell [1,1] .Value);

无论哪种方式都只触发GetMyCell功能。为什么?

1 个答案:

答案 0 :(得分:3)

请参阅我对此问题的回答:"Left side cannot be assigned to" for record type properties in Delphi

虽然你所做的事情并不完全相同,但它是相似的。但是,在您的情况下,您为每次访问GetMyCell分配了一个新的TMyCell实例。这"临时"实例未被释放并且将泄漏(除非您在其中一个ARC平台上执行此操作)。

您的SetMyCell未被调用的原因是因为您实际上并未设置单元格,而是在单元格实例上设置(我上面解释的是泄漏)。