30.05.2014, 12:29 | #21 |
Участник
|
_control.parentControl() можно реализовать при помощи _control.containerid() или _control.owner()
а _control.fieldBinding().fieldId() через _control.dataField() Последний раз редактировалось S.Kuskov; 30.05.2014 в 12:34. |
|
|
За это сообщение автора поблагодарили: Cardagant (1). |
30.05.2014, 14:38 | #22 |
Участник
|
Проблема получения информации о текущем выбранном поле решалась в утилите FormDigger.
Где же это поле?! (Form digger) Я бы попробовал усовершенствовать эту утилиту и прикрутить историю изменения данных туда. И выложил бы полученный результат на форуме. А то неудобно через паспорт записи все время в журнал базы данных лазить и искать там нужное поле. Но у меня нет мотивации. А вы как раз решаете такую задачу. PS. Человек, написавший эту утилиту, внес вклад в усовершенствование Аксапты сравнимый с вкладом, который внес Бетховен в развитие музыки! Сугубо мое личное мнение Просто я каждый день пользуюсь этой утилитой и слушаю Бетховена. |
|
30.05.2014, 15:18 | #23 |
Участник
|
На мой взгляд топикстартекр решил изобрести велосипед, а мы решили закидать его идеями как можно это сделать.
А сделать это можно многими способами, если только не привязываться к идее сделать это по кнопке. Кто-нибудь видел кнопку которая, скажем, эмулирует нажатие Ctrl+K (Поиск по полю)? Ее нет! И я не совсем понял, эту кнопку которая будет вызывать "велосипед" ее на каждой форме рисовать? Добавить в контектсное меню формы (не контрола) свой пункт меню пока, как я понял, никому не удалось. Кстати пока экспериментировал, обратил внимание на метод \Forms\SysFormSearch\Methods\field - это именно то что нужно, вообще без выкрутасов. Вызывается ядром из метода task с формы, откуда вызвали поиск. Создайте такой метод на Вашей форме, а в \Classes\SysSetupFormRun\task определите сочетание клавиш по которым она будет вызываться. И работать будет на всех формах. |
|
30.05.2014, 16:18 | #24 |
Участник
|
в 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; } |
|
30.05.2014, 16:25 | #25 |
Участник
|
Анализируя 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())); } } |
|
30.05.2014, 19:32 | #26 |
Участник
|
Цитата:
X++: _control.isContainer()
__________________
-Ты в гномиков веришь? -Нет. -А они в тебя верят, смотри, не подведи их. |
|
18.06.2014, 11:36 | #27 |
Участник
|
Цитата:
В итоге получал ошибку: Класс FormControl не содержит эту функцию. Какая есть альтернатива ? Метод selectControl вызывается до открытия формы. Как он определит какой контрол выделен ? Последний раз редактировалось userax2009; 18.06.2014 в 12:28. |
|
19.06.2014, 09:00 | #28 |
Участник
|
Не все контролы на форме, которые могут получить фокус, могут быть связаны с источником данных. Добавьте проверку на существование метода dataField.
|
|
19.06.2014, 10:18 | #29 |
Участник
|
Цитата:
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). |
25.06.2014, 16:04 | #30 |
Участник
|
Обьясните пожалуйста более подробней как это сделать
|
|
25.06.2014, 16:10 | #31 |
Участник
|
Цитата:
Мне же надо что бы по нажатию на любое поле я могу получить его Id. Есть еще какие то варианты ? Возможно я не правильно понял, поэтому у меня не работает. Последний раз редактировалось userax2009; 25.06.2014 в 17:07. |
|
25.06.2014, 16:43 | #32 |
Участник
|
Например, так
X++: public boolean selectControl(FormControl _control) { #GRD_sysDataBaseLogFixStack4Button // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 boolean ret; ; // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 --> // if (GRD_isPkoz()) { //mes = strFMT("%1 : %2", Element.name(), _control.name()); //info::messageWinAddLine(mes); // info::messageWinAddLine( strFMT("%1 : %2 : %3", Element.name(), _control.name(), ret)); /* info::messageWinAddLine( strFMT("%1 : %2 : %3 : %4", this ? this.name() : "", _control ? _control.name() : "", ret, classid2Name(_control ? _control.handle() : 0) )); */ if (_control) { switch (_control.handle()) { case classNum(FormButtonControl) : // button case classNum(FormCommandButtonControl) : // commandButton case classNum(FormFunctionButtonControl) : // menuItem case classNum(FormMenuButtonControl) : // MenuButton if (infolog) { infolog.globalCache().set(#GRD_FixStack4Button, #GRD_FixStack4ButtonMainKey, [ this ? this.name() : "", _control ? _control.name() : "", _control ? _control.id() : 0, ret ]); } break; } } } // GRD_sysDataBaseLogfixStack_pkoz // pkoz 19.05.2011 <-- ret = super(_control); return ret; } |
|
|
За это сообщение автора поблагодарили: S.Kuskov (5). |
25.06.2014, 16:46 | #33 |
Участник
|
если _control.dataField() возвращает ошибку ,значит в этот момент переменная _control указывает не на StatusGroupLine_ZTR, а на какой-то другой контрол (например такой как ButtonControl). Попробуете посмотреть имя контрола _control.name() чтобы убедиться.
|
|
|
За это сообщение автора поблагодарили: userax2009 (1). |
08.07.2014, 10:44 | #34 |
Участник
|
Возможно, я не правильно обьяснил. Сейчас напишу еще более подробно что нужно получить.
Есть форма, скриншот 1. На ней мышкой клацаем на любое поля на нашем гриде. Затем, по нажатию кнопки история, открывается вторая форма(скриншот 2), в которой показывается история поля, выделенного на первой форме. |
|
08.07.2014, 10:50 | #35 |
Участник
|
Если делать для определенного контрола, то проблем нет.
Но для любого не могу придумать как это реализовать. А именно не могу считать код поля таблицы(скриншот 3). Что я делаю не так ??? |
|
08.07.2014, 11:02 | #36 |
Участник
|
|
|
08.07.2014, 11:18 | #37 |
Участник
|
1 скриншот - перекрываю метод init формы, которая вызывается
2 скриншот - метода init датасоурса той же формы |
|
08.07.2014, 11:34 | #38 |
Участник
|
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
|
|
08.07.2014, 17:41 | #39 |
Участник
|
Цитата:
Сообщение от S.Kuskov
Это код на стороне получателя. Готового метода для того чтобы со стороны получателя вытащить номер столбца - нет. Но можно подготовиться и на вызывающей стороне сохранять номер нужного столбца во вспомогательную переменную, к которой потом организовать доступ со стороны получателя. Это понятно? Вот здесь как раз пригодится метод/событие selectControl
if (element.selectedControl() /*&& тут наверное должна еще идти проверка на тип выбранного контрола, как ее реализовать пока что не придумал */) { s = element.selectedControl().name(); // имя активного контрола i = element.selectedControl().id(); } |
|
09.07.2014, 08:41 | #40 |
Участник
|
Я говорил не о свойстве selectedControl а о событии selectControl.
Основная же проблема в вашей ситуации какая? У вас вторая форма вызывается при нажатии кнопки. Нажатие кнопки переводит фокус с колонки таблицы на кнопку! В этот момент пользоваться свойством selectedControl уже поздно. Поэтому предлагается внедрить свой код в событие активации каждого контрола - selectControl, но запоминать там только нужные вам контролы (или не только последний). |
|
|
Опции темы | Поиск в этой теме |
Опции просмотра | |
|