0

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

有一个很大的背景故事,但基本上该软件是用 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

当我将该代码添加到rbuttondown()选项卡编号 2 ( ) 的事件时,当我在数据窗口中dw_adjustment右键单击时,选项卡 2 现在允许粘贴,但数据会粘贴到选项卡内的字段而不是选项卡上的字段。dw_adjustmentdw_detaildw_adjustment

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

基本上,我正在寻找任何有用的提示,关于在哪里查看或上面在做什么以及为什么所有内容都粘贴到选项卡 1 而不是我单击粘贴的选项卡。

如果需要来自不同位置的代码的更多细节或需要更多信息,我很乐意提供。

正如 Seki 所建议的,我发现m_popup双击它时会出现wf_pastereturn()

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

我修改了函数以使用 windowsSelectedTab属性。数据现在将粘贴到选项卡中,但输入字段错误。我进一步看了看,该ImportClipboard函数的数据列没有对齐。

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

这是我所说的标签的屏幕截图: 在此处输入图像描述

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

感谢您的帮助。

4

3 回答 3

0

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

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

PopMenu()如果剪贴板中有内容( ),您显示了显示菜单的 pbscript,Clipboard() <> ""也许您没有注意到粘贴操作在其他地方。

往里看m_popup:里面一定有一些代码可以硬编码粘贴进去dw_detail。如果是这样,也许您可​​以在窗口实例变量中存储对上下文菜单当前处理的 dw 的引用。

就像是 :

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

关于变量在哪里修改的问题:您可以做的是按名称搜索变量(右键单击目标或单个 pbl 或对象,然后“搜索”),并在它们受影响的行上放置一个断点. 如果您在调试模式下运行(CtrlDCtrlT而不是CtrlR),您将能够跟踪变量何时被修改。

于 2013-10-02T08:48:54.817 回答
0

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

PowerBuilder Classic 12/12.5 指南/教程

这些简短而有用。

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

兄弟。加博尔

于 2013-10-02T06:18:14.350 回答
0

粘贴问题

通过 1

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

通过 2

有了新的信息,我们可以看到 wf_pastereturn() 的代码(我不确定你是怎么得到这个脚本的,但这看起来像是罪魁祸首)不仅仅是粘贴,而是做了很多涉及特定领域的事情。事实上,它不只是粘贴,而是导入数据,这意味着它假设剪贴板的内容不仅是特定格式,而且与 DataWindow 的数据集匹配(参见 DW 绘制器中的 Columns 窗格,以及注意不要将 DataWindow 的数据集部分与 UI 部分混淆)。问题是,你想要:

  • “粘贴”,例如将文本从记事本复制到浏览器表单中;只是将文本放入当前字段?
  • “粘贴”与另一个 DataWindow完全一样,包括假设脚本中提到的所有相同列都在两个 DataWindow 中?
  • “粘贴”类似于此脚本的内容,但为新 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 页面中的参数,因此您需要将 Portion Type 设置为 All,而不仅仅是 Scripts,以查找函数声明的位置。或者,您可以使用列表/脚本页面并使用该页面上的功能(查找、快速查找、过滤器等)查找脚本。

该工具具有大量功能,可让您查找、过滤和筛选代码以获取所需内容。以上只是简单介绍。

祝你好运,

特里。

于 2013-10-03T13:43:28.347 回答