Jes*_*own 7 delphi vcl tpagecontrol
我有一个VCL表格,上面有五个标签TPageControl.每个TTabSheet内容都是相当无关的,并且有很多单独的控件和处理逻辑...所以我想要分解它,这样就可以更容易地处理"只是那个选项卡"的代码.像一条线
//-------------------------- begin rules tab methods -------------------
Run Code Online (Sandbox Code Playgroud)
只是不再削减它了.真的,我想我想以某种方式将每个标签放在一个单独的文件中.
目前我正在考虑为每个TTabPage创建一个VCL框架.如果我这样做,我需要将所有帧加载到构造函数中的TPageControl中,或者显示选项卡时.
这是一个好方法吗?为每个标签制作一个完整的TForm会更好吗?我应该继续将选项卡包装在TPageControl中,还是应该在动态加载内容时将其更改为TTabControl?如果这是一个好方法,最好在启动时加载所有选项卡,还是每次显示选项卡?(也许是优点/缺点,如果不是完全明显哪个在大多数/所有情况下都更好)
我想做的一件事(这个问题的焦点)是以某种方式分解包含五个TTabSheets的TPageControl.每个标签页都是UI(和相应的处理逻辑)的一个非常有凝聚力的部分,因此将每个标签分成单独的文件会很好.
你可以用TFrame它.为每个页面提供自己的Frame,您可以使用自己的DFM在各自的文件中实现和设计.
对于每个分解的选项卡,我想首先添加新的VCL表单吗?还是VCL框架?
帧.不要使用嵌入式表单,它们不能很好地工作.框架是为此目的而设计的.
如果从面板加载每个标签的内容,我是否应该离开TPageControl或将其更改为TTabControl?
在创建新框架并根据需要进行设计之后,您可以:
将Frame放在Component Palette上(右键单击Designer中的Frame并选择'Add to Palette'),然后TTabSheet在设计时将其拖放到所需的位置.如果要填充整个框架Align,alClient请将框架设置为TTabSheet.
在运行时在代码中实例化Frame对象,然后将其Parent属性设置为所需的属性TTabSheet.
您可以使用框架或表单.
procedure TMyForm.AddPage( AFormClass : TFormClass );
var
LForm : TForm;
begin
LForm := AFormClass.Create( Self );
LForm.ManualDock( PageControl1, nil, alClient );
LForm.Show;
end;
Run Code Online (Sandbox Code Playgroud)
unit UI_Form_SettingBase;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
type
TUISettingBase_Form = class( TForm )
private
protected
procedure DoSaveData; virtual;
public
function CanSaveData : Boolean; virtual;
procedure SaveData;
end;
TUISettingBase_FormClass = class of TUISettingBase_Form;
var
UISettingBase_Form : TUISettingBase_Form;
implementation
{$R *.dfm}
{ TUISettingBase_Form }
function TUISettingBase_Form.CanSaveData : Boolean;
begin
Result := True;
end;
procedure TUISettingBase_Form.DoSaveData;
begin
end;
procedure TUISettingBase_Form.SaveData;
begin
if CanSaveData
then
DoSaveData;
end;
end.
Run Code Online (Sandbox Code Playgroud)
从该表单派生所有设置表单,并覆盖DoSaveData和可选的CanSaveData方法
unit UI_Form_SettingCommon;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UI_Form_SettingBase, Vcl.StdCtrls;
type
TUISettingCommon_Form = class(TUISettingBase_Form)
CheckBox1: TCheckBox;
private
protected
procedure DoSaveData; override;
public
end;
var
UISettingCommon_Form: TUISettingCommon_Form;
implementation
{$R *.dfm}
procedure TUISettingCommon_Form.DoSaveData;
begin
inherited;
// code to save the data
end;
end.
Run Code Online (Sandbox Code Playgroud)
unit UI_Form_SettingConnection;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UI_Form_SettingBase, Vcl.StdCtrls;
type
TUISettingConnection_Form = class( TUISettingBase_Form )
Edit1 : TEdit;
private
protected
procedure DoSaveData; override;
public
end;
var
UISettingConnection_Form : TUISettingConnection_Form;
implementation
{$R *.dfm}
{ TUISettingConnection_Form }
procedure TUISettingConnection_Form.DoSaveData;
begin
inherited;
// code to save the data
end;
end.
Run Code Online (Sandbox Code Playgroud)
主设置表单也派生自SettingBase
unit UI_Form_Settings;
interface
uses
System.Generics.Collections,
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, UI_Form_SettingBase, Vcl.StdCtrls,
Vcl.ExtCtrls, Vcl.ComCtrls;
type
TUISettings_Form = class( TUISettingBase_Form )
PageControl1 : TPageControl;
Panel1 : TPanel;
Save_Button : TButton;
private
FForms : TList<TUISettingBase_Form>;
procedure AddSettingPage( ASettingFormClass : TUISettingBase_FormClass );
protected
procedure DoSaveData; override;
public
function CanSaveData : Boolean; override;
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
end;
var
UISettings_Form : TUISettings_Form;
implementation
{$R *.dfm}
uses
UI_Form_SettingCommon, UI_Form_SettingConnection;
{ TUISettings_Form }
procedure TUISettings_Form.AddSettingPage( ASettingFormClass : TUISettingBase_FormClass );
var
LForm : TUISettingBase_Form;
begin
LForm := ASettingFormClass.Create( Self );
try
LForm.ManualDock( PageControl1, nil, alClient );
LForm.Show;
FForms.Add( LForm );
LForm := nil;
finally
LForm.Free;
end;
end;
procedure TUISettings_Form.AfterConstruction;
begin
inherited;
FForms := TList<TUISettingBase_Form>.Create;
// add all the setting forms
AddSettingPage( TUISettingCommon_Form );
AddSettingPage( TUISettingConnection_Form );
end;
procedure TUISettings_Form.BeforeDestruction;
begin
inherited;
FForms.Free;
end;
function TUISettings_Form.CanSaveData : Boolean;
var
LForm : TUISettingBase_Form;
begin
// iterate all setting forms if they can save the data
Result := True;
for LForm in FForms do
Result := Result and LForm.CanSaveData;
end;
procedure TUISettings_Form.DoSaveData;
var
LForm : TUISettingBase_Form;
begin
inherited;
// iterate all setting forms and save the data
for LForm in FForms do
LForm.SaveData;
end;
end.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
694 次 |
| 最近记录: |