在 Delphi 中重写类-一个设计模式问题

ki0zmccv  于 2023-10-18  发布在  其他
关注(0)|答案(1)|浏览(144)

我目前使用的是一个三层结构的 Delphi TFrame对象:

  • TItemsFrame-一个基本的TFrame,定义了一个滚动区域。
  • TDrawItemsFrame-一个覆盖TItemsFrame的TFrame来定义如何绘制项目。
  • TFullPage-另一个扩展TDrawItemsFrame的TFrame,添加了页眉和页脚部分。

当我有两个不同的项目时,每个项目都需要一种独特的方式来绘制项目,而不需要修改TDrawItemsFrame的任何后代。
我想解决方案应该是这样的:

  • 主要项目:type TItemsFrame = Class(TFrame)
  • 主要项目:type TDrawItemsFrame = Class(TItemsFrame)
  • 主要项目:type TFullPage = Class({$I AncestorClass.inc})
  • 主要项目:type TOtherFullPage = Class({$I AncestorClass.inc})等等

然后,对于单个项目:

  • 项目A:定义类型TCustom_A_DrawItemsFrame = Class(TDrawItemsFrame)set AncestorClass.inc to TCustom_A_DrawItemsFrame
  • 项目B:定义type TCustom_B_DrawItemsFrame = Class(TDrawItemsFrame)set AncestorClass.inc to TCustom_B_DrawItemsFrame

我的问题是,这种方法是否与良好的 Delphi 实践相一致,或者是否有一个更好的战略模式,我应该考虑解决这个问题?任何见解将不胜感激!

ylamdve6

ylamdve61#

你可以像一些VCL组件那样做:在TITemsFrame类上公开一个事件OnDrawItem,其中包含可以为每个项修改的所有参数。
范例:

TItemsFrame = class(TFrame)
...
  fExternalDrawEvent : reference to procedure (out OItemColor : TColor);
                       // or procedure (out OItemColor : TColor) of object
  procedure DoExtDraw(out OItemColor : TColor);
...
public
...
  property OnDrawItem : TExternalDrawEvent read : fExternalDrawEvent write fExternalDrawEvent ;
...
end;

TItemsFrame.DoExtDraw(out OItemColor : TColor);
begin
  if assigned(fExternalDrawEvent) then
  begin
    fExternalDrawEvent(OItemColor); 
  end;
end;

procedure TItemsFrame.DrawingItems ;
var 
  lItemColor : TColor;
begin
  ...
  if fExternalDrwaingEnabled then
  begin
    DoExtDraw(lItemColor );
  end;
  ...
  Item[i].color := lItemColor ;
  ...
end;

例如第一个程序:

procedure 
var 
  lExampleFrame : TFullPage;
begin
// Create
  lExampleFrame.OnDrawItem(
    procedure (out OItemColor : TColor) 
    begin
      OItemColor := clred; 
    end
  );  

end;

例如第二个程序:

procedure 
var 
  lExampleFrame : TFullPage;
begin
// Create
  lExampleFrame.OnDrawItem(
    procedure (out OItemColor : TColor) 
    begin
      OItemColor := clBlue; 
    end
  );  

end;

相关问题