文档章节

有趣的 TBitBtn.Kind

涂孟超
 涂孟超
发布于 2014/09/26 15:31
字数 974
阅读 10
收藏 0

窗体上放一个 BitBtn1, 设置其属性 Kind 的值为 bkClose; 然后运行看看...

结果是: 不仅自动更改了标题、图标, 并且还真的有了关闭窗口的功能.

实话说, 这之前我不知道这个小功能.

TBitBtn 的 Kind 属性对应的是一个枚举:
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp, bkYes, bkNo, bkClose, bkAbort, bkRetry, bkIgnore, bkAll);

再试其他值, 除了图标的变化外, 貌似没有其他功能了, 为什么 bkClose 可以关闭窗口?

代码追踪到 TBitBtn 重写的 Click 方法, 就明白了:
procedure TBitBtn.Click;
var
  Form: TCustomForm;
  Control: TWinControl;
begin
  case FKind of
    bkClose:
      begin
        Form := GetParentForm(Self);
        if Form <> nil then Form.Close
        else inherited Click;
      end;
    bkHelp:
      begin
        Control := Self;
        while (Control <> nil) and (Control.HelpContext = 0) do
          Control := Control.Parent;
        if Control <> nil then Application.HelpContext(Control.HelpContext)
        else inherited Click;
      end;
    else
      inherited Click;
  end;
end;

 
 
 
 
 

 

 

  

看来不只是 bkClose, 还有 bkHelp 也赋予了功能, 当然这得先给窗体关联了帮助文件才行.

那其他呢? 譬如 bkOK、bkCancel 等等, 难道只是更换个图标那么简单?

当代码追踪到:
procedure TBitBtn.SetKind(Value: TBitBtnKind);
begin
...
  ModalResult := BitBtnModalResults[Value];
...
end;

 
 
 
 
 

 

 

  

原来 TBitBtn 不同的 Kind 属性决定着其 ModalResult 的值, 并且根据 BitBtnModalResults 的定义, 知道了 Kind 与 ModalResult 的对应关系:
bkCustom   { ModalResult = 0 }
bkOK       { ModalResult = 1 }
bkCancel   { ModalResult = 2 }
bkHelp     { ModalResult = 0 }
bkYes      { ModalResult = 6 }
bkNo       { ModalResult = 7 }
bkClose    { ModalResult = 0 }
bkAbort    { ModalResult = 3 }
bkRetry    { ModalResult = 4 }
bkIgnore   { ModalResult = 5 }
bkAll      { ModalResult = 8 }

 
 
 
 
 

 

 

  

什么是 ModalResult, 这是模式窗口(用 ShowModal 方法打开的窗口)的返回值.

这个 ModalResult 不是 TBitBtn 的吗? 和窗口有什么关系? 继续追踪代码:
procedure TCustomButton.Click;
var
  Form: TCustomForm;
begin
  Form := GetParentForm(Self);
  if Form <> nil then Form.ModalResult := ModalResult;
  inherited Click;
end;

 
 
 
 
 

 

 

  

原来在按钮点击时, 按钮的 ModalResult 值就付给了窗体的同名属性.

对模式窗口来讲, 如果给 ModalResult 赋的值大于 0, 模式窗口将即刻关闭, 测试下:

//代码功能: 
//点击按钮弹出一个模式窗口;
//在模式窗口中画有 11 个 TBitBtn 按钮, 分别设置了不同的 Kind 属性;
//鼠标指向按钮, Hint 提示出按钮的 ModalResult 值.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons; { TBitBtn 在 Buttons 单元 }

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
const
  w = 75; h = 25; a = 8; b = 8;
var
  ModalForm: TForm;
  i,x,y: Integer;
begin
  Application.HintColor := clRed;
  ModalForm := TForm.Create(Application);
  ModalForm.ClientWidth := (w + a) * 6 + a;
  ModalForm.ClientHeight := (h + b) * 2 + b;
  ModalForm.Caption := 'ModalFormTest';

  x := a; y := b;
  for i := 0 to 10 do
  begin
    with TBitBtn.Create(ModalForm) do
    begin
      Parent := ModalForm;
      Kind := TBitBtnKind(i);
      Hint := Format(' %d ', [ModalResult]);
      ShowHint := True;
      SetBounds(x, y, w, h);
      Inc(x, w + a);
      if i = 5 then
      begin
        x := a;
        Inc(y, h + b);
      end;
    end;
  end;

  ModalForm.ShowModal;
end;

end.

 
 
 
 
 

 

 

  

点击按钮后, 弹出窗口的效果图如下:



其中有 3 个按钮的值是 0, 也就是说点击它们窗口不应该关闭, 但点击 Kind 属性是 bkClose 的按钮窗口也还是关闭了, 尽管它的 ModalResult 值也是 0.

这不矛盾, 又回到刚开始的问题了, 这是 TBitBtn 重写的 Click 方法赋予的功能.

其他按钮行吗? 譬如: TButton.

看了一下, TButton 根本没有 Kind 属性, 但它有 ModalResult 属性; 这样我们也可以:
procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);

  with TButton.Create(frm) do begin
    Caption := '确认';
    ModalResult := mrOk; {1}
    Parent := frm;
    Left := 100; top := 40;
  end;

  with TButton.Create(frm) do begin
    Caption := '取消';
    ModalResult := mrCancel; {2}
    Parent := frm;
    Left := 100; top := 80;
  end;

  frm.ShowModal;
  frm.Free;
end;

 
 
 
 
 

 

 

  

其他控件行吗? 譬如 TEdit.

查了一下, 它没有 ModalResult 属性, 但它所在的窗口有啊.

譬如下面的例子, 在模式窗口的 Edit 中输入 "Exit" 即可关闭该模式窗口:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure EditChange(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  frm: TForm;
begin
  frm := TForm.Create(Application);

  with TEdit.Create(frm) do begin
    Parent := frm;
    Left := 100; top := 40;
    CharCase := ecLowerCase;
    OnChange := EditChange; //
  end;

  frm.ShowModal;
  frm.Free;
end;

{ 这是供动态建立的 TEdit 的 OnChange 事件调用的方法 }
procedure TForm1.EditChange(Sender: TObject);
begin
  if TEdit(Sender).Text = 'exit' then
    GetParentForm(TEdit(Sender)).ModalResult := 1;
end;

end.

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/01/16/1649120.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
C语言偏门一角得用法你知多少?认识一下不一样得C语言语法

曾经我自诩半个诗人,见山是深情伟岸,见海是热情澎湃,见花见草信他们皆有故事,云海江潮,虫鸣鸟啼都暗藏情愫。唯独见了你,山川沉默,海面静谧,云海不再翻涌,江潮不再澎湃,花鸟鱼虫被光...

这个人很懒什么都没留下
2018/07/21
0
0
那些年学C/C++的我做过这些项目,这些年正在学习的你们做过什么

那些年学C/C++的我做过这些项目,这些年正在学习的你们做过什么,纯属装逼娱乐,请勿模仿。 懵懂期 那时还是彩笔一个,终极版菜鸟,倒弄一些自以为很有意思的东西 作品一:(效果稍微久一点)...

这个人很懒什么都没留下
2017/12/19
0
0
【复习图论】如何找出一个强连通图的奇环

如何找出一个强连通图的奇环 这个问题来自于《算法概论》的课后习题,我想了2天,最后想出一个可行的办法。 首先,对于环的问题,有两个常规的手段,一个是点染色,还有一个是利用边的分类。...

m2012
2012/10/29
0
0
程序员不容错过的5大有趣编程网站,你知道几个?

学编程最重要的是实践,就是写代码、看别人写的代码、再写代码。 要掌握编程这一门手艺,要经过大量的训练。 如果编程练习可以变得有趣,那你一定可以乐此不疲,长期坚持。 下面w3cschol分享...

W3Cschool
2018/04/12
0
0
以后恐怕再也不会有人说你死板得像机器了!

计算机也能懂幽默吗? 很多人都说幽默其实是人的一种天赋,一种气质,有了它,你就会大大提升个人魅力。有些人天生就不具备,刻板固执。可以这么说,幽默是人的一种专属特质或是能力。但是机...

行者武松
2018/03/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

容器服务

简介 容器服务提供高性能可伸缩的容器应用管理服务,支持用 Docker 和 Kubernetes 进行容器化应用的生命周期管理,提供多种应用发布方式和持续交付能力并支持微服务架构。 产品架构 容器服务...

狼王黄师傅
昨天
3
0
高性能应用缓存设计方案

为什么 不管是刻意或者偶尔看其他大神或者大师在讨论高性能架构时,自己都是认真的去看缓存是怎么用呢?认认真真的看完发现缓存这一块他们说的都是一个WebApp或者服务的缓存结构或者缓存实现...

呼呼南风
昨天
12
0
寻找一种易于理解的一致性算法(扩展版)

摘要 Raft 是一种为了管理复制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法结构和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易构建实际的系统。为了提升可...

Tiny熊
昨天
2
0
聊聊GarbageCollectionNotificationInfo

序 本文主要研究一下GarbageCollectionNotificationInfo CompositeData java.management/javax/management/openmbean/CompositeData.java public interface CompositeData { public Co......

go4it
昨天
3
0
阿里云ECS的1M带宽理解

本文就给大家科普下阿里云ECS的固定1M带宽的含义。 “下行带宽”和“上行带宽” 为了更好的理解,需要先给大家解释个词“下行带宽”和“上行带宽”: 下行带宽:粗略的解释就是下载数据的最大...

echojson
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部