所以,我正在尝试创建一个组件来完成设置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功能。为什么?
答案 0 :(得分:3)
请参阅我对此问题的回答:"Left side cannot be assigned to" for record type properties in Delphi
虽然你所做的事情并不完全相同,但它是相似的。但是,在您的情况下,您为每次访问GetMyCell分配了一个新的TMyCell实例。这"临时"实例未被释放并且将泄漏(除非您在其中一个ARC平台上执行此操作)。
您的SetMyCell未被调用的原因是因为您实际上并未设置单元格,而是在单元格实例上设置值(我上面解释的是泄漏)。