18.10.2013, 08:49 | #1 |
Участник
|
textChange на форме. Как изменить текст?
Всем добрый день. На форме есть поле типа Range. Нужно из выпадающего списка выбирать значение, оно добавляется к уже существующим в этом поле. Решил улучшить, чтобы между значениями автоматически проставлялась запятая. Перекрыл методы lookup() и textChange() на элементе ppoSlitters. На диалогах RunBase все отлично работает, а вот на форме не хочет, чего-то не хватает. Не подскажите, чего я мог упустить?
X++: public class FormRun extends ObjectRun { Range ppoSlittersBeforeLookup; } public void lookup() { SysTableLookup tableLookup; Query query = new Query(); ; tableLookup = SysTableLookup::newParameters(tableNum(WrkCtrTable), this); tableLookup.addLookupfield(fieldNum(WrkCtrTable, WrkCtrId)); tableLookup.addLookupfield(fieldNum(WrkCtrTable, WrkCtrGroupId)); tableLookup.addLookupfield(fieldNum(WrkCtrTable, Name)); query.addDataSource(tablenum(WrkCtrTable)); tableLookup.parmQuery(query); tableLookup.performFormLookup(); ppoSlittersBeforeLookup = this.text(); } public void textChange() { str text; int pos; ; if (ppoSlittersBeforeLookup) { text = this.text(); if (text) { pos = strscan(text, ppoSlittersBeforeLookup, 1, strlen(text)); if (pos) { text = strins(text, ',', pos + strlen(ppoSlittersBeforeLookup)); } this.text(text); // <-- этот метод почему-то не отрабатывает на форме, но в диалоге все ок this.setSelection(strlen(text), strlen(text)); } ppoSlittersBeforeLookup = ''; } }
__________________
// no comments Последний раз редактировалось dech; 18.10.2013 в 09:14. |
|
18.10.2013, 09:24 | #2 |
Участник
|
Попробуйте перекрыть modified у поля и там пропишите element.redraw();
X++: public boolean modified() { boolean ret; ; ret = super(); element.redraw(); return ret; } |
|
18.10.2013, 10:25 | #3 |
Участник
|
К сожалению, это не то, что мне надо. Я в комментарии указал место, которое не работает. В итоге текст становится пустой строкой и при перерисовке используется уже пустая строка.
__________________
// no comments Последний раз редактировалось dech; 18.10.2013 в 10:27. |
|
18.10.2013, 12:54 | #4 |
Участник
|
А если не this.text(Text), а прям контрол указать ppoSlitters.text(Text) ?
PS: и я super() не увидел в textChange() Последний раз редактировалось Player1; 18.10.2013 в 12:56. |
|
18.10.2013, 13:59 | #5 |
Участник
|
Цитата:
PS: super() здесь не нужен, и даже если его воткнуть, ничего не изменится.
__________________
// no comments |
|
18.10.2013, 19:30 | #6 |
Участник
|
Попробуйте добавить в lookup-метод строку this.replaceOnLookup(false).
|
|
21.10.2013, 09:12 | #7 |
Участник
|
Это учтено изначально и прописано в свойствах элемента.
__________________
// no comments |
|
22.10.2013, 13:37 | #8 |
Участник
|
Ребята, очень срочно нужен ответ, у кого есть свободное время, поэкспериментируйте, пожалуйста! Может это баг аксапты? Версия AX 4.0.
__________________
// no comments |
|
22.10.2013, 13:53 | #9 |
Участник
|
У вас контрол с источником данных не связан? Может быть изменить значение не только в контроле но и в связанном поле источника данных?
|
|
|
За это сообщение автора поблагодарили: db (1), dech (1). |
22.10.2013, 14:10 | #10 |
Роман Долгополов (RDOL)
|
сделал ваш пример на форме - один контрол на дизайне и всё. dax2009 ru8 fp19. запятые подставляются. работает в общем
контрол не связан с источником данных что то вы недоговариваете или всё несколько сложнее кстати текст из контрола правильнее получать через valueStr(). text() может вернуть пусто или не всё - зависит от видимости или активности контрола проверьте связанность с ds проверьте не прыгает ли куда нибудь фокус напишите valueStr вместо text() там где получаете текущее значение |
|
22.10.2013, 14:32 | #11 |
Участник
|
Контрол связан с источником данных. Локальная переменная text принимает верные значения. А через метод valueStr() вроде бы можно только вернуть значение, но не записать... К сожалению DEV-база временно не доступна, как будет возможность - я проверю.
__________________
// no comments |
|
22.10.2013, 14:42 | #12 |
Участник
|
Сделал у себя - в переменную ppoSlittersBeforeLookup ничего не добавляется, получается пустой.
|
|
23.10.2013, 05:12 | #13 |
Участник
|
pasteText()
Добрый день.
Не помню точных подробностей, но помню что метод контрола pasteText() выручал. |
|
24.10.2013, 10:04 | #14 |
Участник
|
Получилось сделать, с небольшим допилом. Если, вдруг, кому захочется руками вводить рабочие центры.
Методы формы. X++: public class FormRun extends ObjectRun { Range ppoSlittersBeforeLookup; boolean lookup; } public void init() { super(); lookup = false; } X++: public boolean modified() { boolean ret; ret = super(); this.textChange(); element.redraw(); lookup = false; return ret; } public void textChange() { str text; int pos; ; if (ppoSlittersBeforeLookup && lookup) { text = this.text(); text = text + ","; ppoSlittersBeforeLookup = text + ppoSlittersBeforeLookup; this.text(ppoSlittersBeforeLookup); ppoSlittersBeforeLookup = ''; } else { ppoSlittersBeforeLookup = this.text(); } } public void lookup() { SysTableLookup tableLookup; Query query = new Query(); ; lookup = true; tableLookup = SysTableLookup::newParameters(tableNum(WrkCtrTable), this); tableLookup.addLookupfield(fieldNum(WrkCtrTable, WrkCtrId)); tableLookup.addLookupfield(fieldNum(WrkCtrTable, WrkCtrGroupId)); tableLookup.addLookupfield(fieldNum(WrkCtrTable, Name)); query.addDataSource(tablenum(WrkCtrTable)); tableLookup.parmQuery(query); tableLookup.performFormLookup(); ppoSlittersBeforeLookup = this.text(); } |
|