zoukankan      html  css  js  c++  java
  • Delphi XE2 之 FireMonkey 入门(36) 控件基础: TForm


    当我第一次读取 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;
    

  • 相关阅读:
    乘法DAC一点知识
    #4 判断字符串是否为整数
    #3 不使用循环输出1到100
    #2 判断一个字符串是否包含重复字符
    #22 结语
    #1 组成互不相同且不重复的三位数
    #21 Python异常
    #19 re&jieba模块
    2020国庆正睿笔记
    2019正睿csp-s赛前冲刺
  • 原文地址:https://www.cnblogs.com/del/p/2199654.html
Copyright © 2011-2022 走看看