我正在编写一个TCustomDBGrid后代组件,它需要访问受保护的属性Options(TGridOptions),它是TCustomDBGrid对象的父类(TCustomGrid)的一部分.问题是在类中重新引入了具有相同名称TCustomDBGrid但具有其他类型(TDBGridOptions)的属性.
检查简化了此声明
TCustomGrid= = class(TCustomControl)
protected
//I need to access this property
property Options: TGridOptions read FOptions write SetOptions
default [goFixedVertLine, goFixedHorzLine, goVertLine, goHorzLine,
goRangeSelect];
end;
TCustomDBGrid = class(TCustomGrid)
protected
//a property with the same name is reintroduced in this class
property Options: TDBGridOptions read FOptions write SetOptions
default [dgEditing, dgTitles, dgIndicator, dgColumnResize, dgColLines,
dgRowLines, dgTabs, dgConfirmDelete, dgCancelOnExit, dgTitleClick, dgTitleHotTrack];
end;
TDBGridEx = class(TCustomDBGrid)
protected
//inside of this method I need to access the property TCustomGrid.Options
procedure FastDraw(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
end;
Run Code Online (Sandbox Code Playgroud)
我想出了如何使用cracker类访问此属性.
type
TCustomGridClass=class(TCustomGrid);
{ TDBGridEx }
procedure TDBGridEx.FastDraw(ACol, ARow: Integer; ARect: TRect; AState: TGridDrawState);
var
LOptions: TGridOptions;
LRect : TRect;
begin
......
LOptions := TCustomGridClass(Self).Options; //works fine
LRect := ARect;
if not (goFixedVertLine in LOptions) then
Inc(LRect.Right);
if not (goFixedHorzLine in LOptions) then
Inc(LRect.Bottom);
.....
end;
Run Code Online (Sandbox Code Playgroud)
但只是出于好奇,我想知道是否存在另一种解决方法或更好的方法来解决这个问题.
这是使用的另一种解决方法class helpers。它不像你的那么好,但是有效。
type
TCustomGridHelper = class helper for TCustomGrid
function GetGridOptions: TGridOptions;
end;
function TCustomGridHelper.GetGridOptions: TGridOptions;
begin
Result := Self.Options;
end;
procedure TDBGridEx.FastDraw(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
var
LOptions: TGridOptions;
LRect : TRect;
begin
...
LOptions := Self.GetGridOptions; //works fine
...
end;
Run Code Online (Sandbox Code Playgroud)