【问题标题】:onResize event with class object带有类对象的 onResize 事件
【发布时间】:2010-10-03 11:52:12
【问题描述】:

这是我的代码:

type TNav = class(TPanel)
private
  procedure CMMouseEnter(var AMsg: TMessage); message CM_MOUSEENTER;
  procedure CMMouseLeave(var AMsg: TMessage); message CM_MOUSELEAVE;
public
end;

type TForm1 = class(TForm)
  ...
  procedure FormCreate(Sender: TObject);
private
public
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with TNav.Create(Form1) do begin
    Parent := Self;
    Name := 'nav';
    Top := 0;
    Left := 0;
    Height := 27;
    Width := Form1.Width - 8;
    Visible := true;
    Caption := '';
  end;      
end;

procedure TNav.CMMouseEnter(var AMsg: TMessage);
begin
  Self.Top := 0;
end;

procedure TNav.CMMouseLeave(var AMsg: TMessage);
begin
  Self.Top := -23;
end;

有没有办法为我的 TNav 添加 onResize 事件,甚至可以从 Form1 发送宽度/高度值?

提前谢谢你!

【问题讨论】:

  • 始终将begin 换行。否则训练有素的眼睛看不到它,它会将with/if/... 之后的语句混淆为单行语句而不是整个代码块。
  • @Andreas 我希望你不要再把你的风格偏好强加给别人。虽然你的眼睛可能会根据自己的喜好被训练来阅读代码并且你会错过这样的块,但并不是每个人都如此倾向于或完全依赖于风格。事实上,我们中的许多人都因换行而分心。
  • @Marjan:我几乎期待对此发表评论。是的,我将停止发表这些言论。
  • @Andreas:谢谢。它确实有点像巴甫洛夫,不是吗? :) 顺便说一下你的答案+1。好老主播...

标签: delphi class object onresize


【解决方案1】:

您想为TNav 的每个实例添加一个“OnResize”处理程序(在内部),还是只希望TNav 显示一个OnResize 事件以便您可以在应用程序中设置它?在第一种情况下,只需执行

type
  TNav = class(TPanel)
  private
    procedure CMMouseEnter(var AMsg: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var AMsg: TMessage); message CM_MOUSELEAVE;
  protected
    procedure Resize; override;
  public
  end;

procedure TNav.Resize;
begin
  inherited;
  // Do something
end;

在后一种情况下,只需添加

published
  property OnResize;

要访问父表单的属性(如果有),请在TNav 类中执行(例如)

GetParentForm(Self).Width

顺便问一下,你知道TPanelAnchors 属性吗?将TPanel 添加到表单,并在属性编辑器中设置Anchors := [akLeft,akTop,akRight]。这是你可以使用的东西吗?

【讨论】:

  • Dayam,我完全忘记了锚点。这就是你几天不睡觉时会发生的事情。非常感谢安德烈亚斯。代码和提醒都很棒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
相关资源
最近更新 更多