【发布时间】:2020-09-17 00:44:44
【问题描述】:
我有一个在许多表上实现 CRUD 的应用程序。
主表单为每个表格提供一个选项卡,以及一个工具栏,其中包含对所有选项卡都有效的插入、更新、删除按钮。
每次更改选项卡时,都会有一个变量
frameClass: TFrameClass;(其中TFrameClass = class of TFrame)获取选项卡下创建的框架类型,其他变量frame: TFrame;获取选项卡下创建的框架。
当点击 INSERT 按钮时,我想指向与活动选项卡对应的Insert() 过程,例如:
frameClass(frame).insert // trying to cast
但是编译器说插入不是一个有效的方法。但是,如果我使用 frameClass 的内容进行投射,它就可以工作:
TFrame1(frame).insert; // does not work in general case.
我做错了什么?
这是示例代码:
Unit1.pas
unit unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Menus,
FMX.TabControl,
unit2, unit3;
type
TFrameClass = class of TFrame;
TFormMain = class(TForm)
TabControl1: TTabControl;
TabItem1: TTabItem;
TabItem2: TTabItem;
PopupMenu1: TPopupMenu;
MenuItemInsert: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure TabControl1Change(Sender: TObject);
procedure MenuItemInsertClick(Sender: TObject);
public
frame: TFrame;
frameClass: TFrameClass;
frames: array[0..1] of TFrameClass;
end;
var
FormMain: TFormMain;
implementation
{$R *.fmx}
procedure TFormMain.FormCreate(Sender: TObject);
begin
frames[0]:= TFrame1;
frames[1]:= TFrame2;
end;
procedure TFormMain.MenuItemInsertClick(Sender: TObject);
begin
// want the insert click to work whatever the activeTab is
// (frame as FrameClass).insert; // insert is not a method
// THIS IS THE GIST OF MY QUESTION:
// TFrame1(frame).insert; // it works but want it general
// FrameClass(frame).insert; // this is how I'd like it to work
end;
procedure TFormMain.TabControl1Change(Sender: TObject);
begin
frameClass:= frames[tabControl1.tabIndex];
frame:= frameClass.Create(tabControl1.activeTab);
frame.Parent:= tabControl1.activeTab;end;
end.
Unit2.pas
unit Unit2;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation;
type
// if try to descend from other than TFrame, some properties like align, size, etc, are lost
TFrame1 = class(TFrame)
Label1: TLabel;
private
{ Private declarations }
public
{ Public declarations }
procedure insert;
end;
implementation
{$R *.fmx}
procedure TFrame1.insert;
begin
//
end;
end.
unit3.pas
unit Unit3;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
FMX.Controls.Presentation, FMX.Edit;
type
// if try to descend from other than TFrame, some properties like align, size, etc, are lost
TFrame2 = class(TFrame)
Edit1: TEdit;
private
{ Private declarations }
public
{ Public declarations }
procedure insert;
end;
implementation
{$R *.fmx}
procedure TFrame2.insert;
begin
//
end;
end.
【问题讨论】: