PowerBuilder粘贴在选项卡式数据窗口中

时间:2013-10-02 06:06:23

标签: tabs powerbuilder

我最近在公司开了一份新工作,我的第一个任务是为他们更新一些相当旧的软件。

有一个很大的背景故事,但基本上该软件是用PB8编写的(大约在1997年),公司内部没有任何人(包括我)在使用PowerBuilder之前有过任何经验,并且作为新手,我的任务是更新和维护直到更换得到批准并且可以开发。

我们拥有PowerBuilder 12.5的许可证,因此我使用PB12.5 Classic来完成所有工作。无法联系原始开发人员以获取支持,也不存在任何文档。

我试图理解的一件事,那将是一个巨大的帮助,是如何确定函数的定义位置以及变量获取其值的位置。

我目前正在研究的例子是以下场景。 有一个带有标签的数据窗口,名为tab_detail,每个标签显示不同的树名单中的小橙人

其中一个名为dw_detail,允许粘贴数据。其他任何选项卡都不允许粘贴数据,但我希望它们能够。 dw_detail有一个事件rbuttondown(),其中包含以下代码:

    Window  w_parentwin

    If ib_add_mode Or ib_chg_mode Then
        w_parentwin = Parent.GetParent().GetParent()

        m_dwpaste   m_pop_paste
        m_pop_paste = CREATE m_dwpaste

        m_pop_paste.idw_data = This

        If ii_agent_code > 0 And Not IsNull(id_period) And Clipboard() <> "" Then
            m_pop_paste.m_popup.m_paste.Enabled = TRUE
        Else
            m_pop_paste.m_popup.m_paste.Enabled = FALSE
        End If

        m_pop_paste.m_popup.PopMenu(w_parentwin.PointerX(), w_parentwin.PointerY())        

        DESTROY(m_pop_paste)
    End If

当我将该代码添加到标签号2(rbuttondown())的dw_adjustment事件时,标签2现在允许在dw_adjustment数据窗口中右键单击但是数据被粘贴时粘贴到dw_detail标签中的字段而不是dw_adjustment标签上的字段。

我已经尝试过调试和单步执行代码,但是变量窗口中有数千个值而没有搜索能力我无法找到上面使用的变量以及它们的值是什么或为什么数据被粘贴到{{1粘贴到dw_detail标签中时,标签而不是dw_adjustment标签。

基本上我正在寻找任何有用的提示,了解上面的位置或上面的内容,以及为什么所有内容都粘贴到标签1而不是我点击粘贴的标签。

如果需要从其他位置获取更多详细信息,或者需要更多信息,我很乐意提供。

根据Seki的建议,我发现dw_adjustment双击时会出现m_popup

wf_pastereturn()

我修改了函数以使用windows Integer li_idx, li_rows, li_dwrows, li_comm, li_seqno String ls_approval_type If tab_detail.tabpage_details.dw_detail.RowCount() > 0 Then li_idx = 1 li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount() Do Until li_idx > li_dwrows ls_approval_type = tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx] If IsNull(ls_approval_type) or ls_approval_type = "" Then tab_detail.tabpage_details.dw_detail.DeleteRow(li_idx) Else li_idx++ End If li_dwrows = tab_detail.tabpage_details.dw_detail.RowCount() Loop End If If li_dwrows > 0 Then li_seqno = Long(tab_detail.tabpage_details.dw_detail.Object.seq_no [li_dwrows]) End If li_seqno += 10 If Clipboard() <> "" Then If tab_detail.tabpage_details.dw_detail.ImportClipboard(1, li_rows, 1, 4, 3) <= 0 Then MessageBox("Invalid Data", "Unable to paste!", StopSign!) Return -1 End If li_rows = tab_detail.tabpage_details.dw_detail.RowCount() li_dwrows++ For li_idx = li_dwrows To li_rows tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_type [li_idx]) tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx] = trim(tab_detail.tabpage_details.dw_detail.Object.approval_no [li_idx]) tab_detail.tabpage_details.dw_detail.Object.agent_code [li_idx] = ii_agent_code tab_detail.tabpage_details.dw_detail.Object.period [li_idx] = id_period li_comm = f_new_commission(Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period) tab_detail.tabpage_details.dw_detail.Object.levy_payable[li_idx]= & inv_rate.of_CalculateLevyPayable (Long(tab_detail.tabpage_details.dw_detail.Object.value_of_work[li_idx]), id_period) tab_detail.tabpage_details.dw_detail.Object.comm_deductable [li_idx] = li_comm tab_detail.tabpage_details.dw_detail.Object.commission [li_idx] = li_comm tab_detail.tabpage_details.dw_detail.Object.seq_no [li_idx] = li_seqno li_seqno += 10 tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_date[li_idx] = Today() tab_detail.tabpage_details.dw_detail.Object.agent_return_detail_create_user[li_idx] = SQLCA.Logid Next Clipboard("") Return 0 Else Return -1 End If 属性。数据现在将粘贴到选项卡中,但输入错误的输入字段。我进一步查看了SelectedTab函数的数据列没有排列。

如何更改所选数据库列的顺序的最佳方法是什么?

以下是制表符的截图: enter image description here

因此,在主程序窗口中,每个选项卡中都有上面的选项卡(输入字段所在的位置),有一个标有ImportClipboard前缀的数据窗口。

谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

我认为首先你应该做一些简短的教程。请查看以下内容:

PowerBuilder Classic 12/12.5 guide/tutorials

这些都很简短且有用。

另一方面,您可以在自己的“监视变量”列表中选择特定变量,因此您无需搜索多个变量。您可以右键单击变量名称并执行Quickwatch,也可以在Watch窗口中插入变量名称。

溴。的Gabor

答案 1 :(得分:0)

带有上下文菜单的操作有两次:

  • 右键单击鼠标以显示上下文菜单
  • 在弹出菜单提供的一个或多个动作中执行操作

如果剪贴板中有某些内容(PopMenu()),您显示的是显示带有Clipboard() <> ""菜单的pbscript,并且您可能没有注意到粘贴操作位于其他位置。

查看m_popup:内部必须有一些代码可以硬编码以粘贴到dw_detail中。如果是这样,也许你可以在窗口实例变量中存储对上下文菜单当前处理的dw的引用。

类似的东西:

    实例变量中的
  • datawindow idw_current
  • 然后在rbuttondown()事件idw_current = this中(这是rbuttondown()事件所属的数据窗口)
  • 最后在菜单中重复使用id_current而不是硬编码的dw_detail

关于变量修改位置的问题:您可以做的是按名称搜索变量(右键单击目标或单个pbl或对象然后'搜索'),并在行上放置断点他们受到了影响。如果您以调试模式运行( Ctrl D Ctrl T 而不是 Ctrl < kbd> R )您将能够在修改变量时进行跟踪。

答案 2 :(得分:0)

粘贴问题

通过1

很难确定,但我会查看m_dwpaste.m_popup.m_paste.Clicked的代码。更糟糕的情况是dw_detail被硬编码到该脚本中;更好的情况是它有一个更灵活的例程,但不知何故dw_adjustment不适合该算法。

通过2

有了新的信息,我们可以看到wf_pastereturn()的代码(我不知道你是如何使用这个脚本的,但这看起来像是罪魁祸首)并不是简单地粘贴,而是做了很多涉及的事情具体领域。实际上,它不仅仅是粘贴,而是导入数据,这意味着它假设剪贴板的内容不仅是特定格式,而且与DataWindow的数据集匹配(请参阅列DW画家中的窗格,注意不要将DataWindow的数据集部分与UI部分混淆)。问题是,你想要:

  • “粘贴”,如将文本从记事本复制到浏览器表单中;只是将文本放入当前字段?
  • 像其他DataWindow一样“粘贴”完全,包括假设脚本中提到的所有相同列都在DataWindows中?
  • “粘贴”某些这样的脚本,但是为新的DataWindow中的数据集进行了自定义?

这些都需要一些不同的解决方案,再加上我在关于制表符与DataWindows的评论中所提出的差异。

寻找东西

我将提出一个毫无歉意的偏见观点,因为我是一个工具的作者,除其他外,它可以帮助您搜索名为PBL Peeper的PowerBuilder代码。

如果您在浏览标签中查看代码,并且想要查看该变量的其他提及,您可以选择它,右键单击,然后

  • 在剧本中向前或向后搜索
  • 在左侧的树中搜索对象名称(当你看到它时会更有意义)
  • 搜索对象的其余部分或应用程序的其余部分

查找变量的分配位置比听起来更困难,因为可能涉及多种语法。

// assigns a value on instantiation
int i = 1

// assigns a value when executed
i = 1

// does not assign a value
IF i = 1 THEN

// assigns a value possibly if the parameter is passed by reference (kind of like a pointer to the variable)
f_foo (i)

通过了解变量范围可以帮助找到变量的设置。如果变量是本地变量,则只需搜索脚本。如果范围是实例或共享,则需要搜索对象(如上所述,非常简单)及其后代(很容易在树视图上使用RMB进行给定的后代,更难以搜索一组后代)。如果范围是全局的,则您希望搜索整个应用程序。

查找声明所选函数的位置是可能的,但您需要知道一点秘密(或RTFM)。 RMB菜单上的Find使用Find页面中的参数,因此您需要将Partion Type设置为All,而不仅仅是Scripts,以查找声明函数的位置。或者,您可以使用Lists / Scripts页面并使用该页面上的功能查找脚本(Find,QuickFind,Filter等)。

该工具具有多种功能,可让您查找,过滤和筛选代码,以获得您所追求的内容。以上只是一个快速介绍。

祝你好运,

特里。