在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
当我第一次读取 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; |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论