谈谈VCL程序标准化 (0分)

  • 主题发起人 主题发起人 laozhongcheng
  • 开始时间 开始时间
to laozhongcheng:
我明白你的想法,呵呵!
的确,要局部更改VCL对TControl这一层以上的组件是很不容易的事情,实际上也是对
原有设计的一种破坏性操作,而你的实现已经比较完善了。
有空的话,我会继续帮你找点Bug出来的,相信还会有很多 :)
 
Adnil,你的话有些不太人道。:)
不过这个工程的确很长知识,弄清楚一些VCL的基本流程和工作原理。

呵呵,又修改了一处bug。
原来在任务管理器里面一个程序会出现两个项目
现在修改了TApplication.CreateForm后正常了
ft,怎么还有这么多细节问题。

对了,还有一个问题,如果在NAV风格下
需要显示封面的话,记得在调用Show过程之前
一定要给窗体加上WS_EX_TOOLWINDOW附加风格(否则会出现标题栏按钮)

从Borland上下载时注意我的上传时间,如果
比我在这里的回答时间要早的话,就代表
我还没有将新的文件上传
(现在无法访问Borland代码中心,应该明天中午上传)
 
Application.MainForm.Handle是必不可少的吗?实在不明白,不用它操作就是了。
模式对话框的问题,我在另一个帖子回答得比较清楚。
有兴趣的话,给个mail,我发一个例子给你,你说的问题都没有。
 
Borland代码中心注册的时候国家选项里怎么有台湾阿? ?[:(!][:(!]
 
再重复一次我的E-MAIL: laozhongcheng@163.com
不是必不可少 而是比较容易能够兼容传统程序
有时候通过Application.MainForm.Handle访问主窗体还是有特定用途的

还有 有台湾并不奇怪 因为台湾在国际上就被称作台湾
就像香港、澳门一样 不过如果有ROC的话,倒是不好:-)
 
升级到1.3版了
与以前相比有以下这些改进:
原来的TApplication.Minimize和TApplication.Restore存在bug
可能造成无法通过调用来最小化和还原,现在重写了这两个过程,应该正常了
响应了WM_ACTIVEAPP消息,然后在处理过程中调用了TApplication.OnActivate和
TApplication.OnDeactivate,确保针对这两个过程写的程序正常。

动态库也同时升级,改进的地方除了和静态版本相同的之外,还有以下几点:
实现了MessageBox函数。
实现了Minimize和Restore过程。
注意,最好使用代替窗体的相关函数过程代替Application对象的相应过程。

还有关于显示封面,使用下面这种方法比较好(同时适用于动态库和静态库)。

制作NAV程序封面的时候,最好不要将代码写在主窗体的FormCreate过程里面,此时,程序还没有创建主窗口,而Splash将被当作程序主窗口,在任务管理器中就会出现不必要的程序项目。因而,应当把代码放在Splash窗体单元的相应部分,比如一个公共过程Loading中。然后先由程序自动创建主窗体,在此之前要用Application.ShowMainForm := False;来禁止主窗体自动显示。紧接着,创建Splash窗体,然后显示Splash窗体,接着才调用Splash窗体的Loading,在Loading过程中记得在适当时候使用Update来刷新窗体。并且,在所有准备工作结束后,显示主窗体,同时关闭和释放Splash窗体。返回到工程源文件,进入消息循环。代码如下:

program NAVSplash;

uses
Forms,
Main in 'Source/Main.pas' {FormMain},
Splash in 'Source/Splash.pas' {FormSplash},
About in 'Source/About.pas' {AboutBox},

{$R *.res}

var
i: integer;
begin
Application.Initialize;
Application.ShowMainForm := False;
Application.CreateForm(TFormMain, FormMain);
Application.CreateForm(TFormSplash, FormSplash);
FormSplash.Show;
FormSplash.Update;
FormSplash.Loading;
Application.Run;
end.

unit Splash;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, jpeg, ComCtrls;

type
TFormSplash = class(TForm)
ProgressBar1: TProgressBar;
private
{ Private declarations }
public
procedure Loading;
{ Public declarations }
end;

var
FormSplash: TFormSplash;

implementation

uses Main, About;

{$R *.dfm}
var
i : Integer;

procedure TFormSplash.Loading;
begin
for i := 0 to 100000 do
begin
Update;
ProgressBar1.Position := ProgressBar1.Position + 1;
end;
Application.CreateForm(TAboutBox, AboutBox);
FormMain.Visible := True;
Close;
Release;
end;

end.

代码4.1 VAN程序封面示例

这次就这么多,以后再说吧。请密切注意版本升级(最新版本1.3)
 
多谢。 不过我想能不能打个包。里面有修改过的unit。 demo 和说明阿? :) 呵呵。我的要求是不是很高?
 
我觉得不高,不知道老大如何认为 ^_^
 
什么叫NAV窗体呀我半天没看懂。
 
nav是楼主定义的吧,我不知道是不是
引用如下:
这就是为什么我们要让VCL程序标准化(VAN,VCL Application Normalization)
而标准化后的VCL程序则称之为NAV程序(Normalized Architecture VCL application)
本文目的是探讨如何VAN一个NAV程序
 
NAV这个名称是我生造出来的,没有什么不妥吧

再次升级到1.32
静态版本:修正了Minimize后恢复窗体时的显示问题,
还有把Application的标题改成和MainForm一样的标题。

动态版本:除上述问题的修正外,
1.还加入了一个新的变量UseStaticLibraryOnly
使用这个变量解决和静态版本的兼容性问题,如果你使用静态版本编译,又
在程序中使用了动态版本TVanForm,只需要简单地把在工程源文件中把
UseStaticLibraryOnly设为True就可以防止代码冲突,此时TVanForm保留
自己新增的函数、过程,这些过程通过调用Application对象的过程来达到
和静态方式的兼容,但MessageBoxW调用的是Win32 API。
2.在该版本中,还添加了OnException,为了获得最适合的效果,
如果要进行覆盖程序的异常处理的话,必须设置主窗体的OnException,
而不要设置Application.OnException,这样,
TVanForm就会间接设置Application.OnException来达到目的。而且必须是主窗体,
如果不是主窗体的话,设置是无效的。
3.还有,MessageBox分MessageBoxA和MessageBoxW分别对应AnsiChar和WideChar,
而且为了保证C++Builder能成功编译,名字变成MessageBoxA。
4.ShowException用来替代Application的ShowException,不过如果连MainForm都有
异常,异常会直接抛往Application。所以,基本上不用担心

正在深入研究,可能很快推出1.4。
下载请到Borland代码中心。文章最后部分有链接。
 
好.支持. 顶楼的时候什么时候整理一下文档和demo阿? [:D][:D]
 
正在修改代码,新版本的改动比较大
这次结构会进行比较大的改变 功能更加完善(哈哈黄婆卖瓜)
而且文档化还需要一定时间
所以,估计要等几天
请密切注意
 
公布V2.0beta1(静态版本) 包括一个Demo
以后静态版本称为VanSTL,动态版本称为VanRTL

这是改进,
1.全面用类来替代,增加VanAppMgrSTL.pas和VanFrmMgr.pas单元
2.在VanFrmMgr.pas中增加了TUniqueArrayManager(唯一地址数组管理)、
TVanFormManager(VAN窗体管理)和TVanFormPropertyManager(窗体特性管理)
3.在VanAppMgrSTL.pas中增加了TVanAppManagerSTL(VAN程序相关选项控制STL)
4.解决了将窗体停靠至控件的bug
5.增加了新的窗体属性vftMainForm、vftForm、vftDialog、vftChild
6.增加了显示模式对话框时决定窗体是否可以操作的变量
7.响应WM_SIZE、WM_GETMINMAXINFO和WM_MOUSEACTIVE使子窗体在窗口操作时正常显示
8.修正了WM_SETCURSOR中存在的bug
9.修正了当用鼠标点击任务栏按钮或选择还原菜单项时,无法正常还原的bug
10.增加了OwnerType,可以选择模式对话框的物主为活动窗体还是其物主

如果发现bug,请即时通知我 e-mail:laozhongcheng@163.com
QQ:29500314 MSN:laozhongcheng@hotmail.com
谢谢!
 
太好了。鼓励一下。 :)[:)]
 
学习ing....
之前我还完全被 BORLAND 蒙在鼓里呢:(
 
回答楼上的问题
1.你的问题是Dialog box不是由CreateDialog创建的
还是Dialog box不是有CreateDialog这个函数可以创建吗?
如果是前者,那答案是肯定的,VCL的dialog box实际上是一个普通窗体
(其实win32的也是,不过因为是api,系统知道如何处理)
如果是后者,当然CreateDialog可以创建,但是这样的话,连一个dialog box
都要win32 api,大家改用 VC 岂不大妙?
2.TApplication是Borland提供的,不是我改出来的。提供了和应用程序有关的
一系列操作。
3.DX和Win32 API的切合是很好的。他可以通过向surface获取一个DC来
让你调用普通的Win32 API。而VCL却没有为我们提供一个Form的Owner,
这就是不同(注意这里的Owner物主指的是Win32 api中的物主,不是VCL的)。
4.如果窗体属性是vftDialog的话,这种窗体是没有任务栏的。所以不需要手动添加。
如果是vftForm的话,的确需要自己加上WS_EX_TOOLWINDOW,不过既然提供了
无任务栏按钮的窗体(也就是vftDialog),不知道这种窗体有什么用。
5.TApplication并没有去掉,只是把一些功能转给了TForm而已,而且TApplication
管理的消息相对单一,很容易顾及。
6.如果单纯使用Win32 API的话,的确不如去用VC。但是我的做法是兼顾了VCL的优点,
屏弃了他的缺点,所以我大力推荐大家使用。
7.VCL整体结构相当精致,我并没有说VCL不好,而是VCL在这一层上的处理有些简化,
导致设计出来的应用程序风格不够丰富(Delphi很难制作出来成为象Word 2002风格的
应用)。所以我的方法是对VCL功能的增强。而且Borland也没有保证VCL中没有bug,
不这么做,大家都没有进步。

Borland在窗体这上面使用了自己的替代技术,深入研究后发现设计的确很不错,
所以VCL并不等于win32 api的叠加,在这一点上比MFC要好的多。但是,设计有些
偏执,自由度不高。太依赖于TApplication,而没有发挥Form应该有的功能,所以
造成了VCL Form今天的局面。很多很小的问题,特别是刚接触Delphi时遇到的问题,
好象Delphi5以前的应用程序缩小后无动态效果、任务栏按钮菜单和win32应用不一致
等都是体现。

具体这方面的东西不知道大家是否感兴趣。欢迎大家继续关注、发言。
 
强烈支持. 收藏.[8D][8D]
 
已经下载如何用VAN?
 
后退
顶部