Событие перетаскивания Datawindow не всегда возвращает ссылку на элемент управления в месте размещения - PullRequest
0 голосов
/ 07 марта 2019

Короче говоря, мне нужно основывать поведение некоторых окон на типе объекта, на который упал элемент управления после перетаскивания.Это все хорошо, пока целевой элемент управления в месте назначения является столбцом, но не если это какой-либо другой объект.

Предположим, у меня есть окно данных с двумя столбцами и прямоугольник.Давайте назовем их 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 голосов
/ 11 марта 2019

Используйте функцию GetObjectAtPointer

Это позволит вам точно знать, на какой объект пользователь что-то уронил.

Возвращает строку вида objectname~trow, которую вам нужноразбери, чтобы определить что тебе нужно.

0 голосов
/ 08 марта 2019

Один из подходов заключается в проверке координат 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
...