• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiXE2之FireMonkey入门(36)-控件基础:TForm

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

当我第一次读取 Form1.StyleLookup 并期待出现 "formstyle" 时, 给的确是 "backgroundstyle" ...

现在明白了, 原来窗体上覆盖着一个 TRectangle 对象:

uses FMX.Objects;

procedure TForm1.Button1Click(Sender: TObject);
begin
  (Self.Children[0] as TRectangle).Fill.Color := claRed; //默认情况下, 通过 Children[0] 可读出这个矩形, 但其次序(Index)是可变的
  ShowMessage(Children[0].ToString); //TRectangle

  {Panel1 上也是盖着一个矩形对象, 应该还有其它也是这样}
  TRectangle(Panel1.Children[0]).Fill.Color := claYellow;
end;


现在的 FMX 窗体只有 8 个事件, 我回头数了数传统 VCL 窗体的事件有 40 个之多.
8个是少了点, 但其上级有不少可以覆盖的虚方法, 如:
MouseDown、MouseUp、MouseMove、MouseLeave、MouseWheel、DragDrop、DragEnter、DragOver、DragLeave、KeyDown、KeyUp 等等.
它们在窗体中没有以事件的方式出现, 可能是设计者认为在窗体中很少用到这些事件.

测试: 通过覆盖 MouseMove 响应鼠标移动事件:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs;

type
  TForm1 = class(TForm)
  private
  public
    { 在 TForm1 声明区 -> Ctrl+空格 -> 输入 MouseM... -> 回车 -> Shift+Ctrl+C }
    procedure MouseMove(Shift: TShiftState; X: Single; Y: Single); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.MouseMove(Shift: TShiftState; X, Y: Single);
begin
  inherited;
  Caption := Format('%f, %f', [X, Y]);
end;

end.


TForm 的继承链: TFmxObject -> TCommonCustomForm -> TCustomForm -> TForm

TCommonCustomForm 提出或实现了 TForm 和 TForm3D 的公有功能;
TCustomForm 通过实现 IScene 接口, 主要提供了 Canvas 和 Style 相关的功能;
TForm 没有功能扩展, 只是把部分成员改在 published 下以便在设计时可用.

{ TCommonCustomForm }
public
  constructor Create(...); override//
  constructor CreateNew(...); virtual; //它比 Create() 多出一个默认参数 Dummy, 但没看出什么用途(可能是给3D窗口用的吧); 暂时它和 Create() 没什么区别
  destructor Destroy; override;        //
  procedure InitializeNewForm; virtual//窗体初始化, 可通过覆盖此方法初始化窗体属性
  procedure AfterConstruction; override//建立后
  procedure BeforeDestruction; override//销毁前
  procedure AddObject(...); override;     //添加对象
  { children }
  function ObjectAtPoint(...): IControl; virtual; //指定位置上的控件
  { called from Platform }
  procedure SetMarkedText(...); virtual; //使用输入法时, 确认输入前的文本; 覆盖此方法可截获
  procedure PaintRects(...); virtual;    //更新指定的矩形(数组)范围; TCustomForm 里才有它的实现代码
  procedure MouseDown(...); virtual;          //响应鼠标事件
  procedure MouseMove(...); virtual;          //...
  procedure MouseUp(...); virtual;            //...
  procedure MouseWheel(...); virtual;         //...
  procedure MouseLeave; virtual;              //...
  procedure KeyDown(...); virtual;            //响应键盘事件
  procedure KeyUp(...); virtual;              //...
  function GetImeWindowRect: TRectF; virtual; //获取拥有输入焦点对象的范围矩形
  procedure Activate;                   //激活
  procedure Deactivate;                 //取消激活
  procedure DragEnter(...); virtual;    //响应拖放事件
  procedure DragOver(...); virtual;     //...
  procedure DragDrop(...); virtual;     //...
  procedure DragLeave; virtual;         //...
  procedure EnterMenuLoop;              //调用 TMenuBar 对象的 StartMenuLoop 方法
  { settings }
  procedure SetBounds(...); virtual;      //设置位置与大小
  function ClientToScreen(...): TPointF;  //点转换
  function ScreenToClient(...): TPointF;  //...
  function CloseQuery: Boolean; virtual//触发 OnCloseQuery 事件
  function ClientRect: TRectF;            //客户区矩形
  procedure Release;                      //释放
  procedure Close;                        //关闭
  procedure Show;                         //显示
  procedure Hide;                         //隐藏
  function ShowModal: TModalResult;       //显示为模态窗口
  procedure CloseModal;                   //触发 OnCloseQuery、OnClose 事件
  procedure Invalidate;                   //使无效而强制刷新
  procedure BeginUpdate;                  //开始更新
  procedure EndUpdate;                    //结束更新
  property Handle: TFmxHandle ...;        //窗口句柄
  property ContextHandle: THandle ...;    //环境句柄
  property ModalResult: TModalResult ...; //模态窗口的返回值
  property FormState: TFmxFormStates ...; //窗口模式状态
  property Designer: IDesignerHook ...;   //设计时相关的接口
  { IRoot }
  property Captured: IControl ...;  //被鼠标选中的控件
  property Focused: IControl ...;   //拥有焦点的控件
  property Hovered: IControl ...;   //鼠标下的控件
  property IsActive: Boolean ...;   //是否是激活状态
  property BiDiMode: TBiDiMode ...; //不同语言的方向
  property Caption: string ...;     //标题
  property Cursor: TCursor ...;     //光标类型
  property BorderStyle: TFmxFormBorderStyle ...; //边框样式
  property BorderIcons: TBorderIcons ...;        //工具条上的按钮
  property ClientHeight: Integer ...;            //客户区高
  property ClientWidth: Integer ...;             //客户区宽
  property Margins: TBound ...;                  //内边距
  property Position: TFormPosition ...;          //相对位置
  property Width: Integer ...;                   //宽
  property Height: Integer ...;                  //高
  property ShowActivated: Boolean ...;           //打开时是否激活
  property StaysOpen: Boolean ...;               //是否延迟打开
  property Transparency: Boolean ...;            //能否透明
  property TopMost: Boolean ...;                 //是否在最顶层
  property Visible: Boolean ...;                 //是否隐藏
  property WindowState: TWindowState ...;        //窗口状态(常态、最大化、最小化)
  property OnCreate: TNotifyEvent ...;          //建立时
  property OnDestroy: TNotifyEvent ...;         //销毁时
  property OnClose: TCloseEvent ...;            //关闭时
  property OnCloseQuery: TCloseQueryEvent ...;  //将要关闭时
  property OnActivate: TNotifyEvent ...;        //被激活时
  property OnDeactivate: TNotifyEvent ...;      //丢激活时
  property OnResize: TNotifyEvent ...;          //调整大小时
published
  property Left: Integer ...; //左
  property Top: Integer ...;  //上
end;


{ TCustomForm }
public
  constructor Create(...); override;    //
  constructor CreateNew(...); override; //
  destructor Destroy; override;               //释放
  procedure InitializeNewForm; override;      //初始化 Form, 应该是内部自动调用的
  procedure AddObject(...); override;         //添加对象
  procedure UpdateStyle;                      //更新样式
  property Canvas: TCanvas ...;               //绘图层
  property Fill: TBrush ...;                  //画刷
  property StyleBook: TStyleBook ...;         //样式表
  property ActiveControl: TStyledControl ...; //激活控件或获取被激活的控件
  property StyleLookup: string ...;           //指定控件样式名
  property OnPaint: TOnPaintEvent ...;        //重绘时
end;

当我第一次读取 Form1.StyleLookup 并期待出现 "formstyle" 时, 给的确是 "backgroundstyle" ...

现在明白了, 原来窗体上覆盖着一个 TRectangle 对象:

uses FMX.Objects;

procedure TForm1.Button1Click(Sender: TObject);
begin
  (Self.Children[0] as TRectangle).Fill.Color := claRed; //默认情况下, 通过 Children[0] 可读出这个矩形, 但其次序(Index)是可变的
  ShowMessage(Children[0].ToString); //TRectangle

  {Panel1 上也是盖着一个矩形对象, 应该还有其它也是这样}
  TRectangle(Panel1.Children[0]).Fill.Color := claYellow;
end;


现在的 FMX 窗体只有 8 个事件, 我回头数了数传统 VCL 窗体的事件有 40 个之多.
8个是少了点, 但其上级有不少可以覆盖的虚方法, 如:
MouseDown、MouseUp、MouseMove、MouseLeave、MouseWheel、DragDrop、DragEnter、DragOver、DragLeave、KeyDown、KeyUp 等等.
它们在窗体中没有以事件的方式出现, 可能是设计者认为在窗体中很少用到这些事件.

测试: 通过覆盖 MouseMove 响应鼠标移动事件:

unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs;

type
  TForm1 = class(TForm)
  private
  public
    { 在 TForm1 声明区 -> Ctrl+空格 -> 输入 MouseM... -> 回车 -> Shift+Ctrl+C }
    procedure MouseMove(Shift: TShiftState; X: Single; Y: Single); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.MouseMove(Shift: TShiftState; X, Y: Single);
begin
  inherited;
  Caption := Format('%f, %f', [X, Y]);
end;

end.


TForm 的继承链: TFmxObject -> TCommonCustomForm -> TCustomForm -> TForm

TCommonCustomForm 提出或实现了 TForm 和 TForm3D 的公有功能;
TCustomForm 通过实现 IScene 接口, 主要提供了 Canvas 和 Style 相关的功能;
TForm 没有功能扩展, 只是把部分成员改在 published 下以便在设计时可用.

{ TCommonCustomForm }
public
  constructor Create(...); override//
  constructor CreateNew(...); virtual; //它比 Create() 多出一个默认参数 Dummy, 但没看出什么用途(可能是给3D窗口用的吧); 暂时它和 Create() 没什么区别
  destructor Destroy; override;        //
  procedure InitializeNewForm; virtual//窗体初始化, 可通过覆盖此方法初始化窗体属性
  procedure AfterConstruction; override//建立后
  procedure BeforeDestruction; override//销毁前
  procedure AddObject(...); override;     //添加对象
  { children }
  function ObjectAtPoint(...): IControl; virtual; //指定位置上的控件
  { called from Platform }
  procedure SetMarkedText(...); virtual; //使用输入法时, 确认输入前的文本; 覆盖此方法可截获
  procedure PaintRects(...); virtual;    //更新指定的矩形(数组)范围; TCustomForm 里才有它的实现代码
  procedure MouseDown(...); virtual;          //响应鼠标事件
  procedure MouseMove(...); virtual;          //...
  procedure MouseUp(...); virtual;            //...
  procedure MouseWheel(...); virtual;         //...
  procedure MouseLeave; virtual;              //...
  procedure KeyDown(...); virtual;            //响应键盘事件
  procedure KeyUp(...); virtual;              //...
  function GetImeWindowRect: TRectF; virtual; //获取拥有输入焦点对象的范围矩形
  procedure Activate;                   //激活
  procedure Deactivate;                 //取消激活
  procedure DragEnter(...); virtual;    //响应拖放事件
  procedure DragOver(...); virtual;     //...
  procedure DragDrop(...); virtual;     //...
  procedure DragLeave; virtual;         //...
  procedure EnterMenuLoop;              //调用 TMenuBar 对象的 StartMenuLoop 方法
  { settings }
  procedure SetBounds(...); virtual;      //设置位置与大小
  function ClientToScreen(...): TPointF;  //点转换
  function ScreenToClient(...): TPointF;  //...
  function CloseQuery: Boolean; virtual//触发 OnCloseQuery 事件
  function ClientRect: TRectF;            //客户区矩形
  procedure Release;                      //释放
  procedure Close;                        //关闭
  procedure Show;                         //显示
  procedure Hide;                         //隐藏
  function ShowModal: TModalResult;       //显示为模态窗口
  procedure CloseModal;                   //触发 OnCloseQuery、OnClose 事件
  procedure Invalidate;                   //使无效而强制刷新
  procedure BeginUpdate;                  //开始更新
  procedure EndUpdate;                    //结束更新
  property Handle: TFmxHandle ...;        //窗口句柄
  property ContextHandle: THandle ...;    //环境句柄
  property ModalResult: TModalResult ...; //模态窗口的返回值
  property FormState: TFmxFormStates ...; //窗口模式状态
  property Designer: IDesignerHook ...;   //设计时相关的接口
  { IRoot }
  property Captured: IControl ...;  //被鼠标选中的控件
  property Focused: IControl ...;   //拥有焦点的控件
  property Hovered: IControl ...;   //鼠标下的控件
  property IsActive: Boolean ...;   //是否是激活状态
  property BiDiMode: TBiDiMode ...; //不同语言的方向
  property Caption: string ...;     //标题
  property Cursor: TCursor ...;     //光标类型
  property BorderStyle: TFmxFormBorderStyle ...; //边框样式
  property BorderIcons: TBorderIcons ...;        //工具条上的按钮
  property ClientHeight: Integer ...;            //客户区高
  property ClientWidth: Integer ...;             //客户区宽
  property Margins: TBound ...;                  //内边距
  property Position: TFormPosition ...;          //相对位置
  property Width: Integer ...;                   //宽
  property Height: Integer ...;                  //高
  property ShowActivated: Boolean ...;           //打开时是否激活
  property StaysOpen: Boolean ...;               //是否延迟打开
  property Transparency: Boolean ...;            //能否透明
  property TopMost: Boolean ...;                 //是否在最顶层
  property Visible: Boolean ...;                 //是否隐藏
  property WindowState: TWindowState ...;        //窗口状态(常态、最大化、最小化)
  property OnCreate: TNotifyEvent ...;          //建立时
  property OnDestroy: TNotifyEvent ...;         //销毁时
  property OnClose: TCloseEvent ...;            //关闭时
  property OnCloseQuery: TCloseQueryEvent ...;  //将要关闭时
  property OnActivate: TNotifyEvent ...;        //被激活时
  property OnDeactivate: TNotifyEvent ...;      //丢激活时
  property OnResize: TNotifyEvent ...;          //调整大小时
published
  property Left: Integer ...; //左
  property Top: Integer ...;  //上
end;


{ TCustomForm }
public
  constructor Create(...); override;    //
  constructor CreateNew(...); override; //
  destructor Destroy; override;               //释放
  procedure InitializeNewForm; override;      //初始化 Form, 应该是内部自动调用的
  procedure AddObject(...); override;         //添加对象
  procedure UpdateStyle;                      //更新样式
  property Canvas: TCanvas ...;               //绘图层
  property Fill: TBrush ...;                  //画刷
  property StyleBook: TStyleBook ...;         //样式表
  property ActiveControl: TStyledControl ...; //激活控件或获取被激活的控件
  property StyleLookup: string ...;           //指定控件样式名
  property OnPaint: TOnPaintEvent ...;        //重绘时
end;

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
《DSP using MATLAB》示例9.1发布时间:2022-07-18
下一篇:
MATLAB中的结构数组发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap