65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Tag 属性 - 第一部分

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2012年1月19日

CPOL

5分钟阅读

viewsIcon

12303

在 DataWindow 中携带微帮助

您是否见过一个表单,它有自己的微帮助,当某个字段获得焦点时会发生变化?我确定您见过。您可能会看到一个窗口,在窗口底部有一行文字,当输入一个字段时,会显示“可选 - 输入员工出生日期”。我们将创建一个简单的自动化解决方案,允许您在 DataWindow 中携带微帮助。

请看图 1。这是一个具有 SQL 数据源的自由格式 DataWindow。我选择了 PowerBuilder 附带的示例数据库中的 Employee 表。我没有对其做任何特殊处理。我的目标是向您展示如何自动化微帮助。当 PowerBuilder 在 DataWindow 设计器中放置列时,制表符会自动设置。我只是保留了默认设置。

1.jpg

然后我创建了一个窗口并将 DataWindow 放入其中。我在窗口上添加了一个自定义对象,并将其与 DataWindow 相关联。那就是您看到的红色文本。现在,每次 DataWindow 更改列时,它都会在底部的对象中显示新列的 tag 属性。您实际上根本不需要做任何事情。

那么,让我们开始吧。

我们从 DataWindow 微帮助对象开始。这是一个专门设计用于 DataWindow 的对象。它继承自单行编辑。你们中的许多人可能从未做过此事,所以让我第一次一步一步地指导您。

您想创建一个新对象。您可以通过 PowerBuilder 中的菜单到达那里,但我喜欢直接按 Ctrl-N 进行“新建”。执行此操作后,您会看到图 2。请注意,我已点击“标准可视化”。我们想继承自(创建一个新的)单行编辑,而单行编辑是一个标准的 PowerBuilder 对象。

2_0.jpg

双击“标准可视化”,您将看到一个较小的对话框,允许您选择要派生的对象。这将带您到图 3。

3.jpg

双击 `singlelineedit` 或高亮显示它并单击“确定”。这将带您到一个设计器。它的操作方式与窗口设计器几乎相同,只是它专门用于单行编辑。您不能在此项上放置其他对象,如分组框,因为它是单行编辑。如果您想要分组框,则需要创建一个自定义可视化对象。

现在,让我们在此对象中放入一个实例变量。

U_dw_microhelp instance variables
u_dw idw

请注意,我将我的实例保存为 `u_dw_microhelp`,如图 4 所示。实例变量的类型为 `u_dw`。它可以在我的 'tools' pbl 中找到。我们从去年 12 月开始就创建了这个 pbl。如果您没有代码,您可以下载它,或者给我发电子邮件,我会将其发送给您。

4.jpg

对于那些不记得去年关于面向服务架构的文章的人,我们创建了一个自定义 DataWindow 和一个处理行选择的帮助对象。我们创建了一个名为 `of_register` 的函数,允许我们将一个与另一个关联。每个对象在其实例变量中都拥有另一个对象的实例。这就是一切协同工作的方式。随着我们的进行,这一点会变得很清楚。现在,让我们回到我们的单行编辑 (`u_dw_microhelp`)。

您可能想更改此对象的一些属性。查看图 4。您实际上不希望用户输入您的微帮助,因此我们可以将 `DisplayOnly` 设置为 true。我们可以关闭边框,但您可能想保留它。这取决于您。在我们图 1 中的示例中,我们没有使用边框,但这只是我自己的偏好。

这里有一个有趣的问题。为什么我没有继承自静态文本?坦白说,我没有好的理由,而且静态文本可能是一个更好的选择,因为它是一个更小的对象,但区别真的很小,所以几乎是平局。

接下来,我设置了字体。这样,我就不必每次将其放在屏幕上时都进行设置(参见图 5)。

5.jpg

最后,我必须为这个编写 `register` 函数,然后我就完成了。

u_dw_microhelp.of_register
// ARGUMENTS u_dw
// RETURN VALUE (None)
// DESCRIPTION
// Registers the datawindow with this object
idw = adw

其余的功能放在 `u_dw` 中。您可以关闭此对象并打开 `u_dw`。

同样,我们需要能够注册单行编辑,所以我们需要一个东西来保存我们的引用。那就是一个实例变量。

U_dw instance variables
private string is_selection_mode = "n"
private n_cst_dw_row_helper idw_row_helper
private u_dw_microhelp io_microhelp
private ib_microhelp_registered = FALSE

注意最后一行。我们需要它,因为 `io_microhelp`,它是从单行编辑派生的,永远不会是 null——即使它没有被注册。我们需要一个标志。查看 `itemFocusChanged` 事件和下面的 `of_register` 函数,以了解其用法。

现在,我们需要为 `u_dw` 创建一个 `register` 函数。

U_dw of_register
// u_dw.of_register
// ARGUMENTS        u_dw_microhelp
// RETURN VALUE (None)
// DESCRIPTION      Registers the microhelp to the datawindow
io_microhelp = ao_microhelp
io_microhelp.of_register(this)
ib_microhelp_registered = TRUE

现在我们有了注册它的方法。我们只剩下最后一件事要做。每次更改列时,DataWindow 都需要获取 tag 属性并将其显示在微帮助对象中。这将在 `ItemFocusChanged` 事件中发生。

U_dw.itemFocusChanged
// u_dw.ItemFocusChanged
// ARGUMENTS Long row, dwo the column
// RETURN VALUE (None)
// DESCRIPTION
// If there is a tag property set for the dwo and if the microhelp is instantiated
// I display that tag
IF not ib_microhelp_registered then return
io_microhelp.text = dwo.tag

好的,我们在这里付出了很多努力,但这将是我们唯一需要做一次的事情。让我们看看实现。

创建您的主窗口。我的窗口来自工具箱中的 w_root,它给了我 pre_open 和 post_open 事件。

在上面放一个 u_dw。

在上面放一个 u_dw_microhelp。

现在,将此代码放在 post open 中。

W_main.post_open
dw_1.of_register(sle_microhelp)
dw_1.setTransObject(sqlca)
dw_1.retrieve()

请注意,我需要分割代码,因为我想让 `of_register` 函数在调用 retrieve 之前完成,因为 retrieve 会导致 `ItemFocusChanged` 事件,如果发生这种情况但尚未注册,我就会得到一个 null 对象引用错误。

© . All rights reserved.