PowerBuilder(PFC)崩溃引用数据窗口属性 - 当TFS未拉动数据对象时

时间:2017-08-29 21:38:28

标签: tfs powerbuilder powerbuilder-pfc

有没有人使用PowerBuilder Foundation Classes(PFC)在分配的数据对象丢失时(在构建或开发中)遇到应用程序崩溃?

我们在动态分配数据对象时遇到了所有经历,并且您获得了预期数据的空白数据窗口。这种情况不同,PFC代码在开发和编译的情况下都与空对象引用崩溃。

当一个全新的数据对象被添加到窗口时出现这种情况,但由于某种原因,TFS无法将新对象下拉到构建机器。我不知道是不是我们的建筑人不知道他们在做什么,或TFS失败 - 倾向于后者。这是另一个问题 - 如果有人知道解决方案,我们将非常感激。

由于当分配给数据窗口控件的数据对象丢失时PFC在许多地方崩溃 - 我倾向于认为有人通过修复PFC解决了这个问题。

测试用例:

数据窗口控件dw_1 Dataobject dw_new_dataobject是全新的,我们的构建者没有它 代码看起来像dw_1.dataobject =' dw_new_dataobject' (不是动态分配)

我们尝试了什么?

我们尝试过IsNull(idw_requestor.object.datawindow.help.command)或IsNull(idw_requestor.object.datawindow)但没有运气。即使这确实有效,我们也需要在PFC中包含与datawindow属性相关的每个点符号赋值。

我应该知道如何解决这个问题但是要画一个空白。是否有一个简单的编码检查,我们可以用来验证构建中是否存在已分配的数据对象,如果不能正常处理问题?

理想情况下就像这样的伪代码:

If dw_1.databoject = 'dw_new_object' And 
   'dw_new_object' is nowhere to be found Then
   // handle somewhat gracefully and kill the app
End If

对象:pfc_n_cst_dwsrv_sort 错误:对象的函数of_setstyle中的空对象引用...

PFC代码(许多失败点之一):

// Check to see if the passed style number is valid.
IF IsNull(ai_style) THEN 
    Return -1
End If

CHOOSE CASE ai_style
    CASE DEFAULT, DRAGDROP, SIMPLE, DROPDOWNLISTBOX
        ii_style = ai_style

        if ii_style = DEFAULT then
            if isValid (idw_requestor) then
                if len (idw_requestor.dataobject) > 0 then
                    // NULL OBJECT REFERENCE LINE BELOW when dataobject gone
                    idw_requestor.object.datawindow.help.command = 1
                    idw_requestor.object.datawindow.help.file = "pfcdlg.hlp"
                    idw_requestor.object.datawindow.help.typeid.setsort = "1200"                    idw_requestor.object.datawindow.help.typeid.setsortexpr = "800"
                end if
            end if
        end if
    Return 1
END CHOOSE

2 个答案:

答案 0 :(得分:2)

试试这个:

string ls_rc
datastore lds_test

lds_test = create datastore

lds_test.dataobject = "ThisIsReallyNotDatawindowName"
ls_rc = lds_test.Describe("DataWindow.Column.Count") // Returns ""
ls_rc = lds_test.Describe("DataWindow.Color") // Returns ""

lds_test.dataobject = "dw_import" // Use the name of an existing datawindow.
ls_rc = lds_test.Describe("DataWindow.Column.Count") // Returns arbitrary number
ls_rc = lds_test.Describe("DataWindow.Color") // Returns arbitrary number

destroy lds_test

您会注意到不存在的数据窗口会从Describe中返回一个空字符串。

描述现有数据窗口返回列数和颜色的数值。

答案 1 :(得分:1)

我在TFS中遇到过同样的行为。我唯一能够将新对象从TFS拉到我的本地机器的方法是手动验证。

我们使用的过程是在将新对象添加到源控件时通知所有团队成员(这是创建新对象的开发人员的责任)。
然后我会从TFS刷新我的工作区,然后转到添加到的每个pbl 如果对象丢失,我会手动创建一个相同类型的“stub”对象(datawindow对象,nvo等),然后再次刷新。这通常会将源从TFS拉到我的本地机器。