简而言之,我需要在拖动控件后将某些窗口行为基于控件放到的对象类型。只要目标位置的目标控件是一列即可,这一切都很好,但是如果它是任何其他对象则不是。
假设我有一个包含两列和一个矩形的数据窗口。我们分别称它们为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的值,该如何解决?
答案 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
形式的字符串,您必须对其进行解析以识别所需的内容。