2Pascal-新时代的Pascal

 找回密码
 立即注册
搜索
热搜: fastreport
查看: 1486|回复: 4
打印 上一主题 下一主题

[求助]如何高效动态的创建Form?

[复制链接]

1

主题

6

帖子

62

积分

注册会员

Rank: 2

积分
62
跳转到指定楼层
楼主
发表于 2015-6-14 10:13:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
京东购书支持本站
为方面描述,我们假设应用程序里面有两个Form:Form_Login、Form_Main

1. 我在登录界面的Button事件中创建主界面,OK
[mw_shl_code=delphi,true]
Application.CreateForm(TForm_Main, Form_Main);
  Application.MainForm := Form_Main;
  Application.Title := Form_Main.Caption;
  Form_Main.Show;
[/mw_shl_code]


但是,由于Form_Main“内容丰富”,所以从登录界面切换到主界面的执行时间过长,导致用户体验较差,于是有了下面的2

2. 我在登录界面的OnCreate事件中使用多线程技术创建主Form
(1) 线程函数CreateMainForm:
[mw_shl_code=delphi,true]
procedure CreateMainForm();
begin
  Sleep(1000);//延时1秒.
  Application.CreateForm(TForm_Main, Form_Main);
end;
[/mw_shl_code]


(2) 登录Form的调用代码
[mw_shl_code=c,true]
procedure TForm_Login.FormCreate(Sender: TObject);
begin
  Form_Main := nil;
  TThread.CreateAnonymousThread(CreateMainForm).Start;
end;
[/mw_shl_code]


(3) 然后在登录界面的Button事件中直接使用主界面
[mw_shl_code=delphi,true]
procedure TForm_Login.ButtonLoginClick(Sender: TObject);
begin
  // do something here.

  Application.MainForm := Form_Main;
  Application.Title := Form_Main.Caption;
  Form_Main.Show;
  Close();
end;
[/mw_shl_code]



其结果是登录界面消失了,但是主界面没有出来,应用程序还在,感觉已经无界面了。

问题:这种做法是否可行,具体操作问题在哪里?
回复

使用道具 举报

0

主题

2

帖子

10

积分

新手上路

Rank: 1

积分
10
推荐
发表于 2015-6-18 10:06:11 | 只看该作者
京东数码购物支持本站
个人愚见:
对于主窗体内容丰富的处理,我觉得可以参考一下其它App的处理方式。
例如:腾迅的全民飞机大战,这个里面元素和内容都相当多,那它是怎么做的呢?
-> 运行App
-> 显示启动画面(腾迅游戏)
-> 显示启动动画(光速工作室)
-> 显示预载页面(黑底,只有一个菊花和一行文本,文本内容只有一行:亲,请稍等,努力加载中...xx%)
-> 显示登录界面,登录验证时用一个很炫的速度标作为进度条, 减少用户的等待焦虑。
-> 显示通知界面,获取内容(你没看错,它是先显示出来,再转菊花获取内容)
-> 显示登录奖励界面
-> 登录成功后显示''主''窗体
-------------------------------------
虽然它肯定不是用Delphi写的,但很显示,我们可以参考人家的思路。
另外,不应该用PC上的开发模式来写App,不要硬性规定哪个是主窗,在App中只有Activity这个概念,谁主谁副是不重要的,因为你不能、也不应该同时显示2个窗体(虽然有同胎这样做了)
回复 支持 1 反对 0

使用道具 举报

6

主题

44

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
沙发
发表于 2015-6-14 10:32:24 | 只看该作者
京东购书支持本站
我这样实现的
1.MainForm自动创建
2.MainForm.OnActive事件中建立LoginForm并显示
回复 支持 反对

使用道具 举报

1

主题

6

帖子

62

积分

注册会员

Rank: 2

积分
62
板凳
 楼主| 发表于 2015-6-14 10:49:24 | 只看该作者
京东数码购物支持本站
红鱼儿 发表于 2015-6-14 10:32
我这样实现的
1.MainForm自动创建
2.MainForm.OnActive事件中建立LoginForm并显示

参考了一下你的blog:http://blog.sina.com.cn/s/blog_44fa172f0102v3yt.html
感觉这应该是个可行的办法
回复 支持 反对

使用道具 举报

6

主题

44

帖子

301

积分

中级会员

Rank: 3Rank: 3

积分
301
地板
发表于 2015-6-15 08:39:37 | 只看该作者
京东数码购物支持本站
那个方法,当时我测试是可行的。
现在看来不合理,因为xe8建立一个Form的速度够快。
所以,我让Application自动建立mainForm.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|新时代Pascal论坛

GMT+8, 2024-4-29 06:29 , Processed in 0.068228 second(s), 24 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表