6

TCustomDBGridオブジェクトの親クラス ( ) の一部であるTCustomDBGrid保護されたプロパティ Options( ) にアクセスする必要がある子孫コンポーネントを作成しています。問題は、クラスに再導入された同じ名前のプロパティが存在するが、別のタイプ ( TDBGridOptions ) を持つことです。TGridOptionsTCustomGridTCustomDBGrid

簡素化されたこの宣言を確認してください

 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;

クラッカー クラスを使用してこのプロパティにアクセスする方法を理解しました。

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;

しかし、好奇心のために、これを解決するための別の回避策またはより良い方法が存在するかどうか疑問に思っています。

4

1 に答える 1

1

を使用した別の回避策を次に示し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;
于 2012-08-25T07:17:08.297 に答える