我最近在公司开了一份新工作,我的第一个任务是为他们更新一些相当旧的软件。
有一个很大的背景故事,但基本上该软件是用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
函数的数据列没有排列。
如何更改所选数据库列的顺序的最佳方法是什么?
以下是制表符的截图:
因此,在主程序窗口中,每个选项卡中都有上面的选项卡(输入字段所在的位置),有一个标有ImportClipboard
前缀的数据窗口。
谢谢你的帮助。
答案 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)
很难确定,但我会查看m_dwpaste.m_popup.m_paste.Clicked的代码。更糟糕的情况是dw_detail被硬编码到该脚本中;更好的情况是它有一个更灵活的例程,但不知何故dw_adjustment不适合该算法。
有了新的信息,我们可以看到wf_pastereturn()的代码(我不知道你是如何使用这个脚本的,但这看起来像是罪魁祸首)并不是简单地粘贴,而是做了很多涉及的事情具体领域。实际上,它不仅仅是粘贴,而是导入数据,这意味着它假设剪贴板的内容不仅是特定格式,而且与DataWindow的数据集匹配(请参阅列DW画家中的窗格,注意不要将DataWindow的数据集部分与UI部分混淆)。问题是,你想要:
这些都需要一些不同的解决方案,再加上我在关于制表符与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等)。
该工具具有多种功能,可让您查找,过滤和筛选代码,以获得您所追求的内容。以上只是一个快速介绍。
祝你好运,特里。