(五)、其他窗体(Other Forms) :
使用uniGUI创建新窗体向导允许创建三种窗体:
-
登录窗体 (Login Form 继承于TUniLoginForm)
-
应用程序窗体(Application Form)
-
自由窗体(Free Form)
应用程序窗体(Application Form)和自由窗体(Free Form) 有一些不同之处,请在下面子章节阅读时特别注意。
1)、应用程序窗体(Application Form)
下面创建一个应用程序窗体(Applicateion Form)后,系统自动生成的代码(已重命名):
unit _AppForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIForm;
type
TAppForm = class(TUniForm)
private
{ Private declarations }
public
{ Public declarations }
end;
function
AppForm: TAppForm;
implementation
{$R *.dfm}
uses
MainModule, uniGUIApplication;
function AppForm: TAppForm;
begin
Result := TAppForm(UniMainModule.GetFormInstance(TAppForm));
end;
end.
|
而不是像下面这样的窗体变量(传统VCL窗体代码):
上面是传统VCL窗体生成的标准代码,由向导生成了具有相同名称和类型的窗体变量。原始变量的作用域是全局的,但在Web多用户环境(会话)中毫无用处。UniGUI中的窗体函数从会话UniMainModule请求创建实例,自动将窗体本地化给每个对应的会话。该函数不但保留了VCL变量的原始意图和功能,而且每个会话还始终只能访问该窗体的一个对应实例(每个会话都是一个单例)。该函数很灵活,可以管理窗体的生命周期,具体如下:
-
如果窗体不存在,它将创建窗体
-
如果窗体被关闭,它将被释放,并从托管窗体列表中注销。(属性FreeOnClose = True)
-
如果已经存在,则立即返回。
1.1)、使用应用程序窗体的全局函数
uniGUI窗体是动态对象,由UniGUI框架自动分配和配置它们。如上所述,每个uniGUI应用程序窗体都与一个函数相关联,该函数将创建或返回该窗体的实例。提供该函数的主要目的是提供VCL和uniGUI之间的语法兼容性。在传统VCL中,窗体是可以自动创建或手工创建的,自动创建时,所有的窗体全局变量都是在应用程序启动时启动的。在传统VCL中,你可以很容易地使用你的窗体,只需编写简单的语法:Form1.Show;
同样,在uniGUI中,我们提供了一个类似于上面的方便语法,允许您访问您的窗体:UniForm1.Show;
必须记住,在上面的代码中,UniForm1是一个函数,而不是一个窗体变量。它返回当前会话的正确窗体实例,如果还没有创建实例,它将自动创建一个新实例并返回给此调用函数。
特别强调一下
:这个函数仅用于执行某些任务,它不应该被视为全局变量,因为它一开始就不是变量。这个全局函数仅仅只能在你想实例化和显示此窗体时使用,并且只能在同一事件中。
UniForm1.Caption := 'New Caption'; //
创建一个新的表单实例(赋值时系统会自动创建此窗体),并为标题分配一个新值
UniForm1.Show; //
接着在创建后立即调用Show函数,显示此窗体
|
另一个重要的细节是,
必须在创建uniGUI窗体时立即显示它们。不能在一个事件中创建一个窗体,然后在另一个事件中显示它(这点与VCL不同)
。如果您尝试这样做,uniGUI将会自动显示窗体,哪怕您没有显式地调用show或ShowModal,当然最好开发者自动显示窗体,而不应该让UniGUI来帮你“纠正”这个错误。
下面这样写是错误的或不规范的:
procedure TMainForm.UniButton4Click(Sender: TObject);
begin
UniForm1.Caption := 'New Caption';
end;
|
正确的写法如下:
procedure TMainForm.UniButton4Click(Sender: TObject);
begin
UniForm1.Caption := 'New Caption';
UniForm1
.Show;
//同一事件中必须要调用Show
end;
|
必须避免在数据模块(DataModule)中使用窗体实例,除非使用它创建和显示上面演示的窗体。您必须避免从DataModule或其他窗体访问窗体的公共变量。因为有这些都是违反良好OOP设计规则的。
窗体不能用于存储应用程序全局变量或数据组件,例如供其他窗体使用的数据连接组件。必须将每个窗体视为应用程序的原子元素,应用程序将拥有自己的私有变量以供内部使用。如果要为会话定义公共变量,则必须放在为此目的定义主模块(MainModule)或其他MainModule(如:ServerModule或从MainModule类中继承出来的其他MainModule)。
例如,在下面的代码中,窗体中的UniLabel用于显示字段数据。如上所述,必须避免这种形式的使用。
procedure
TDataModule2
.DataSource1DataChange(Sender: TObject; Field: TField);
begin
UniForm1
.UniLabel1.Caption := Field.DisplayText; //
窗体函数不应直接调用属于另一个窗体/模块的组件的事件处理程序中
end;
|
相反,您可以通过简单地使用数据感知控件(如TUniDBText)并将其连接到数据源来解决这个问题。如果想实现上述问题的功能,标准的解决方案是将TDataSource组件直接放在窗体上,并使用其OnDataChange事件来更新窗体的可视控件内容。这里的经验法则是避免从不属于该窗体的其他组件的事件处理程序更新窗体的可视元素。
上述规则的唯一例外是,当您完全控制特定窗体的生存期时。也就是说,您显式地在自己的代码中创建和销毁它,也是可以这样做的
(一般情况下,UniGUI不建议手工代码创建窗体或销毁窗体)
。
2)、自由窗体(Free Form)
下面是创建一个自由窗体(Free Form)后,系统自动生成的代码(已重命名):
unit _FreeForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIForm;
type
TFreeForm = class(TUniForm)
private
{ Private declarations }
public
{ Public declarations }
end;
implementation
uses
uniGUIApplication;
{$R *.dfm}
end.
|
这种自由窗体(Free Form)和应用程序窗体(Application Form)之间的主要区别是缺少窗体函数,相当于VCL全局变量。
更重要的区别是,用户可以通过自由窗体(Free Form),来完成下面应用程序窗体(Application Form)无法实现的事情:
-
可以创建窗体的多个实例(举个例子:在屏幕上留下几个非模态窗体,显示数据集的不同记录)
-
用户将对窗体生命周期有更严格的控制
下一个例子显示了相同的窗体,但经过修改以捕获文本作为模态窗体:
unit _FreeForm;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIForm, uniButton, uniGUIBaseClasses, uniEdit;
type
TFreeForm = class(TUniForm)
edtText: TUniEdit;
btnOk: TUniButton;
btnCancel: TUniButton;
private
function GetText: string;
public
property Text : string read GetText;
end;
function GetText : string;
implementation
uses
uniGUIApplication;
{$R *.dfm}
function GetText : string;
var
frm : TFreeForm;
begin
frm := TFreeForm.Create(uniGUIApplication.UniApplication);
if frm.ShowModal = mrOk then
Result := frm.Text
else
Result := '';
end;
{ TFreeForm }
function TFreeForm.GetText: string;
begin
Result := edtText.Text;
end;
end.
|
自由窗体的所有者不是全局应用程序,而是处理当前会话的实例。
还要注意:
窗体(frm)是自动释放的(FreeOnClose为true,并会给窗体ModalResult分配一个值)。变量本身将在超出范围(当函数GetText执行完毕且退出后)后释放。
当用户对GetText之类的服务感兴趣而不是对窗体感兴趣时,自由窗体(Free Form)非常方便。如果是这种情况,窗体将始终作为服务实现的一部分创建和运行,而不应该公开给程序的其他部分。因为程序所期望的只是服务。
(五)、其他窗体(Other Forms):使用uniGUI创建新窗体向导允许创建三种窗体:登录窗体 (Login Form 继承于TUniLoginForm) 应用程序窗体(Application Form) 自由窗体(Free Form)应用程序窗体(Application Form)和自由窗体(Free Form) 有一些不同之处,请在下面子章节阅读时特别注意。1)、应用...
每个
uni
GUI
应用程序都是使用一个主
窗体
(MainForm)的专用
窗体
和两个专用的
模块
主
模块
(MainModule)和服务
模块
(ServerModule)组成且自动创建的。登录
窗体
(LoginForm)在
uni
GUI
中也有特殊的含义,它主要是完成会话用户的登录事务,可视情况选择或增加。
上面讲的,是主要的或必不可少的一些
窗体
和
模块
,并不包括用户自己依需求创建的数据
模块
...
procedure Calback(Sender: TComponent; AResult: Integer);
procedure TForm.Calback(Sender: TComponent; AResult: Integer);
begin
case AResult of
mrYes:
begin
mrNo:
begin...
Uni
GUI
的特殊对象主要有:
Uni
Application 对象、
Uni
Session 对象、
Uni
ServerInstance 对象,下面分类进行简单概括说明,后面实战中结合实例再详细讲述。
1)、
Uni
Application 对象
Uni
Application返回一个T
Uni
GUI
Application实例,它是当前所有会话资源(主
窗体
MainForm、主
模块
...
checklistbox.rar
EasyUI整套皮肤组件_EasyUI 后台模板HTML_后台管理系统模板.zip
FMSoft
uni
GUI
Complete Professional Edition v1.0.0.1397 20170807网友测试没有问题的版本.tmp
ServerControlPanel.rar
SessionTimeout範例.rar
SpreadJS+
uni
gui
.rar
Uni
ButtonEdit.rar
Uni
DbGrid2Xls.pas
Uni
gui
jsPlumb Demo流程图.zip
uni
gui
调用百度地图.txt
uni
gui
+ueditor.zip
uni
GUI
Cn.pas
uni
gui
代码技巧收集.doc
Uni
Gui
例子_AjaxSqlite.zip
uni
Gui
例子_用
Uni
TreeView和
Uni
PageControl实现多文档界面.7z
Uni
Gui
服务器界面汉化 .zip
Uni
GUI
结合Echarts新Demo.rar
UNI
GUI
结合HFS.txt
Uni
gui
调用百度地图获取经纬度传递到服务器后台demo.rar
uni
gui
资源管理器.rar
uni
window去边框代码.rar
UNI
中图片手势缩放DEMO.rar
我收集的
uni
gui
资料.doc
演示 帮忙改下屏幕自适应.rar
用css解决
Uni
gui
在IE系列浏览器中字体变小的问题.rar
蓝色导航.rar
表格列锁汉化.rar
解决
uni
Gui
在IE里字体太小的问题.txt
针对指定控件设置 css样式 .png
防止Session大量快速增加.txt
集成html导航.rar
非常漂亮的UI.rar
验证码(修改)
uni
Canvas+
uni
Image.zip
验证码
uni
Captcha-MyCaptcha.rar
### 回答1:
Uni
GUI
是Delphi语言下的一种敏捷Web开发框架,基于WebAssembly技术,无需浏览器插件或Java Applet即可支持各种操作系统和浏览器。
Uni
GUI
是一种完全的Delphi框架,使得Delphi程序员能够开发出类似于常规的
窗体
应用程序的Web应用。
Uni
GUI
框架是开源的,用户可以在GitHub上下载到源代码。
Uni
GUI
支持Delphi 10.3 Rio,需要安装特定的软件包,包括VCL安装、Ajaxtoolkit的安装和
uni
GUI
安装。下载和安装
Uni
GUI
框架后,用户可以开始构建Web应用,并在浏览器中测试。
Uni
GUI
还提供了专业版,用户可以根据需要购买。
Uni
GUI
框架具有易用性、轻量级和一致性等特点。很多人喜欢
Uni
GUI
框架,是因为它的使用方式类似于Delphi的
窗体
开发方式,用户只需要使用Delphi的VCL控件,然后添加js代码即可。
Uni
GUI
还具有很好的可扩展性和自定义性,用户可以轻松自定义界面和控件样式。
总之,
Uni
GUI
框架是一种为Delphi程序员提供的快速轻量级Web应用开发工具,具有易用性、可扩展性和自定义性。用户可以在GitHub上下载到
Uni
GUI
框架源代码。
### 回答2:
Uni
GUI
是一款基于Delphi的Web应用程序开发框架,可用于快速构建高互动性的Web应用程序。它包含了丰富的
GUI
控件库、可重用的组件、AJAX支持、客户端脚本技术和布局管理工具,可轻松实现用户友好的Web前端设计。同时,
Uni
GUI
开源框架也提供强大的后端数据库管理系统和丰富的Web服务接口,让开发者在快速构建Web应用程序的同时,也能充分发挥掌握Delphi技术的优势,实现高效的业务逻辑处理。
想要下载
Uni
GUI
开源框架,可以在其官方网站上进行下载。打开网站后,选择“Downloads”选项,选择适合您的开发环境的版本进行下载。
Uni
GUI
的版本更新较为频繁,开发者可以根据需要选择不同的版本进行下载。
需要注意,
Uni
GUI
虽然是开源免费的框架,但仅提供30天免费试用,若需要长期使用则需要购买授权。此外,为了顺畅地使用
Uni
GUI
,您还需要掌握Delphi语言、熟悉Web应用程序开发技术和基本的数据库管理技能。
CSDN-Ada助手:
【一起学SQLite】--Delphi下使用封装类(单元类)玩SQLite(4)
qq_44753533:
【一起学UniGUI】--UniGUI的部署选项(5)
我是大宏:
【一起学UniGUI】--UniGUI的控件(Components)(9)
gz_SkyWin
【一起学UniGUI】--UniGUI的控件(Components)(9)
gz_SkyWin