|
![]() |
#1 |
Участник
|
Идея проверять на parent правда интересна.
Однако методов X++: _control.parentControl() X++: _control.fieldBinding() Может это решение применимо для 2012й? |
|
![]() |
#2 |
Участник
|
Цитата:
X++: _control.isContainer()
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
![]() |
#3 |
Участник
|
_control.parentControl() можно реализовать при помощи _control.containerid() или _control.owner()
а _control.fieldBinding().fieldId() через _control.dataField() Последний раз редактировалось S.Kuskov; 30.05.2014 в 12:34. |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
![]() |
#4 |
Участник
|
Цитата:
В итоге получал ошибку: Класс FormControl не содержит эту функцию. Какая есть альтернатива ? Метод selectControl вызывается до открытия формы. Как он определит какой контрол выделен ? Последний раз редактировалось userax2009; 18.06.2014 в 12:28. |
|
![]() |
#5 |
Участник
|
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
|
|
![]() |
#6 |
Участник
|
Цитата:
X++: SysDictClass sysDictClass; boolean methodExist; // true FormControl formControl = new FormStringControl(); // false // FormControl formControl = new FormGroupControl(); ; sysDictClass = new SysDictClass(classidget(formControl)); methodExist = sysDictClass.hasObjectMethod(identifierstr(DataField)); info(strfmt('%1', methodExist)); |
|
|
За это сообщение автора поблагодарили: userax2009 (1). |
![]() |
#7 |
Участник
|
Цитата:
Мне же надо что бы по нажатию на любое поле я могу получить его Id. Есть еще какие то варианты ? Возможно я не правильно понял, поэтому у меня не работает. Последний раз редактировалось userax2009; 25.06.2014 в 17:07. |
|
![]() |
#8 |
Участник
|
если _control.dataField() возвращает ошибку ,значит в этот момент переменная _control указывает не на StatusGroupLine_ZTR, а на какой-то другой контрол (например такой как ButtonControl). Попробуете посмотреть имя контрола _control.name() чтобы убедиться.
|
|
|
За это сообщение автора поблагодарили: userax2009 (1). |
![]() |
#9 |
Участник
|
Проблема получения информации о текущем выбранном поле решалась в утилите FormDigger.
Где же это поле?! (Form digger) Я бы попробовал усовершенствовать эту утилиту и прикрутить историю изменения данных туда. И выложил бы полученный результат на форуме. А то неудобно через паспорт записи все время в журнал базы данных лазить и искать там нужное поле. Но у меня нет мотивации. А вы как раз решаете такую задачу. PS. Человек, написавший эту утилиту, внес вклад в усовершенствование Аксапты сравнимый с вкладом, который внес Бетховен в развитие музыки! Сугубо мое личное мнение ![]() |
|
![]() |
#10 |
Участник
|
На мой взгляд топикстартекр решил изобрести велосипед, а мы решили закидать его идеями как можно это сделать.
А сделать это можно многими способами, если только не привязываться к идее сделать это по кнопке. Кто-нибудь видел кнопку которая, скажем, эмулирует нажатие Ctrl+K (Поиск по полю)? Ее нет! И я не совсем понял, эту кнопку которая будет вызывать "велосипед" ее на каждой форме рисовать? Добавить в контектсное меню формы (не контрола) свой пункт меню пока, как я понял, никому не удалось. Кстати пока экспериментировал, обратил внимание на метод \Forms\SysFormSearch\Methods\field - это именно то что нужно, вообще без выкрутасов. Вызывается ядром из метода task с формы, откуда вызвали поиск. Создайте такой метод на Вашей форме, а в \Classes\SysSetupFormRun\task определите сочетание клавиш по которым она будет вызываться. И работать будет на всех формах. |
|
![]() |
#11 |
Участник
|
в FormDigger эта задача элегантно решается вставкой всего одной строки кода в класс SysSetupFormRun. То есть стандартное приложение модифицируется минимально.
В методе task() просто не вызывается super(), если нажата сокровенная комбинация клавиш. X++: //EVO: 31.01.09 #DEV02 Find from control by name --> if (!FormDigger::overloadButton(this, _taskId)) //EVO: 31.01.09 #DEV02 Find from control by name <-- ret = super(_taskId); X++: static boolean overloadButton(FormRun _formRun, int _taskId) { #define.VK_OEM_3(0xC0)// ~ #define.VK_OEM_F12(123) #Task boolean ret = true; Object obj; int i; ; if (_taskId != #taskAlt) return false; switch (true) { case FormDigger::getAsyncKeyState(#VK_OEM_3) > 1: ret = FormDigger::newForm(_formRun); break; case FormDigger::getAsyncKeyState(#VK_OEM_F12) > 1: if (formHasMethod(_formRun, identifierStr(altF12))) { obj = _formRun; obj.altF12(); ret = true; } break; default: ret = false; } return ret; } |
|
![]() |
#12 |
Участник
|
Анализируя FormDigger, понимаем, как дойти до выбранного поля в форме, на которой нажали комбинацию клавиш. В element.args().caller находится ссылка на исходную форму
X++: void selectCurrent() { FormControl currentControl; ; currentControl = element.args().caller().selectedControl(); if (element.args()) { element.args().lookupField(fieldnum(FormDiggerTmpData, id)); element.args().lookupValue(int2str(currentControl.id())); } } |
|
![]() |
#13 |
Участник
|
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
|
|
![]() |
#14 |
Участник
|
Цитата:
Сообщение от S.Kuskov
![]() Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
if (element.selectedControl() /*&& тут наверное должна еще идти проверка на тип выбранного контрола, как ее реализовать пока что не придумал */) { s = element.selectedControl().name(); // имя активного контрола i = element.selectedControl().id(); } |
|
![]() |
#15 |
Участник
|
Я говорил не о свойстве selectedControl а о событии selectControl.
Основная же проблема в вашей ситуации какая? У вас вторая форма вызывается при нажатии кнопки. Нажатие кнопки переводит фокус с колонки таблицы на кнопку! В этот момент пользоваться свойством selectedControl уже поздно. Поэтому предлагается внедрить свой код в событие активации каждого контрола - selectControl, но запоминать там только нужные вам контролы (или не только последний). |
|