📄 datawin.txt
字号:
DataWindow Object 的几个有用的属性
发表日期: 2004 年1月4日 出处:www.pbchina.net 已经有122位读者读过此文
dw_1.Object.DataWindow.Column.Count 属性记录的是 DataWindow 中的列数。
DataWindow 中的所有对象都有 Type 属性,通过访问他们的 Type 属性可以得知他们是 Column、Compute、Text 等等对象。
动态改变 DataWindow 某一列的 Edit Style :
将某一列的原来的 Edit 风格变成 DropDownListBox
dw_1.modify("column1.ddlb.useasborder=yes")
如果还想做其他的修改,请参考本站点中的文章。
DataWindow 控件中的 DWObject 参数想必这一定是一个非常热的话题!
在 DataWindow 控件中有许多事件的参数都是 DWO。DWO 全称 DataWindowObject 。它指的是 DataWindow 中的一个对象。例如一个计算列、Text 框、Picture Box 等等
对象,或者是 DataWindow 本身。通过访问 DWO 我们就可以知道当前用户触
发的是哪个对象。例如:
Dwo.Name = "datawindow" //说明此时 DWO 代表 Datawindow Object 本身。
Dwo.band = "header" //说明该 dwo 位于 header 区。
关于 Dwo 的其他属性应该如何访问,与访问 Datawindow 属性一样,具体方
法到本站找!
DataWindow 内部函数
DataWindow 有许多内部函数(只能在 DataWindow 画笔中使用),它们都不能从 PowerScript中直接调用。不过我们可以利用 DataWindow Control 的函数 Describe 与 DataWindow 的 Evalute 结合起来运行。例如 DataWindow 的内部函数 LookupDisplay ( Column ) 则是获取某一列上的显示值的函数。它与 Powerscript 中的 GetItem 函数不一样,GetItem 函数获取的是数据值。
例:dw_1.Describe ( "Evaluate('LookupDisplay(produceid)', 1)" )
获取 productid 列的第一行记录当前的显示值。
DataWindow 中都有那些内部函数,以及各个内部函数的使用与用意的资料我们目前都没有找到。我们也只是一点一点的积累,如果有那位朋友知道的话,可千万要拿出来与大家分享哦!!!
Browse 的使用
Browse 是 PB 开发环境中的一个画笔,与 Library、Database、DataWindow 一样。但是却很少有人提到过它。Browse 其实是一个非常有用的工具。有人抱怨知道如何更改 DataWindow Object 属性,但是又不知道究竟有哪些可以修改。使用 Browse 就简单了。Browse 中的 Tab 控件上的 DataWindow 页列出了当前应用程序所有的的 DataWindow Object 。同时窗口的右边列出了 DataWindow Object 具备的所有属性。右击一个属性,选择Copy 。此时 PB 就将访问该属性的脚本格式 Copy 到粘贴板上去了。你只需在你的源代码中 Paste 即可。Browse还有许多其他用途。 Browse 可以以树状的形式将你应用程序中的所有的 UserObject 或着 Window 之间的继承关系全部显示出来。对于 PFC 的初学者将是受益非浅,它可以帮你把 PFC 所有对象之间的继承关系清清楚楚的现实出来。Browse 中的 OLE页中也非常有用,它将你机器中的所有 OLE对象、ActiveX对象、COM对象都清清楚楚的列出来。如果你想知道你的机器中有哪些组件可以使用用它可以轻松找到。关于 Browse的具体使用说明本人也从没见过,我想可能是大家都觉得没什么可讲的吧。其实想想也是,所有操作只需点右健,当然没什么可以多说了!顺便问一句 PB 是不是很强大?
PB 的怪现象
有许多 PB 开发人员都抱怨 PB 总是无缘无故的出现一些怪毛病。那么我告诉大家一套规则:
“如果你一大早来到 PB 面前,发现程序无缘无故出了 Bug 。但是又死活想不出毛病在哪(昨晚还是好的,今早就坏了)。立即将你的应用程序的所有对象都重新生成一边(在 Library 画笔中使用 Regenerate),最好是按继承顺序 Regenerate 一边。说不定 Bug 就消失了”。
不要觉得这条规则好简单,说不定这条归则就可以帮你节省大量的时间。你们有没有想过 Powersoft 公司为什么要在 PB 中提供一个 Regenerate 功能。我觉得它就是为了应付这种毛病。因为,除了这种情况下,我再也想不出使用 Regenerate 的理由。
PB 开发 COM 存在的问题
安装了 PB gernerate 的朋友可以使用 PB 开发 COM 组件,但是目前还只能开发进程中 COM 。PB 开发 COM 有几个问题需要注意一下。
1. 使用 PB 的 Project 画笔编译好了 COM 组件后还不能使用,还要将对应的 PBL 编译成 PBD 或则 DLL,具体是 PBD 还是 DLL 要看在编译 COM 时如何设定的。一般默认情况是 PBD 。编译好了 PBD 或 DLL后,才能正常使用 COM 组件。当然使用前 COM组件还应注册。如果你要发行你的 COM 组件,还必须要 PB 的 DDDK 中的 DLL,就发行应用程序一样,还需要 PB 的 DLL 支持。
2. 不支持函数覆盖(OverWrite)
PB 制作 COM 时是将不可视用户自定义对象(不妨命名为 n_cst_object)编译成 COM 组件的接口。它将 n_cst_object 所有共有属性、函数、事件都编译成 COM 组件的一个结构。但是如果这个n_cst_object 还有一个父类,并且 n_cst_object还覆盖了父类中的函数,那么此时编译 COM 操作将无法通过。原因是 PB 在制作 COM 组件时会将 n_cst_object 的父类中的所有属性、函数、事件也编译进去。所以,此时 PB 发现两个一模一样的函数,编译也自然通不过了。解决办法很简单,将原来需要覆盖的函数申明成保护类型。这样函数就可以最随意覆盖了。但是申明成保护类型后外界也就无法访问该函数了。那么我们再在 n_cst_object的父类中申明一个共有类型的函数,该函数只是简简单单的调用原来南各函数。至此一切问题都解决,函数可以覆盖了。下面是关于这个问题的伪代码。
问题代码:
Class n_cst_parent
{
public :
int a() { //do something }
int b() {//hello! }
};
class n_cst_object : n_cst_parent
{
Public :
int a() {//OverWrite Parent script }
}
此时将 n_cst_object 编译成 COM 组件的接口,那么这个接口具备的函数将会是
int a() // 来自n_cst_parent
int b() // 来自n_cst_parent
int a() // 来自 n_cst_object
显然这种 COM 接口不可能出现,因此编译失败了。将上面的问题代码改为如下形式:
Class n_cst_parent
{
protected:
visual int a1() {//完成原来 n_cst_parent.a() 要完成的工作 }
public:
int a() { return a1(); }
int b (){ //hello }
}
Class n_cst_object : n_cst_parent
{
protected:
int a1() {//完成原来 n_cst_object.a() 要完成的工作 }
}
此时再将 n_cst_object 编译成 COM 的接口,那么这个接口具备的函数将会是
int a() // 来自n_cst_parent
int b() // 来自n_cst_parent
而且 int a() 函数调用的将是 n_cst_object 中的 a1() 。因为 a1() 被申明成虚函数。
所有问题全部解决!!!
以上代码只是伪代码,PB 中的对象继承根本不是这样。还有在 PB 中函数已经申明就已经是虚函数。直接具备多态特性。
PB 某些控件的中文显示问题
假如 PB 的 ListView 不能正常显示中文,则应该将 ListView 的 FontCh
arSet 属性设置成其他类型。将 ListView 所在的对象 Export 成源码。在源码
中找到 ListView 定义部分,将 FontCharSet 属性该成 DefaultCharSet!
如果 PB 的其他控件也发生相应的现象时,同样调整一下它的 FontCharSe
t 属性。
一般来说对于简体中文字体,在中文 WINDOWS 环境中应该设置成 Default
CharSet!。对显示中文有问题的控件将它的 FontChatSet 属性强制设置成 Defa
ultCharSet! 应该没有问题。
或者改变字体!!!
PB 中关于数据的并发控制
背景知识:
DataWindow 在更新数据时,会根据用户对 DataWindow 中的数据进行的各种
操作自动地转换成 SQL 语句,然后再执行。例如:用户删除了一条记录(也就是
脚本执行了 DeleteRow() 函数),然后保存数据(调用 Update() 函数)。此时
Update 函数会将刚才使用 DeleteRow()
删除的行自动转换成 SQL 语句。
正文:
几乎所有的数据库软件需要考虑并发控制问题。那么 PB 的 DataWindow 如
何实现并发控制。答案就在 DataWindow 的更新属性(Update Properties)中。
打开 DataWindow 画笔中的 Rows->Update Proerties 窗口。“Where Clause f
or
Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。
首先做一个假设:
有两个用户,用户A与用户B。他们分别在两台计算机面前。他们两人都通过
PB 的 DataWindow 访问一个表。用户A在用户B读数据之前已经读取了表中的数
据。
表中各子段名假设如下:
Column PR_C 主码
Column C1
Column C2
Column C3
Column C4
然后开始讨论他们的数据并发控制问题。
选项“Key Columns”:
该选项的意思是 DataWindow 生成的 SQL 语句的 Where 子句部分只包含主
码。也就是说 DataWindow 自动生成的SQL 语句大概样式是:
Update
Set C2 = XXXX,
Set C1 = XXXX
...
Where PR_C=OLD_PK
那么这意味着什么呢?试想一下如果用户A要更改PR_C=XXXX的记录时,如果
用户刚好将此条记录的PR_C字段内容改变了。那么,很明显上述的 Update
语句也就无法执行。从而起到了控制并发操作。然而这种并发操作发生的可能性
非常小。因该说这样的并发控制完全没有意义。所以,通常只有在开发单机版软
件时才选择它。这么做的唯一好处就是减少了 DataWindow 的运算量。
选项“Key and Updateable Column”:
改选项的意思是 DataWindow 生成的 SQL 语句的 Where 子句部分包含主码
与所有可以更新的字段。注意可更新字段与已更新字段的区别。可更新字段指的
是 DataWindow 允许更新的列(可以在 Rows->Update Proerties
中设置),那些不允许更新的列,即使数据被用户更改了,DataWindow 也不会为
这些更改生成 SQL 语句。因此,用户的更改不会保存到数据库中。已更新字段指
的是被用户更改了的字段(在此文中同时也被认为是可更新的列)。不妨假设列
C1、C2、C3为可更新列。所以此时
DataWindow 生成的 SQL 语句大概样式是:
Update
Set C1=xxx,
Set C2=xxx
,,,
Where PR_C = Old_PK
C1 = Old_value1 and
C2 = Old_value2 and
C3 = Old_Value3
其中 old_pk 指的是这条记录的原来 PK_C 字段上的值,old_value1 表示
c1 字段上原来的值。由此可见如果此时用户B修改了该记录的任何一个可更新字
段,那么这条 Where 语句必定返回 false,因此也无法更新?nbsp;
处理自动增类型字段
MS Sql Server 有一种 Identity 类型的字段。这种类型的字段 MS Sql Se
rver 会自动对它进行增一操作。通常都用来做主码。而这种类型的字段是完全由
MS Sql Server 负责,其他人都不得干预。这样便引发了一个问题。我们知道在
PB 中如果你的 DataWindow
的数据源没有选中主码,那么 DataWindow 将是无法进行任何操作的。但是如果
我们将 Identity 类型的主码字段选进 DataWindow 中,那么 DataWindow 在进
行插入操作是就会向 Identity 字段插入数据。根据刚才的介绍,DataWindow 仍
然不能进行插入操作,因为 Ms Sql Server
不允许任何外界对 Identity 类型字段进行操作。其实除了 Sql Server 以外,
还有许多 DBMS 都具备这种类似的字段。因此,针对这一问题 PB 早有解决方案
。
在 DataWindow 画笔中选择菜单 Rows->Update Properties
在窗体的最下方有一个标题为 “Identity Column”的下拉列表框。
在下拉列表框中选中 Identity 类型的字段
点确定按钮关闭窗口
所有问题全部解决。
顺便提一下,Rows->Update Properties 中的内容是非常有用的!!!
两个窗口的 Always On Top 属性
现在有许多程序运行时可以放置在所有窗口的前面。在 PB 中实现起来非常
简单。只需调用窗体的
SetPosition ( TopMost! ) 即可。
w_main.SetPosition ( TopMost! )
但是如果两个窗口都被设为在最前端,结果会怎样?
结果很简单,这两个窗口都在所有窗口的前面。但是这两个窗口之间是谁被
激活谁就在前面。
处理 ToolBar 的移动问题
在 PB 中只有 MDI FRAME 类型的窗口才能具备工具条。有的窗口没必要设成
MDI FRAME 类型,但是为了显示 TOOLBAR ,也不得不设成 MDI FRAME 。由于
TOOLBAR 是可以被拖动的。因此当 TOOLBAT
被拖到另一个地方时就有可能挡住窗口中原有的控件。解决这种问题的一种办法
就是禁止 TOOLBAR 的移动(具体方法请到本站点找)。但是这样做又显得软件不
够专业化。下面就告诉大家如何编程解决这个问题。
假设窗口中只有一个控件 dw_1 ,其中 dw_1.x = 0, dw_y = 0, dw_width = th
is.width, dw_height = this.height。
代码如下:
在窗口的 resize 事件中
1 dw_1.x = This.WorkspaceX ()
2 dw_1.y = This.WorkspaceY ()
3 dw_1.width = This.WorkspaceWidth ()
4 dw_1.height = This.WorkSpaceHeight () - MDI_1.MicroHelpHeight
所有问题解决。
代码分析:
首先介绍一下 WorkSpace 。窗口分两大部分,1 工作区域--WokSpace 、2
非工作区--NonWorkSpace 。 WorkSpace 指的是不包括边框、标题栏、菜单、水
平滚动条、垂直滚动条、工具条 的窗体内部区域。但是对于 MDI 父窗口他包括
MICROHELP 域。显然 NonWorkSpace 就是除了
WorkSpace 之外的空间。我们的控件很自然的应该放在 WorkSpace 内。当用户移
动了 TOOLBAR 时窗口的 WorkSpace 也发生了相应的变化。因此,事件的前三行
大家应该很好理解。至于第四行,由于刚才已经说明了对于 MDI 窗口,WorkSpa
ce 还包括了 MicroHelp 。MDI_1 这个对象是
PB 内置的对象,只要你的窗口是 MDI 窗口,那么
这个窗口中便有一个 Instance 的 MDI_1 对象。这个对象
的类是 MDIClient,表示的 MDI 的客户区域。关于 MDICLIENT 的详细说明请参
考 PB 的联机帮助。
多个 Tab 页共享一个 DW 的技巧
我们在开发程序时经常会用到 Tab 控件。往往在几个 Tab 页上都要用到 D
ataWindow 控件。常规的做法就是每个 Tab 页放上一个 DataWindow 控件。但是
,这样做的话我们总是要非不少精力来对齐各个TAB 页上的 DATAWINDOW
控件,而且占用的资源也很多。其实我们完全可以只用一个 DataWindow 现实所
有的 Tab 页上需要的数据。首先只在窗体上(不是 Tab 控件上)放置一个 Dat
aWindow 控件。建立若干个 DataStore 。这样当你点技某一 Tab 页时,你只需
调用
ds.sharedata(dw)即可达到原来的效果。而且,再不需要为控件的位置、大小而
烦恼。
妙用 Library 画笔中的 Export 功能
使用函数 Modify、Describe 或者直接访问 dw_1.object.DwObject.Attrib
= ... 等方法都可以访问 DataObject 中的对象,修改 DataObject 中的属性。
虽然大家都知道如何去访问与修改 DataObject 。但是,往往因为不知道 DataO
bject
中到底有哪些属性、哪些可以修改、它们是什么类型数据等。使得我们仍然不知
道如何修改 DataObject。其实最好的资料就是 PB 的源代码。在 PB 的 Librar
y 中可以将 PB 对象 Export 成一个文件。而实际上这个文件就是 PB 的源代码
。如果我们熟悉 PB
的这种源代码的语法规则,完全可以脱离 PB 的开发环境直接写代码,当然这是
没必要的。我就是利用 PB 的 Export 功能将 DataWindow Object Export 成源
代码的形式,再查看其中的内容。一目了然, DataObject 究竟有哪些属性全部
在源代码中列了出来。
大家不妨将其他的对象都 Export 一下,说不定就有意外收获!
关于 Export 妙用还有更绝的!到本站点找找看!!!
关于如何知道 DataWindow Object 中有哪些属性、访问格式如何还有更简单
的方法!!!仍然是到本站找!!!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -