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

PowerBuilder (PFC) Crash Referencing Datawindow Property - When TFS Not Pulling Dataobject

使用 PowerBuilder Foundation 类 (PFC) 的人是否遇到过当分配的数据对象丢失时应用程序崩溃(无论是在构建还是开发中)?

我们都经历过动态分配数据对象并且您在预期数据的位置得到空白数据window。这种情况不同,PFC 代码在开发和编译情况下都因空对象引用而崩溃。

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

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

测试用例:

数据window控制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 中与数据相关的每个点符号分配 window 属性.

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

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

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

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

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

试试这个:

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

您会注意到不存在的数据窗口 return 来自 Describe 的空字符串。

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