0

当分配的数据对象丢失(在构建或开发中)时,是否有人使用 PowerBuilder 基础类 (PFC) 经历过应用程序崩溃?

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

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

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

测试用例:

Datawindow control 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
4

2 回答 2

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

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

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

于 2017-08-30T21:38:59.590 回答
1

我在 TFS 中经历过同样的行为。我对可以将新对象从 TFS 拉到本地计算机感到满意的唯一方法是手动验证。

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

于 2017-08-30T11:37:50.510 回答