admin管理员组文章数量:1532368
2024年7月25日发(作者:)
UniGUI集合说明
目 录
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
事件中的代码在服务器端和客户端,哪一端执行? ........................................................... 3
为什么UniGUI控件在IE中显示的字体会变小、模糊? .................................................... 3
在浏览器端不能使用ShowMessage() .................................................................................... 5
修改工程文件,使exe程序编译成dll .................................................................................. 6
UniGUI开发的dll如何发布 .................................................................................................... 7
uniGUI0.94 以EXE形式发布程序的布署方法 ..................................................................... 13
uniGUI执行程序部署有3种形式......................................................................................... 14
在UniGUI里使用ADO的设置 .............................................................................................. 16
MainModule怎样得到js变量的值 ...................................................................................... 16
TUniServerModule和TUniMainModule这两模块有何区别 ....................................... 16
MainModule里一般放什么,ServerModule一般放什么? ....................................... 17
主窗体的标题怎么去掉 ................................................................................................. 17
用ExtEvent打开链接和下载文件 ................................................................................. 17
WebApplication显示对话框 .......................................................................................... 17
Uni中的UniChart的Series增删 .................................................................................. 17
怎样给每一个在线用户建立一套变量,在用户断开后立即清除 ............................. 18
TUniHiddenPanel的作用 ................................................................................................ 18
UniDBGrid如何转为Excel供下载? ............................................................................. 18
uniGUI实现Excel的导出 .............................................................................................. 18
UniDBGrid Excel文件下载 .............................................................................................. 19
Excel文件导入系统........................................................................................................ 21
文件转档与下载 ............................................................................................................. 21
Send File()应用 ............................................................................................................... 21
UniGUI的Canvas使用 ................................................................................................... 22
动态生成TTabSheet or TUniTabSheet ........................................................................... 22
UniGUI中如果获得Session情况 .................................................................................. 23
UniGUI Func 之 Sessions ............................................................................................... 23
uniGUI 通过SessionList操作另外的登录用户 ............................................................ 24
UniGui中如何监听Session的开始与结束 ................................................................... 25
UniGUI如何禁止关闭新窗口 ........................................................................................ 27
UniGUI中控件类名的变化 ............................................................................................ 27
再议UniGUI中使用Grid+Rport报表控件(推荐此方法) ............................................. 28
UniGUI的布局面板控件 TUniRegionPanel ................................................................... 28
UniGUI使用报表Grid+Report的方法之一(静态调用) ................................................ 28
UniGUI使用报表Grid+Report的方法之二(动态调用) ................................................ 28
UniGUI中Cookies使用中文汉字的方法 ...................................................................... 28
UniGUI如何实现压缩传输数据? ................................................................................ 29
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
UniGUI的ShowModal .................................................................................................... 29
UniGUI 前台用户如何在软件中点击一个按钮打开浏览器并打开地址? ................ 29
How To Make Caption In UniGUI? ................................................................................. 30
在UniGUI的UniHtmlFrame中不能使用的HTML标签 .............................................. 30
利用UniGUI中的TUniPageControl实现多页面 .......................................................... 30
UniGUI TreeView处理 .................................................................................................... 31
UniGUI 设置超时 ........................................................................................................... 31
UniGUI如何实现登陆页面 ............................................................................................ 31
UniGUI如何实现超链接 ................................................................................................ 32
从ASP网站登录到UniGUI中 ....................................................................................... 32
UniGUI数据库初始化要放到MainModule里 ............................................................. 32
UniGUI Cookies ................................................................................................................ 32
Form Inheritance ............................................................................................................. 33
UniGUI组件中的Client JavaScript Delphi组件之间的操作 ......................................... 33
JS能取Delphi控件的值? ............................................................................................ 34
写js的注意 .................................................................................................................... 34
unigui结合JS方法记录 ................................................................................................. 34
JS,Jquery获取各种屏幕的宽度和高度 ......................................................................... 35
uniGUI动态建立Form及释放 ...................................................................................... 37
uniGUI经验两则 uniTimer uniHtmlFrame .................................................................... 37
uniGUI使用百度地图api进行标注 .............................................................................. 37
fileupload的问题 ........................................................................................................... 38
unigui unidbgrid显示列的合计值 ................................................................................. 38
UniGui中设置uniEdit控件的fieldLabel ,emptyText等Extjs属性 .............................. 40
uniGUI用Grid++Report报表插件设计保存报表(For unigui ver:0.95.0.1045) ............ 40
UniGUI的TUniLoginForm窗口自定义背景色 .............................................................. 46
uniGUI显示Warning: Form must be shown after it is created的解决办法 ................. 46
界面上的快捷方式 ......................................................................................................... 46
调用 47
TUniTreeView的CheckBox ............................................................................................ 49
通过URL来获取相关参数 ............................................................................................ 52
uniDBGrid实行多选表格行 ........................................................................................... 52
UniDBGrid增加显示记录数的label及隐藏refresh按钮 ............................................ 56
对UniDBGrid的单元格操作 .......................................................................................... 57
DBGrid多选后计算问题(是否可以作为参考?) .................................................... 58
UniDBGrid选择字段Boolean处理................................................................................ 59
UniDBGrid自带MultiSelect无法使用【最新版可以】............................................... 60
如何打开URL,让系统看起来舒服点 ......................................................................... 61
如何修改UniGUI下的中文信息 ................................................................................... 62
如何实现UniDBGrid下字段显示按钮 .......................................................................... 62
如何实现UniDBGrid下字段自动换行 .......................................................................... 62
如何结合kbmMW .......................................................................................................... 63
如何规避浏览器访问时ajax异常 ................................................................................ 63
事件操作时,如果出现等待效果 ................................................................................. 63
82.
83.
84.
85.
登录页面和主页面切换之间碰到的异常 ..................................................................... 63
让Page中切换Tab效果稍微好一点 ........................................................................... 64
UniImage可以嵌入PNG图片 ....................................................................................... 64
UniImage自带导入PNG图片的问题 ........................................................................... 65
网址:/
这个文档中的话题与解决方案,几乎全部来自UniGUI的交流群,群中活跃的BDS2007、
cmj等人,给了众多使用UniGUI的人很多帮助。
这个文档,主要是学习与方便后来之人,文档积累的起因是严肃而正式的,因为每个人
都有学习的需求;但文档的所谓版权、著述,我希望它是有公益色彩的东西,如有哪位不希
望解决方案不出现在这里,请您告知。
此外,就是期待大家都能把自己的一些经验,给指导和帮助后来人的东西,在不影响您
正常工作与其他事情的前提下,奉献出来。至于正确与错误、高超或低下,无关大体。
1. 事件中的代码在服务器端和客户端,哪一端执行?
代码如下:
for i:=0 to 20 do
begin
if Frm[i]<>nil then
if Frm[I].Name=ProCaption then
begin
BaesFrame := Frm[i];
IsOpen := True;
Break;
end;
end;
if IsOpen then exit;
为什么这段代码是在服务器端执行,而不是在客户端执行呢?
解答: UniGUI的运行机制就是除非你在ClientEvents里的东西,其他都是要由UniGUI
通过后台程序执行完成后解析成js发回客户端浏览器显示。
2. 为什么UniGUI控件在IE中显示的字体会变小、模糊?
字体修改UniSessionModule的CustomCSS的内容:
/* ---------------------------修改 Ext CSS -------------------------- */
/* Ext 2.0 */
.x-window-footer {
position: relative;
top: 0;
right: 0;
}
.x-tab-strip SPAN.x-tab-strip-text {
font-size: 13px;
}
.x-panel-header {
font-size: 13px;
}
.x-tree-node {
font-size: 13px;
}
.x-grid3-hd-row TD {
font-size: 13px;
}
.x-grid3-row TD {
font-size: 13px;
LINE-HEIGHT: 18px;
}
.x-tip .x-tip-bd {
font-size: 13px;
}
.x-tip h3 {
font-size: 13px;
}
.x-tip .x-tip-bd-inner {
font-size: 13px;
}
.x-panel-t1 .x-panel-header {
FONT: normal 13px tahoma,arial,verdana,sans-serif;
}
.x-form-field {
FONT: 13px tahoma,arial,helvetica,sans-serif;
}
.x-small-editor .x-form-field {
FONT: 13px tahoma,arial,helvetica,sans-serif;
}
.x-combo-list-item {
FONT: 13px tahoma,arial,helvetica,sans-serif;
}
.x-btn button,x-toolbar .x-item {
FONT: 13px tahoma,arial,sans-serif;
}
.x-menu-list-item {
FONT: 13px tahoma,arial,sans-serif;
}
.x-window-t1 .x-window-header {
FONT: bold 13px tahoma,arial,verdana,sans-serif;
}
.x-layout-split-west .x-layout-mini {
BACKGROUND-IMAGE: url(../images/);
}
.x-form-text {
Margin-top:1px;
}/* the textField missing bottom line */
.x-form-item {
FONT: 13px tahoma,arial,helvetica,sans-serif;
}
.x-grid-group-hd DIV {
FONT: bold 13px tahoma,arial,helvetica,sans-serif;
}
/*按钮字体大小 Add by */
.x-btn-text {
Font: 12px tahoma,arial,sans-serif;
}
/* END */
3. 在浏览器端不能使用ShowMessage()
Function ShowMsg(AskString: String): Boolean;
begin
if e then
//must uses UniGUIApplication
(‘alert(‘’’+AskString+’’’);’)
else
ShowMessage(AskString);
end;
在浏览器执行不可用ShowMessage
4. 修改工程文件,使exe程序编译成dll
ProjectView Source
{$define UniGUI_VCL}
//Comment out this line to turn this project into an ISAPI module’
{$ifndef UniGUI_VCL}
library
{$else}
program
{$endif}
Project1;
uses
{$ifndef UniGUI_VCL}
uniGUIISAPI,
{$else}
Forms,
{$endif}
ServerModule in '' {UniServerModule: TUniGUIServerModule},
MainModule in '' {UniMainModule: TUniGUIMainModule},
Main in '' {MainForm: TUniForm};
{$R *.res}
{$ifndef UniGUI_VCL}
exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;
{$else}
begin
lize;
(Application);
Form(TQFkbmMWClientForm, QFkbmMWClientForm);
;
{$endif}
end.
在{$define UniGUI_VCL}
改成 //{$define UniGUI_VCL}
重新编译 dll
5. UniGUI开发的dll如何发布
在IIS里面设置相关属性,并且default里设置这个dll,这样可以确保URL访问只需要IP:Port,
看不到DLL。也可以单独设置一个重定向到dll。
1) 连接池设置,如下图:
2) 连接池高级设置,如下图:
3) 在站点中添加Application
4) 该Application设置下高级设置,如下图:
5) 处理程序映射,如下图:
以下暂时不需要。
3) ISAPI筛选器设置,如下图:
6. uniGUI0.94 以EXE形式发布程序的布署方法
uniGUI0.94以后发布要分别带上extjs和uni的两个js文件夹,这两个文件夹的具体位置要
在UniServerModule模块中指定以下两个属性:
t 代表uni的js及资源文件夹目录,即uni-0.94.0.1024目录中
的文件,如果属性值为: [uni] ,则程序运行时会到uniGui的安装目录下去寻找
t 代表extjs的js及资源文件夹目录,即ext-4.2.1.883目录中
的文件,如果属性值为:[ext] ,则程序运行时会到uniGUI的安装目录下去寻找
一般情况下我们在开发调试程序时这两个属性分别按默认值设置为[uni]和[ext],采用这两
个默认值,
在软件布署时就要带上uniGUI的js安装包fmsoft_unigui_extjs_0.94.0.1024_,为了
布署时更简洁,不想再带一个uni的js安装程序,可以按照如下方法:
以版本uniGUI0.94.0.1024 为例:
1、在主程序所在目录新建两个目录:
uni_94 ,把uni-0.94.0.1024目录下的所有文件复制到这个目录中
ext_42 ,把ext-4.2.1.883目录下的所有文件复制到这个目录中
2、在Delphi中打开要发布的工程文件,打开UniServerModule模块:
设置 t属性为[uni],
设置t 属性为:[ext],
在UniServerModule模块的BeforeInit事件中写入以下代码:
procedure ServerModuleBeforeInit(Sender: TObject);
begin
if DirectoryExists(ectoryName(ParamStr(0))+'ext_42') then
begin
t :='uni_94';
t :='ext_42'
end;
end;
这样,在程序编译调试时,就无需要每个uniGUI工程的exe文件下添加uni_94和ext_42
这两个目录文件,程序会到unigui的安装目录中去寻找。而程序布署后,由于布署后主程
序目录下有ext_42目录,就可以将uniRoot和ExtRoot两个属性动态设置为我们布署时设置
的文件夹名。
7. uniGUI执行程序部署有3种形式
1、ISAPI模式
部署在IIS或Apache,程序编译为Dll形式,没有试,准备后续专门测试一下。
2、标准执行文件模式
将软件编译成一个独立的Exe文件,包括了WEB服务和业务内容,是uniGUI部署方式中
最简单的一种。该方式最大特点是可以进行代码跟踪,同一般exe程序调试一样,在Debug
模式下程序调试非常方便。运行exe后就可以直接打开页面进行测试,通过任务栏上的图
标可以打开服务监控页面,监控服务程序的运行情况,如下图:
3、Windows服务模式
将软件编译成Windows下的Service模式,并自动启动。从工程文件上看,与一般的程序
工程文件略有差异,这里不详述。另外工程中增加了一个文件和对应
的窗体文件,该模块单元定义了Windows Service的一些属性,包括名称、依赖等,我只
修改了DisplayName属性,其他属性都采用缺省。
特别需要注意的是:不要尝试修改该文件的文件名和模块类名,否则系统无法识别,编译能
通过,但运行时报无法启动,估计是内部代码上写死了。
注册Service的方式同一般的Windows Service程序,通过命令行加 –install参数,注销
用 –uninstall参数,如下:
MyServiceApp –install
MyServiceApp -uninstall
启动用命令行,如下:
net start UniServiceModule
UniServiceModule就是模块的类名不要前缀T
在实际应用中,我采用了2个工程,一个是标准执行文件模式,Debug+Win32,用于程
序调试,另外一个工程采用Windows Service模式,Release + Win64,用于部署运行。
在少量客户端(<5个)情况下,运行效果非常不错,我打开一个2万条记录的表,按照50
条/页进行分页显示,从数据获取到第一页数据展示,本地大约在3~4秒之间,云服务器(带
宽 10M,实际检测复制文件时<200KByte/秒)上大约在6~7秒,获取第二页数据大约需
要1秒。
最关心的是该服务程序在较多客户终端(300~500个)情况下的性能,按照作者的话说是
不取决于程序,而取决于服务器硬件条件。拟在近期用WinRunner做个测试,看看具体效
果,主要是ISAPI 和 Windows Service两种模式的性能。
8. 在UniGUI里使用ADO的设置
UniServerModule 设置 AutoCoInitialize 为 True
9. MainModule怎样得到js变量的值
ue(ue());
10. TUniServerModule和TUniMainModule这两模块有何区别
TUniServerModule 一个连接创建一个
TUniMainModule 只创建一个作为共用
TUniServerModule 所有客户端公用
TUniMainModule 你的连接使用
可以描述如下:
TUniServerModule,只有一個是公用,若用連接池在此建立,在此定義變量是公用
TUniMainModule,一個user一個,在此放資料庫控件是各user獨立,
TUniMainModule之public定義之變量是user單獨用
11. MainModule里一般放什么,ServerModule一般放什么?
如果用到数据库,ADOConnection1、ADOQuery1、DataSource1要放到MainModule
12. 主窗体的标题怎么去掉
可以在UniServerModule里设置主窗体的显示模式,属性MainFormDisplayMode:
mfPage: 主窗体无边框
mfWindows: 标准窗体,有边框
13. 用ExtEvent打开链接和下载文件
这个设置可以实现打开链接,如果是文件就是下载了
14. WebApplication显示对话框
eBox 不可以,要用WebApplication 不要用Application
15. Uni中的UniChart的Series增删
UniChart似乎不能动态增加Series,没有AddSeries()方法,所以只能提前多建立几个,然后
隐藏即可。再或者,考虑再画布上画。这个没试过。
16. 怎样给每一个在线用户建立一套变量,在用户断开后立即清
除
Demo里的Session例子,似乎只讲了TimeOut,其余怎么处理?
另外,类似于隐藏域,用不可见的Label可以吗?
User之私有变量,请定义在MainModule的Public
public
{ Public Declarations }
LocalCacheURL: String;
LocalCachePath: String;
StartPath: String;
ExtFullPath: String;
ServerRoot: String;
ServerIni: String;
StartFlagMainDm: Boolean;
User,Test: String;
Comp: array of TComponent;
CompCount: Integer;
全域变量的意思:User1, User2, User3看到值是一样的。
17. TUniHiddenPanel的作用
在Form上放一个TUniHiddenPanel,放上的元件是隐藏的,TUniHiddenPanel的可视化元件
是有,但执行时看不到,类似ASP里的隐藏域,HTML的Hidden
18. UniDBGrid如何转为Excel供下载?
看群共用
也可以参考《追月无名》提供的建议框架。
19. uniGUI实现Excel的导出
这段时间,一直在同uniGUI一起奋斗,总体感觉是越来越爽,uniGUI做B/S应用,太有效
率了。是最好的资源,遇到的问题,上面基本都能查到。不过是E文,读
起来不爽。遇到导出Excel的问题,也是翻看bbs找的线索。但还是走了很多弯路。
首先,在bbs上有种方法,就一个单元,实现DataSet写成Excel文件,地址在这里,感兴
趣可以看看。试了下,可以导出文件,但格式粗糙,中文不正常;
第二种方法,利用FastReport导出功能,试了下,也不爽,导出的太乱,另外,这种方法,
需要事先设计好格式,用FR做报表,这也是个麻烦,不爽,放弃。
第三种方法,xalion建议我用QImport组件,很好用,但在uniGUI中出一个错误,无解,
放弃;
第四种方法,利用NativeExcel导出,这款控件已经几年不更新,官网最新版支持到XE4,
我把他改到D10,很好用,用起来要比QImport方便,导出的格式也正是我要的,可惜,在
uniGUI中有AV错误,导出不成功,同时产生内存泄漏,不爽,放弃。修改后的版本在这
里。
第五种方法,按uniGUI作者建议的,用TMS FlexCel.正在进行中,参考地址
经过一晚上的学习,终于用他搞定,效果是最好的,稳定高效。我是利用定义模板的方式做
出的导出样式,可以通过改模板,来修改导出样式,还是这种方式更易于后期的维护。
20. UniDBGrid Excel文件下载
uniGUI的文件下载由于TUniSession的存在而变得非常简单,最典型的一个例子就是将列
表中的所有数据导出到Excel中。服务器上采用TMS FlexCel控件,先将数据集中的记录
导入到Excel文件中,然后再将Excel文件内容输出到内存流中,最后通过TUniSession
发送到客户端。代码如下:
procedure Data;
var
i, rowindex, colindex: Integer;
ms : TMemoryStream;
begin
{ 检查数据集 }
if Assigned(cdsMain) and then
try
{ 创建Excel文件 }
e(1);
;
{ 第一行为标题 }
rowindex := 1;
colindex := 1;
for i := 0 to ount -1 do
{ 只导出数据集中可视的字段 }
if [i].Visible then
begin
lue[rowindex, colindex] :=
[i].DisplayLabel;
inc(colindex);
end;
{ 依次导出数据 }
while not do
begin
{ 增加一行 }
inc(rowindex);
colindex := 1;
for i := 0 to ount -1 do
{ 只导出数据集中可视的字段 }
if [i].Visible then
begin
{ 时间和日期字段需要单独出来一下,否则出来的都是浮点数 }
if [i].DataType in [ftDate, ftDateTime, ftTime,
ftTimeStamp] then
lue[rowindex, colindex] :=
[i].AsString
else
lue[rowindex, colindex] :=
[i].Value;
inc(colindex);
end;
{ 下一条 }
;
end;
{ 创建内存流 }
ms := ;
try
{ 将Excel保存到内存流 }
Stream(ms);
on := 0;
{ 将数据流发送到客户端,同时指定下载文件名,非常简单 }
ream(
ms, ModelName + '.xls' );
finally
;
{ 清理内存 }
ile;
end;
except
on E : Exception do
ile;
end;
end;
21. Excel文件导入系统
可以在工程里面引入VCL控件,封装起来,先将excel文件传入到应用服务器,然后使用
vcl控件导入数据库。
本人使用的控件是Dev14下的ExpressSpreadSheet。导入非常方便。
22. 文件转档与下载
B/S系统的报表,转档…下载的原理,都是一样的。
Server端产生档案存在Server端的User暂存目录le()
下载至Client端存档。
在ServerModule的Create事件要加入
//只能加一次
try
//加入下载档案类别
eType(‘qrp’,’qrp’);
//加入下载档案类别
eType(‘rtf’,’rtf’);
//加入下载档案类别
eType(‘xls’,’xls’);
//加入下载档案类别
eType(‘xlsx’,’xlsx’);
except
end;
若要下载pdf,再加入:
eType(‘pdf’,’pdf’);
意思是要做档案关联,不然有些类型档案会没有下载产生。
23. Send File()应用
le() 下载至Client端存档,这里面的参数是什么?
//前端下载 Fn是档名 (Server端档案,Client端档名)
le(achePath+Fn, Fn)
或者
n :=
(‘+FName+’)’;
24. UniGUI的Canvas使用
Procedure ge1MouseUp(Sender: TObject;Button:TMouseButton;
Shift:TShiftState;X,Y:Integer);
begin
:= 1;
arent := True;
if Button=mbLeft then
begin
if x0=’’ then
begin
x0 := IntToStr(x);
y0 := IntToStr(y);
n := x0+’,’+y0+’,’;
end
else begin
(StrToInt(x0), StrToInt(y0));
x0 := IntToStr(x);
y0 := IntToStr(y);
n := n+x0+’,’+y0+’,’;
end;
end;
end;
25. 动态生成TTabSheet or TUniTabSheet
function CreatePageControl(PageName,Caption: String; PageControl: TComponent): TControl;
var NewTabSheet: TUniTabSheet; TabSheet: TControl; Err: String;
begin
Err := ‘’;
TabSheet := nil;
// VCL Form
if ype=TPageControl then
begin
TabSheet := TPageControl(PageControl).FindChildControl(PageName);
//寻找要找的页面
if TabSheet<>nil then
//Err := ‘Page: ‘+PageName+’ 页面已建立’
else begin
//建立TabSheet
NewTabSheet := (PageControl);
ntrol := TPageControl(PageControl);
:= PageName;
n := Caption;
TabSheet := NewTabSheet;
end;
end;
//Uni Web Form
if ype=TUniPageControl then
begin
TabSheet := TUniPageControl(PageControl).FindChildControl(PageName);
//寻找要找的页面
if TabSheet<>nil then
//Err := ‘Page: ‘+PageName+’ 页面已建立’
else begin
//建立TabSheet
NewTabSheet := (PageControl);
ntrol := TPageControl(PageControl);
:= PageName;
n := Caption;
TabSheet := NewTabSheet;
end;
end;
Result := TabSheet;
end;
26. UniGUI中如果获得Session情况
在ServerModule单元中有如下属性,可以使用
Sessions
sions 【最大会话
】
ent
eceived
27. UniGUI Func 之 Sessions
//最大会话
ssions;
//最大请求
quests;
//活动会话
eSessions;
//活动请求
eRequests;
procedure ect(var Messsage: TMessage);
begin
n := ‘当前连接数’+IntToStr(sions);
n := ‘当前请求数’+IntToStr(uests);
end;
procedure e(var Messsage: TMessage);
begin
IsConnect( Message );
end;
28. uniGUI 通过SessionList操作另外的登录用户
参照bbs,写了这个方法,检查是否有同名用户已经登录:
procedure ameUser(aUserLoginCode: string);
var
ASessionList: TList;
I: Integer;
M: TUniMainModule;
USession: TUniGUISession;
begin
;
try
ASessionList := nList;
for I := 0 to - 1 do
begin
USession := TUniGUISession(ASessionList[I]);
M := nModule as TUniMainModule;
if ginCode = aUserLoginCode then//这里UserLoginCode是在MainModule中
定义的一公共变量,用来保存用户登录代码,标示用户身份.
begin
ag:=True; //ExitFlag也是在MainModule中定义的公共变量,表示是否退
出.
ateAfterSecs(10);
Break;
end;
end;
finally
;
end;
end;
29. UniGui中如何监听Session的开始与结束
UNIGui中的UniServerModule模块有一个SessionManager(TUNIGuiSessionManger类)的属
性,通过 TUNIGuiSessionManger类的相关属性可以来监听web会话的开始与结束。
如:
ionStart := OnSessionStart;
ionEnd := OnSessionEnd;
procedure ionStart(Sender: TIdHTTPSession);
var RemoteIp,SessionID:string;
begin
RemoteIP:= TUniGUISession(Sender).Address;
//根据ip和会话编号进一步处理。
SessionID:= TUniGUISession(Sender).SessionID;
end;
procedure ionEnd(Sender: TIdHTTPSession);
var RemoteIp,SessionID:string;
begin
RemoteIP:= TUniGUISession(Sender).Address;
//根据ip和会话编号进一步处理。
SessionID:= TUniGUISession(Sender).SessionID;
end;
下面是一个完整的代码单元:
unit ServerModule;
interface
uses SysUtils, s, uniGUIServer, uniGUIMainModule, uniGUIApplication,
UIdCustomHTTPServer,s;
type
TUniServerModule = class(TUniGUIServerModule)
procedure UniGUIServerModuleCreate(Sender: TObject);
private
{ Private declarations }
procedure OnSessionStart(Sender: TIdHTTPSession);
procedure OnSessionEnd(Sender: TIdHTTPSession);
protected
procedure FirstInit; override;
public
{ Public declarations }
end;
function UniServerModule: TUniServerModule;
implementation
{$R *.dfm}
uses UniGUIVars, Main;
function UniServerModule: TUniServerModule;
begin
Result:=TUniServerModule(UniGUIServerInstance);
end;
procedure nit;
begin
InitServerModule(Self);
end;
procedure ionEnd(Sender: TIdHTTPSession);
var ls :TStringList;
begin
// ls := ;
if (ath+'') then
begin
omFile(ath+'');
end;
('go exit');
File(ath+'');
;
end;
procedure ionStart(Sender: TIdHTTPSession);
var ls :TStringList;
begin
// ls := ;
if (ath+'') then
begin
omFile(ath+'');
end;
('go enter');
File(ath+'');
;
end;
procedure ServerModuleCreate(Sender: TObject);
begin
ionStart := OnSessionStart;
ionEnd := OnSessionEnd;
end;
initialization
RegisterServerModuleClass(TUniServerModule);
end.
30. UniGUI如何禁止关闭新窗口
1. 取消新窗口的SystemMenu,目的是去掉窗体的关闭按钮
2. 在窗体加上新按钮,点击事件为 Close;
3. 在窗体的OnClose事件中添加如下代码:
Action := CaNone; //这句一定要放在MessageDlg前面
MessageDlg(xxxxx);
31. UniGUI中控件类名的变化
今天一个朋友在使用UniGUI碰到了问题,他要遍历窗体上的控件,然后根据类名进行相应
的控制。
原来的程序为:
procedure _component;
var i: Integer;
begin
for i:=0 to entCount-1 do
begin
(ents[i].ClassName);
if ents[i] is TUniBitBtn then
begin
n := ‘found’;
(ets[i] as TUniBitBtn).Enabled := False;
end;
end;
end;
这段程序无法运行,然后经过调试才发现TUniBitBtn在Web网页中的类名已经更换为
TUniExtBitBtn。
这说明Web是在Win32程序中重新转化成新的类。
32. 再议UniGUI中使用Grid+Rport报表控件(推荐此方法)
前端时间进一步研究了Grid+Report在UniGUI中的使用,总结出两种方式。但总感觉在客
户端与服务端交互上不太顺利,最近再研究了UniGUI的客户端事件及回调后,基本上解决
插件与服务器交互及插件命令调用的问题。
结论:Grid+Report在UniGUI中使用,采用UniHtmlFrame更好。
配合ExtEvents客户端事件及UniGUI的OnAjaxEvent事件就可以实现在网页下调用报表控
件的命令,修改报表,设计报表等功能,测试下来完全可以实现与在php,asp等语言使用插
件下的功能。
Demo下载: /detail/shuiying/4928894
模板调用的是 Grid+Report网站上的演示模板 及官方演示数据。安装Grid+Report后,
Web例子目录中也有这个模板数据。看UniHtmlFrame控件中HTML属性里可以看到路径和
模板。
33. UniGUI的布局面板控件 TUniRegionPanel
转自UniGUI论坛中的控件,修改为可以在xe3下编译的源友。
下面是包文件dpk内容
【未全】
34. UniGUI使用报表Grid+Report的方法之一(静态调用)
未列。
35. UniGUI使用报表Grid+Report的方法之二(动态调用)
未列。
36. UniGUI中Cookies使用中文汉字的方法
在目前的UniGUI(ver:0.88)中使用kie来设置一个中文的
Cookies时,然后用来读取Cookies值时,中文会变成乱码。
查询UniGUI论坛,得到如下解决方案:
procedure ton1Click(Sender: TObject);
var UserName: String;
begin
//使用EncodeString函数编码
kie(‘name’, EncodeString(‘中文汉字’));
//使用DecodeString解码
UserName := DecodeString([‘name’]);
end;
37. UniGUI如何实现压缩传输数据?
TUniServerModule类中有一个属性是控制压缩的,要以设置是否压缩和压缩级别,最小数
据尺寸。
一般按以下设置就可以了:
d := True;
:= zcMax;
38. UniGUI的ShowModal
You should use OnClose event of form to process modalresult.
procedure mClose(Sender: TObject; var Action: TCloseAction);
begin
if ModalResult=mrOK then
begin
ShowMessage(‘Modal OK’);
end else begin
ShowMessage(‘Modal Not OK’);
end;
end;
39. UniGUI 前台用户如何在软件中点击一个按钮打开浏览器
并打开地址?
UniGUI前台用户如何在软件中点击一个按钮打开浏览器并打开地址?
ShellExecute(Handel,’open’,’’,PChar(HoutaiAddr),nil,SW_SHOWNORMAL);
用这个会在服务器后台执行。
前台需要:
(‘(‘+’’’’+str+’’’’+’,’’newwindow’’)’);
UniSession在UniGUIApplication中
40. How To Make Caption In UniGUI?
这里提到的是Caption可以嵌入html代码,使得UniGUI做出来的客户端效果满足各类需求。
41. 在UniGUI的UniHtmlFrame中不能使用的HTML标签
在UniGUI的UniHtmlFrame中不能使用的HTML标签
UniHtmlFrame有一个HTML属性,可显示HTML文档,但又有一些限制:
1). 对外部文件,如JavaScript、css文档,不能使用
放入HTML中解决问题。
6. str:='function zOpenD(){'+
' var diag = new Dialog("Diag1");'+
' = '+width+';'+
' = '+height+'; '+
' ttonRow=false;'+
' = "'+title+'"; ' + urlhtml+
' ssageRow = '+ShowMessageRow+';'+
' eTitle = "'+MessageTitle+'";'+
' e = "'+sm+'";'+
' t = function(){};//点击确定后调用的方法 '+
' ();} '+
' zOpenD();';
(str);
这样会出错,不要把注释放到里头
与其他js脚本的冲突
那是因为你的JS代码有 $ 符号,跟JQ冲突。解决办法可以在JQ代码前加入
var jq=lict(); 然后将JQ代码中的$都换成jq就行。如例:
55. JS,Jquery获取各种屏幕的宽度和高度
网页可见区域宽:Width
网页可见区域高:Height
网页可见区域宽:Width (包括边线的宽)
网页可见区域高:Height (包括边线的宽)
网页正文全文宽:Width
网页正文全文高:Height
网页被卷去的高:Top
网页被卷去的左:Left
网页正文部分上:Top
网页正文部分左:Left
屏幕分辨率的高:
屏幕分辨率的宽:
屏幕可用工作区高度:eight
屏幕可用工作区宽度:idth
HTML精确定位:scrollLeft,scrollWidth,clientWidth,offsetWidth
scrollHeight: 获取对象的滚动高度。
scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离
scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最顶端之间的距离
scrollWidth:获取对象的滚动宽度
offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度
offsetLeft:获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置
offsetTop:获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置
X 相对文档的水平座标
Y 相对文档的垂直座标
X 相对容器的水平坐标
Y 相对容器的垂直坐标
Top 垂直方向滚动的值
X+Top 相对文档的水平座标+垂直方向滚动的量
IE,FireFox 差异如下:
IE6.0、FF1.06+:
clientWidth = width + padding
clientHeight = height + padding
offsetWidth = width + padding + border
offsetHeight = height + padding + border
IE5.0/5.5:
clientWidth = width - border
clientHeight = height - border
offsetWidth = width
offsetHeight = height
56. uniGUI动态建立Form及释放
用uniGUI开发的项目中,难免要遇到动态建立一个Form,再释放掉,与传统Delphi项目不
一样,这是从forum转贴过来的,要这样写:
//建立方法
if Frm = nil then
Frm := (UniApplication);
//调用及释放方法
dal(
Procedure(Sender: TComponent; AResult:Integer)
begin
//Frm := nil;//作者这样写的
FreeAndNil(Frm);//应这样写.
end );
57. uniGUI经验两则 uniTimer uniHtmlFrame
er的妙用
很多时候,都会遇到在一个uniForm或者uniFrame加载完后,执行一个具体的动用,比如
执行一个查询,当这个动作是调用第三方JS显示库时,如调用百度的ECharts,显示一个分
析图,在OnCreate、OnShow、OnFramedLoaded事件都不能显示这个动作的结果。这时候,
利用uniTimer来执行,是最好的方法。
lFrame
看名称就知道是显示html内容的Frame,但遇到不显示html内容的时候,百试不得其解,将
同样一个HtmlFrame放到不同的uniFrame上,有的显示,有的不显示。最后发现当不显示
的时候,把Html=True解决。
58. uniGUI使用百度地图api进行标注
申请个地图的api,然后把例子代码复制到中,要做的从这里开始:
百度地图的例子代码在这里
修改例子代码,将标准的经纬度返回到指定的控件中,最后的html文件被我改成这样,贴
代码不行,只好上图片了:
uniGUI使用百度地图api进行标注
这里,我把返回的值分别给EditLng,EditLat,EditAddress三个uniEdit中。
html准备好,在uniGUI项目中,建一个uniForm窗口,起名叫BaiduMapForm,放一个
uniURLFrame,三个uniEdit,分别起名叫EditLng,EditLat,EditAddress,然后把做好的html放到
中,OK,现在在地图中拖动标注点到新的位置,在Delphi中就可以用
EditLng,EditLat,EditAddress取到了。
感谢无私帮助我的朋友风清云淡,是他让我学会uniGUI控件怎么与html网页交互值。
59. fileupload的问题
fileupload的问题 可以通过 htmlscript加载自定义代码来实现
我是通过htmlscript加载swf实现的 批量上传 文件夹上传
60. unigui unidbgrid显示列的合计值
方法一:
procedure rid1ColumnSummaryResult(Column: TUniDBGridColumn;
GroupFieldValue: Variant; Attribs: TUniCellAttribs; var Result: string);
var
f: Currency;
begin
inherited;
if SameText(ame,'beginBalance') then
begin
f:=0;
;
while not do
begin
f:= f + ;
;
end;
Result :=formatCurr('¥0.00',f);
:= [fsBold];
:= clNavy;
end;
end;
方法二:
procedure pColumnSummary(
Column: TUniDBGridColumn; GroupFieldValue: Variant);
begin
if SameText(ame, 'ApplyTotal') then
begin
if ue=NULL then ue := 0.00;
ue := ue + t;
end
else if SameText(ame, 'RealCheckCash') then
begin
if ue=NULL then ue := 0.00;
ue := ue + t;
end;
end;
procedure pColumnSummaryResult(
Column: TUniDBGridColumn; GroupFieldValue: Variant; Attribs: TUniCellAttribs;
var Result: string);
var
F : Real;
begin
if SameText(ame, 'ApplyTotal') then
begin
F:=ue;
Result := FormatFloat('0.00 ', F);
:=[fsBold];
:=clGreen;
end
else if SameText(ame, 'RealCheckCash') then
begin
F:=ue;
Result := FormatFloat('0.00 ', F);
:=[fsBold];
:=clNavy;
end;
ue:=NULL;
end;
61. UniGui中设置uniEdit控件的fieldLabel ,emptyText等
Extjs属性
在uniEdit控件的unievents属性的beforeInit事件中写入以下代码:
function beforeInit(sender)
{
ext ='请输入姓名';
abel='姓名';
tyle = 'text-align:right';
tyle="border-style:none";
="border:#0033CC solid thin ";
}
实现如下的效果:
62. uniGUI用Grid++Report报表插件设计保存报表(For unigui
ver:0.95.0.1045)
uniGUI的0.95.0.1045版本提供了CallbackUrl, 我们也可以用这个提供的回调网址来实现
优秀的国产报表插件在IEChormeFireFox中在线设计并保存报表到服务端的功能。
界面效果如下:
代码如下:
unit Main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, uniGUITypes, uniGUIAbstractClasses,
uniGUIClasses, uniGUIRegClasses, uniGUIForm, uniGUIBaseClasses, uniPanel,
uniHTMLFrame,
uniURLFrame, uniButton, uniLabel;
type
TMainForm = class(TUniForm)
UniHTMLFrame1: TUniHTMLFrame;
Panle1: TUniPanel;
btn1: TUniButton;
lbl1: TUniLabel;
procedure btn1Click(Sender: TObject);
procedure UniFormAjaxEvent(Sender: TComponent; EventName: string; Params: TStrings);
private
procedure SetDeignReportHTML();
{ Private declarations }
public
{ Public declarations }
end;
function MainForm: TMainForm;
implementation
{$R *.dfm}
uses
uniGUIVars, MainModule, uniGUIApplication, ServerModule;
function MainForm: TMainForm;
begin
Result := TMainForm(mInstance(TMainForm));
end;
procedure 1Click(Sender: TObject);
begin
gnReportHTML;
end;
procedure gnReportHTML;
var
stringList: TStringList;
LoadReportURL,DataURL, saveReportURL,BrowSertype: string;
c: TUniClientInfoRec;
begin
;
LoadReportURL := 'POST::files/grf/';
DataURL :='files/data/';
saveReportURL := ckUrl('ReportSave', Self, []);
stringList := ;
try
c := InfoRec;
BrowSertype := rType;
if (rType = 'chrome') or (rType = 'gecko') then
begin
:=
' ';
end
else if rType = 'ie' then
begin
:=
'';
end;
:= ;
finally
;
end;
end;
procedure mAjaxEvent(Sender: TComponent; EventName: string; Params:
TStrings);
var
stringlist:TStringList;
stringStream:TStringStream;
FileName:string;
begin
if EventName='ReportSave' then
begin
stringlist := ;
stringStream := ;
try
TMemoryStream(ream).SaveToStream(stringStream);
(ring);
FileName := ath+'/files/grf/';
//可以保存为文件,也可以根据需要保存到数据库中
File(fileName);
finally
;
;
end;
end;
end;
initialization
RegisterAppFormClass(TMainForm);
end.
Form文件的代码如下:
object MainForm: TMainForm
Left = 0
Top = 0
ClientHeight = 369
ClientWidth = 598
Caption =
'uniGUI'#20013'Grid++Report'#35774#35745#24182#20445#23384#25253#34920#27169#26495
Color = clBtnFace
WindowState = wsMaximized
OldCreateOrder = False
= <>
s = (
'Init=function Init(sender)'#13#10'{'#13#10' Ext.u' +
'seShims =true;'#13#10'}')
OnAjaxEvent = UniFormAjaxEvent
PixelsPerInch = 96
TextHeight = 13
object UniHTMLFrame1: TUniHTMLFrame
Left = 0
Top = 48
Width = 598
Height = 321
Hint = ''
AutoScroll = False
Align = alClient
Anchors = [akLeft, akTop, akRight, akBottom]
end
object Panle1: TUniPanel
Left = 0
Top = 0
Width = 598
Height = 48
Hint = ''
Caption = ''
Align = alTop
Anchors = [akLeft, akTop, akRight]
TabOrder = 1
object btn1: TUniButton
Left = 3
Top = 3
Width = 102
Height = 39
Hint = ''
Caption = #35774#35745#25253#34920
TabOrder = 1
OnClick = btn1Click
end
object lbl1: TUniLabel
Left = 144
Top = 14
Width = 377
Height = 28
Hint = ''
AutoSize = False
Caption =
#20445#23384#21518#65292#21487#20197#20877#27425#28857#35774#35745#25253#34920#
65292#30475#26159#21542#25104#21151#20445#23384#20462#25913#30340#32467#26524
TabOrder = 2
end
end
end
63. UniGUI的TUniLoginForm窗口自定义背景色
uniGUI的TUniLoginForm类创建的登录窗口默认是不带颜色,可以自定义css风格来改变
背景颜色。
一般是通过在UniServerModule中,在CustcomSS属性中,修改extjs的css定义来实现,修
改登录窗口的背景颜色可以修改 .x-body 的定义来实现,如:
{
background-color: rgb(11, 80, 184);
margin: 0;
}
类似的,还可以给UniLoginForm的背景添加上背景图案等个性化的风格。
64. uniGUI显示Warning: Form must be shown after it is
created的解决办法
UniGui0.94以后,截止到0.94.0.1022版本经常在一个From中访问另一个From成员的时候
会出现以下错误:
Warning: Form must be shown after it is created: frmXXX_1
可能0.94以的UNiGui有了变化,具体原因不得知。
解决方案:
把被访问的这个成员添加为UniMainModule中的一个公开成员,From中访问
UniMainModule的公开成员就可以避免From访问From成员时出现的问题。
这是一个临时的解决办法,看后续版本能否会解决。
65. 界面上的快捷方式
在业务系统中常常使用回车键(Enter)替代Tab键完成焦点跳转,在uniGUI下,可以不
用代码,直接使用TUniForm的NavigateKeys进行设置:
其中Next和Prior决定了焦点向下一个和前一个跳转的按键
Key = 13 表示Enter
ShiftStete 表示辅助键(Shift、Alt或Ctrl)按下状态,当二者结合就可以进行判断
一般用Tab或Enter代表跳转下一个控件,Shift+Tab或Shift+Enter代表返回上一个控
件,Tab和Shift+Tab是系统缺省,我们只需要定义Enter和Shift+Enter即可。
66. 调用WebService
今天尝试用uniGUI做Web服务器,调用应用服务器的WebService,遇到些问题记录下
来备忘。
1、对WebService的调用同一般App程序,只是注意如果WebService的执行时间较长,
会报超时错误,此时需要处理:
(1)在DataModule上放一个THTTPRIO控件;
(2)在数据模板创建时,设置THTTPRIO控件的HTTPWebNode属性的超时时间,代码
如下:
procedure MainModuleCreate(Sender: TObject);
begin
//连接超时时间(ms)
tTimeout := 30000;
//接收超时时间(ms)
eTimeout := 30000;
//发送超时时间(ms)
meout := 30000;
end;
(3)调用WebService方法时,不使用缺省创建的THTTPRIO,而是数据模板上的控件,
代码如下:
function ing: string;
var
iw : IWebServiceTest;
begin
//创建WebService接口
iw := GetIWebServiceTest(
False,
'',
HTTPRIO1);//窗体上的控件
//调用方法
Result := ice('');
end;
2、uniGUI服务器运行时,调用WebService报“MSXML未安装”的错误,开始以为是
64位和32位的问题,后来发现不是。正确理解是:Delphi内部WebService调用时使用
了MSXML,而MSXML是COM对象,所以需要在程序启动时调用CoInitialize进行初始
化,在uniGUI服务器中只需要设置服务数据模板的AutoCoInitilaize属性为True即可,
代码如下:
Initilaize :=True;
当然最好是在设计期直接更改属性即可。
67. TUniTreeView的CheckBox
TUniTreeView目前版本没有封装CheckBox功能,所以需要手工处理,幸好0.99版提供
部分代码了,修改过程如下:
1、单元中修改基类TUniTreeNode,增加Checked属性,
代码如下:
TUniTreeNode = class(TPersistent)
private
FChecked: Boolean;
...
public
property Checked : Boolean read FChecked write FChecked;
end;
2、单元中修改TUniTreeView类,增加对CheckBox的
支持属性,代码如下:
TUniTreeView = class(TUniControl, IUniTreeView)
private
FUseCheckBox : Boolean;
...
published
property UseCheckBox : Boolean read FUseCheckBox write FUseCheckBox ;
end;
3、单元中修改TWebTreeNode类,对其JS代码生成
部分加入对CheckBox的支持,代码如下:
function (AExpanded: Boolean = False): string;
var
ImgURL : string;
I : Integer;
begin
ImgURL:=GetImageUrl(FImageIndex);
Result:='{id:"'+IntToStr(FID)+'"'+
IfThen(Text<>'', ', text:'+ StrToJS(Text))+
//如果TreeView支持则显示CheckBox,缺省
False====================
IfThen(ckBox, ', checked: '+ IfThen(Checked,
'true', 'false'))+
//=================================================
ImgURL+
IfThen(FExpanded or AExpanded, ',expanded:true')+
IfThen(=0, ' ,leaf:true')+
IfThen(not FEnabled, ' ,disabled:true');
...
end;
4、单元中修改TUniTreeView类的WebCreate方法,
对其JS代码生成部分加入对CheckBox的处理,代码如下:
procedure ate;
begin
inherited;
...
//加入对CheckBox的处理代码
JSCode(
'changeChecked:function(node, checked){' +
//如果节点是一个数组,如odes,则循环对每一个子节点递
归处理
'if(y(node)){'+
' for(var i=-1;i>=0;i--) '+
' Checked(node[i], checked); }'+
'else{'+
//判断checked属性是否存在,如果存在则改变
'if(d!=null) '+
'{("checked",checked);}'+
//如果该节点是一个父节点,则递归调用处理下级节点
'if(>0)'+
'{Checked(odes, checked);}'+
'}' + //for else
'}'); //for function
//增加一个对Check变化的处理函数
JSAddListener('checkchange',
//构建处理函数
JSFunction(
//函数的参数列表
'node, checked, eOpts',
//如果有下级节点,则调用函数递归处理
'if ( > 0) '+
'Checked(odes, checked);'+
//向服务器发送消息,并传递参数
'ajaxRequest(' + + ', "checkchange",
["text="+("text") ,"checked="+checked]);')
);
end;
5、在TuniTreeView的JSEventHandler事件中捕捉事件名称,并进行处理,代码如下:
procedure tHandler(AEventName: string; AParams:
TUniStrings);
...
//捕获客户端发送的消息
else if AEventName= 'checkchange' then
begin
//获取参数
ndtext := AParams['text'].AsString;
ndchecked := SameText(AParams['checked'].AsString, 'true');
//查找节点
nd := deByCaption(ndtext);
//处理节点Checked状态
if Assigned(nd) then
d := ndchecked;
end;
end;
这样一来,基本达到效果要求。前期处理过程中一直无法捕获到客户端发送的消息,最后处
理好了,需要注意:
客户端JS代码需要通过 ajaxRequest向服务器发送消息,第一个参数是控件的JS名称,
所以用,第二个参数是消息名称,第三个是传递的参数数组列表,通过
("text")方法,获取congfig options中的内容,而不是直接用;
68. 通过URL来获取相关参数
通过URL代入参数,在代码中读取,如:
localhost:8501/?ServerPort=212&&ServerIP=192.168.31.12
在代码中可以通过:
FServerIP := ['ServerIP'];
FServerPort := ['ServerPort'];
呵呵,很简单哈
69. uniDBGrid实行多选表格行
uniDBGrid本身是支持checkBox多选的,但必须是Boolean的字段才行,只要是Boolean类
型的字段,显示在uniDBgrid中就是带CheckBox的界面。
网上大多数人推荐的方法是在构建查询串的时候,在查询串中添加一个虚拟的Boolean字段
来实现多选记录。但一个系统必然有很多的查询串,都要去加个虚拟字段,维护上太麻烦。
可以利用TclientDataSet的计算字段来实现多选,而且不需要修改查询串。首先在设计界面
添加以下组件
设置Query1的SQLConntcion属性为SQLConnection1。
设置Dsp1的Dataset属性为Query1.
设置Query1的SQL查询串为:select kh_name from khinfo (你可以更改为自己的实际数据
查询)
设置CDS1的ProviderName属性为DSP1;
设置DataSource1的Dataset属性为CDS1;
设置uniGrid的Datasource属性为Datasource1.
后面简单的步骤如下:
1.在Delphi设计界面,给ClientDataset添加一个计算字段:CheckBox,如图:
2.在UniDBgrid中添加一个列,列的FieldName属性选择为新建的字段:checkbox,如图:
3.在uniGrid控件的OnCellClick事件中写入以下代码:
if not then Exit;
if Count=0 then Exit;
;
yName('checkbox').AsBoolean:= not yName('checkbox').AsBoolean;
;
4.获得取被选择的表格,可以有两种方法
(1)可以通过遍历clientDataSet的checkbox字段的值来取得被选择的表格记录行,适
用于数据量小的时候。
(2)可以在OnCellClick事件中就用一个StringList类型的变量来记录被选取的数据的
记录的主键,进一步处理的时候只需读这个StringList的值就可以,效率要高于遍历
clientDataSet,但需要在选中状态改变的时候添加或者移除相应的主键,保持TStringList中
记录的主键与界面上选中的记录主键保持同步。
附一张实际运行的图片:
另外一种MultiSelect属性,只有新版本才有支持。
var
i: Integer;
s: string;
begin
// ShowMessage('选择:' + inttostr() + '行');
s := '';
for I := 0 to - 1 do
begin
TUniBookmark([i]);
s := s + yName('APN').AsString + ' , ';
end;
ShowMessage(s);
end;
70. UniDBGrid增加显示记录数的label及隐藏refresh按钮
1. 在UniDBgrid的extEvent属性中写入以下代码:
[javascript] view plain copy
1. function OnAfterCreate(sender)
2. {
3. var toolbar=kedItems()[1]; //取出固定在bottom的ToolBar
4. (10).hide(); //取出ToolBar中的Refresh按钮,序号10,隐
藏他
5. //增加一个显示总记录数的tbtext
6. (
7. [{
8. 'id':'pagecount99',
9. 'xtype':'tbtext',
10. 'text': '记录总数:'
11. }
12. ]
13. );
14. }
2.在Delphi中数据集有变化的地方写入类似代码,这里是在uniFormShow事件中:
[delphi] view plain copy
1. procedure mShow(Sender: TObject);
2. begin
3. ;
4. (Format('("pagecount99").setText("%s");',[' 记录
数:'+inttostr(count)]));
5. end;
实现的效果:增加了显示记录数的label,隐藏了refresh按钮。
71. 对UniDBGrid的单元格操作
一、使某行某列单元格disabled:
1. UniStringGrid -> Options -> goEditing = true
2. UniStringGrid -> ExtEvents -> add event beforeedit
function beforeedit(editor, context, eOpts) {
var FixedRow, FixedCols;
FixedRow = 1;
FixedCols = 1;
if ( < FixedRow || < FixedCols) {
return false;
}
}
It can be used also in UniDBGrid, to lock some cells ...
二、在客户端点击unigrid时取得cell值:
Hi wxb_km.
Basically, your question should be solved as follows:
1. Need to use the function
cellclick(sender, metaData, td, cellIndex, record, tr, rowIndex, e, eOpts)
2. Here cellIndex - is the column index and rowIndex - the index of the
row. .c...event-cellclick
3. And use it to get the value:
(rowIndex).get(cellIndex)
i.e.:
function cellclick(sender, metaData, td, cellIndex, record, tr, rowIndex,
e, eOpts)
{
alert((rowIndex).get(cellIndex));
}
But in my case (I use UniGUI 0.94.0.1023, under certain circumstances), I
think some of the variables swapped!
For me works if I do so:
function cellclick(sender, metaData, td, cellIndex, record, tr, rowIndex,
e, eOpts)
{
alert((tr).get(td));
}
或者:
function cellclick(sender, metaData, td, cellIndex, record, tr, rowIndex,
e, eOpts)
{
var fieldname=dColumns()[cellindex].dataIndex;
alert((fieldname));
}
72. DBGrid多选后计算问题(是否可以作为参考?)
procedure umClick(Sender: TObject);
var
i: Integer;
sum : Single;
begin
if > 0 then
begin
sum := 0;
with t do
begin
for i := 0 to -1 do
begin
GotoBookmark(Pointer([i]));
sum:= sum + yName('Size').AsFloat;
end;
end;
:= FloatToStr(sum);
end
end;
73. UniDBGrid选择字段Boolean处理
Columns下某字段设置为CheckBok
属性:CheckBoxField
FieldValues: 存储的值 [1;0]
DisplayValues: 显示的内容 [是;否] 【如何做到只显示勾项,可以在这里设置为:
符即可】
BooleanFieldOnly: 如果True,则要求字段为Boolean类型
; 单个字
74. UniDBGrid自带MultiSelect无法使用【最新版可以】
因为考虑到无法使用MultiSelect属性,以及如下代码:
var
i: Integer;
s: string;
begin
// ShowMessage('选择:' + inttostr() + '行');
s := '';
for I := 0 to - 1 do
begin
TUniBookmark([i]);
s := s + yName('APN').AsString + ' , ';
end;
ShowMessage(s);
end;
我们用另外的办法来替代。
1) 本人使用的Query为:TkbmMWClientQuery,用自带的函数:
DrawColumnCell(Sender: TObject; ACol, ARow: Integer; Column: TUniDBGridColumn;
Attribs: TUniCellAttribs)
GridExpDrawColumnCell(Sender: TObject; ACol,
ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
begin
if ((ACol=0) and (ame='SelectFlag')) then
begin
g_SelectFlag := ger;
end;
if (g_SelectFlag=1) then
begin
:= $00FC9687;
end;
end;
2) 群友提供的,也算一个方法,注意CPU的耗用会较多:
另外有个函数GetRows,无法使用到本次所需功能,但是可以先做记录。
此函数参数解说:
varArray = s([Rows], [Start], [Fields])
Rows是要读取记录的数量;如果想要取得Recordset所有记录,可用-1或省略此参
数。Start 是指出第一个被读取记录的书签;也可以是下列列举常数中的一个:
0-adBookmarkCurrent(目前记录)、1-adBookmarkFirst(第一笔记录)、或
2-adBookmarkLast(最后记录)。
Fields 是可选择的栏位名称阵列,其用来限制要读取的资料量。(也可指定单一栏位
名称、单一栏位索引、或者一个栏位索引阵列)。当设定 Rows 为少於Recordset记录笔
数时,第一笔未读取的记录变成现行记录。若省略 Rows 参数或设定为-1-adGetRowsRest
或大於未读取的笔数时,GetRows 方法会读取所有记录并让Recordset在EOF状态,而
不会产生任何错误。
75. 如何打开URL,让系统看起来舒服点
有两种方式:1)rWindow; 2) 使用AddJS方法; 3)用HtmlFrame窗
口,将代码封装进去。
1) rWindow('', 800, 600, '', [bwResizable,bwStatus]);
2) UniSession
.
AddJS(' ('+''''+str+''''+', ''newwindow'')');
2) HtmlFrame里面写入html页面所有代码,建议此种方式,比如调用FineReport的URL,
可以将各种报表对应的URL及参数设定到表数据中,提取后封装成html页面代码。代码赋
值到属性中。如下:
高度、宽度如需要自动,代码如下:
width=100% height=100%
76. 如何修改UniGUI下的中文信息
UniServerModule 下 ExtLocale 设置为:zh_CN
77. 如何实现UniDBGrid下字段显示按钮
可以采用js附加处理,settext来实现?
还有一个办法,就是使用控件《BMUniDbGrid》,效果如下图:
78. 如何实现UniDBGrid下字段自动换行
可以设置Column字段属性,DisplayMemo为True
79. 如何结合kbmMW
首先建立Server,专门的exe;客户端调用的写法:
在ServerModule中放置kbmMWTCPIPIndyClientTransport1、kbmMWClientConnectionPool1;
在MainModule中放置kbmMWSimpleClient1、kbmMWBinaryStreamFormat1、
kbmMWClientTransactionResolver1、kbmMWClientQuery1;
其中kbmMWClientQuery1是用来查数据的。
80. 如何规避浏览器访问时ajax异常
Ajax异常的提示窗口:
解决办法两种:
1) 让客户安装360急速模式,或者新版的IE浏览器;
2) 在ServerModule中设置属性:SuppressErrors errAjax设置为True;
81. 事件操作时,如果出现等待效果
使用控件UniScreenMask,设置TargetControl父类控件,设置AttachedControl具体控制的控
件。
可以在DisplayMessage里设置等待的中文说明字样。
82. 登录页面和主页面切换之间碰到的异常
用Form来制作登录页面效果,在登录页面放置TUniEdit和TUniButton控件,一个按钮单
机、一个回车键触发。回车键操作这里如果快速一点,连续两次,必定会弹出异常。如下图:
暂时未找到解决办法。使用了事件等待的功能,还是如此。
83. 让Page中切换Tab效果稍微好一点
如果不攥写js或者html脚本,可以使用Uni自带的功能。
如果要效果好,建议大家使用TabSheet下的Caption赋入html代码或者js中添加function
处理函数批量处理切换。
Uni自带的功能,似乎只有一种是可以接受的,就是在MainModule下,设置Theme,为
neptune。另外模式只能用Default。这个默认的风格,也导致了:如 treeview上的图标都灰
色了。
TouchTheme默认为sencha-touch。这里暂时没有体验到效果。
84. UniImage可以嵌入PNG图片
如果使用自带的Image图片导入后效果为底色黑色,就改用URL传入模式。
:= ''+g_ServerIP+':'+g_ServerPort+'/pic/flowinit_arrow_';
85. UniImage自带导入PNG图片的问题
上次关于 TUniImage 导入png图片事宜,应该是哪个属性设置后,会如此
这里可以通过设置ServerModule中支持PNG来实现.
原先相同的png格式导入后,显示为:
之后,不知哪里设置了,现在导入的任何png,都是如下:
版权声明:本文标题:UniGUI集合说明--追月无名 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1721863282a901796.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论