(五)、其他窗体(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窗体代码):

var
AppForm : TAppForm;

上面是传统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助手: 非常感谢博主为我们带来了如此精彩的 Delphi 下使用封装类玩 SQLite 的系列博客,相信对于很多人都是非常有帮助的。阅读了这篇博客,我不仅加深了对 SQLite 的理解,而且对于 Delphi 的开发也有了更进一步的认识。希望博主能继续分享更多相关知识,让我们一起成长。再次感谢博主的辛勤付出! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 【一起学SQLite】--Delphi下使用封装类(单元类)玩SQLite(4) qq_44753533: 非常感谢您的源码,可以实现不用控件把数据库的表写到dbgrid。请问如何把excel表的数据批量写入sqlit3的数据库呢? 【一起学UniGUI】--UniGUI的部署选项(5) 我是大宏: 请问isapi方式,浏览器访问不需要端口号么? 【一起学UniGUI】--UniGUI的控件(Components)(9) gz_SkyWin 重庆老来: 还有一点,一定要注意和记得:UniGUI是基本ExtJS的WEB模式,而不是之前的VCL。虽然有时很像之前的VCL外观,但本质是不同的。其源仍是ExtJS,简单的说,就是ExtJS的"VCL封装"。 【一起学UniGUI】--UniGUI的控件(Components)(9) gz_SkyWin 重庆老来: 其实有很多的功能都是要额外写代码的。直接在控件属性中实现的太少太少。建议多去官网论坛中看看