Datawindow dragdrop事件并不总是在放置位置返回对控件的引用

时间:2019-03-07 14:28:17

标签: powerbuilder datawindow

简而言之,我需要在拖动控件后将某些窗口行为基于控件放到的对象类型。只要目标位置的目标控件是一列即可,这一切都很好,但是如果它是任何其他对象则不是。

假设我有一个包含两列和一个矩形的数据窗口。我们分别称它们为c_1,c_2和r_1。

我将c_1拖放到c_2上:

dwo.name = c_2
dwo.type = column

这很好,而且正是我所期望的行为。

我将c_1拖放到r_1上:

dwo.name = datawindow
dwo.type = datawindow

返回对数据窗口本身的引用。至少在我看来,这个范围太广,无法用作构建有意义的基础。

在测试中,除非它是一列,否则似乎无法使dragdrop在放置位置返回对控件的引用。这是故意的,还是在我的环境中出现问题?如果需要将窗口行为基于dwo.type或dwo.name的值,该如何解决?

2 个答案:

答案 0 :(得分:0)

一种方法是对照数据窗口中的控件数组检查指针的X和Y坐标。

在数据窗口中的事件中,您可以获取如下对象列表:

is_selected_controls = is_null //both of these are string arrays
ls_objects = this.Describe( 'DataWindow.Objects')
ls_objects = ls_objects + '~t'
ll_pos = pos(ls_objects, '~t')
ll_orig_pos = 1

然后遍历数组并获取每个控件的X,W,宽度,高度

DO WHILE ll_pos > 0
    ls_object = mid(ls_objects, ll_orig_pos, ll_pos -ll_orig_pos)
    IF describe(ls_object + '.type') = 'line' THEN
        ls_x = this.Describe(ls_object + '.X1')
        ls_y = this.Describe(ls_object + '.Y1')
        ls_h = this.Describe(ls_object + '.Y2')
        ls_w = this.Describe(ls_object + '.X2')

    ELSE
        ls_x = this.Describe(ls_object + '.X')
        ls_y = this.Describe(ls_object + '.Y')
        ls_h = this.Describe(ls_object + '.height')
        ls_w = this.Describe(ls_object + '.width')
    END IF
    // compare the X,Y of the pointer to control position to see if it's
    // on the control, if it is exit the loop and do whatever...

    ll_orig_pos = ll_pos + 1
    ll_pos = pos(ls_objects, '~t', ll_orig_pos)
LOOP

答案 1 :(得分:0)

使用功能GetObjectAtPointer

它将使您确切地知道用户将对象放置在哪个对象上。

它返回objectname~trow形式的字符串,您必须对其进行解析以识别所需的内容。