Форум » GUI » TextBox » Ответить

TextBox

Vlad04: TextBox Свойство - InputMask имеется три поля ( тип паспорта, серия , номер) Необходимо динамически менять маску полей - серия и номер в зависимости от значения поля - тип паспорта. Попробовал - напрямую не приваевается, через SetProperty(.. ) то же не устанавливается

Ответов - 18

Vlad04: Не понял? То ли все ещё отдыхают, то ли слишком "трудный" вопрос - ни одного ответа. Вообще-то - обычная ситуация. В консоле(Харбор) - давно всё было сделано и работало.

Andrey: Vlad04 пишет: То ли все ещё отдыхают, то ли слишком "трудный" вопрос - ни одного ответа. Все отдыхают... Давай код, а то догадываться как то сложновато после праздников...

Vlad04: ********************************* Proc PassMask() Local sType:=Rtrim(Pacient.BtnTextBox_Doc_Type.Value) Local m8:={},m9:={},m10:={},nPos:=0,sMask:='' // ,Nm_Get:=gNam[pPer] // вид док серия номер AADD(m8,'1') ;AADD(m9,'A-AA') ; AADD(m10,'999999') AADD(m8,'2') ;AADD(m9,'99') ; AADD(m10,'9999999') AADD(m8,'3') ;AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'4') ;AADD(m9,'AA') ; AADD(m10,'999999') AADD(m8,'5') ;AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'6') ;AADD(m9,'AA') ; AADD(m10,'999999') AADD(m8,'7') ;AADD(m9,'AA') ; AADD(m10,'9999999') AADD(m8,'8') ;AADD(m9,'99') ; AADD(m10,'9999999') AADD(m8,'9') ;AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'10');AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'11');AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'12');AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'13');AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') AADD(m8,'14');AADD(m9,'99 99') ; AADD(m10,'9999999') AADD(m8,'15');AADD(m9,'99') ; AADD(m10,'9999999') AADD(m8,'16');AADD(m9,'AA') ; AADD(m10,'9999999') AADD(m8,'17');AADD(m9,'AA') ; AADD(m10,'9999999') AADD(m8,'18');AADD(m9,'XXXXXXXX'); AADD(m10,'XXXXXXXX') nPos:=ASCAN(m8,sType) //MsgDebug('nPos=',nPos) sMask :=GetProperty( 'PACIENT', "TEXT_DOC_NUM", 'INPUTMASK') //MsgDebug('Do sMask=',sMask) if nPos > 0 // Pacient.Text_DOC_SER.Picture:=m9[nPos] // Pacient.Text_DOC_NUM.Picture:=m10[nPos] SetProperty( 'PACIENT', "TEXT_DOC_SER", 'INPUTMASK' ,m9[nPos]) // маска SetProperty( 'PACIENT', "TEXT_DOC_NUM", 'INPUTMASK' ,m10[nPos]) // маска ////.. Pacient.Text_DOC_SER.INPUTMASK:= m9[nPos] //// Pacient.Text_DOC_NUM.INPUTMASK:= m10[nPos] else // Pacient.GetBox_1.Value:='' // Pacient.GetBox_2.Value:='' Pacient.Text_DOC_SER.Value:='' Pacient.Text_DOC_NUM.Value:='' endif //sMask :=GetProperty( 'PACIENT', "TEXT_DOC_NUM", 'INPUTMASK') //MsgDebug('Posle sMask=',sMask) Return Функция PassMask() вызывается при выходе из поля тип документа и по идее должна присвоить новую маску для полей серия и номер Но не присваивает. Пробовал GetBox - там другая засада, но об этом позже

Andrey: Не такой код не пойдёт. Нужен отдельный самодостаточный пример, тогда что-то можно посмотреть. Т.е. нарисуй форму и то что нужно, и выкладывай здесь...

Vlad04: Сделаю, но дело не в примере.

SergKis: Vlad04 пишет но дело не в примере i_textbox.ch содержит на DFINE TEXTBOX 3-и варианта _DefineTextBox(...) _DefineMaskedTextBox (...) _DefineCharMaskTextBox (...) думаю тут @ порылась, скорее всего динамически не работает (сам работаю без textbox-а) Можно сделать нужное кол-во (с масками) textbox, сделать их hide и нужный открывать

Петр: InputMask (D) Specifies the edit mask for a TextBox control D: Available at control definition only Почитайте справку (заодно разницу между InputMask String и Format String м.б. уловите) кроме того.. Pacient.Text_DOC_SER.INPUTMASK:= m9[nPos] - ну не пошло же Зачем себя обманывать с SetProperty( 'PACIENT', "TEXT_DOC_SER", 'INPUTMASK' ,m9[nPos]) SetProperty, к сожалению, не генерирует ошибок времени исполнения.

Vlad04: Грустно. У меня всё это еще на Клиппере работало. Можно сделать нужное кол-во Не выход.В данном случае 10 видов каждого поля. А REdefine не поможет ? Только не знаю, как правильно написать

Петр: Vlad04 пишет: А REdefine не поможет ? Только не знаю, как правильно написать Без разницы, но поскольку redefine - это команда препроцессора, то правильнее всего написать в upper case: REDEFINE Это шутка, конечно же. Посмотрите MiniGUI\SAMPLES\BASIC\ShowPassword\demo.prg - м.б. такая техника вам подойдет (имеется ввиду удаление и создание нового контрола)

Vlad04: Петр Спасибо! Вполне, кода немного.

SergKis: Vlad04 пишет Вполне, кода немного. Это обманчиво. На 10 видов будет много. Если следующий textbox будете делать от предыдущего, то что будете делать, при возврате на вышестоящий и изменении его на другой (сколько то нижних уже есть) ? Может свести к списку документов (набор texbox мах определенных) и плясать от него.

Петр: SergKis пишет: Это обманчиво. На 10 видов будет много. Не больше, чем существует сейчас - если я правильно понял, полей всего 3, переопределять нужно только 2. Масок м.б. хоть сто, а не только 10, существенно это ни на что не влияет. Массивы m8-m10 можно сделать статическими (публичными), зачем их каждый раз пересоздавать.

SergKis: Петр пишет если я правильно понял, полей всего 3, переопределять нужно только 2. Если бы, то 2 штуки несложно SergKis пишет сделать их hide и нужный открывать Vlad04 отвечает Не выход.В данном случае 10 видов каждого поля. т.е. кроме 2-х показанных в тексте примера, есть еще как мин. 8 плавающих. По мне "хрен редьки не слаще", что создавать 10 от предыдущих (c учетом прыгалки мышой и исправлении зачения удаления и пересоздание от нового значения), что заранее создать (от документов ~ 10 вариантов). Или не так понимаю потребности Vlad04

Vlad04: Сейчас тестирую. Конечно, это костыль любой вариант. И ещё вопрос. h_textbox.prg Public &mVar. := k ... _HMG_aControlInputMask [k] := "" ... А нельзя ли как- нибудь обратиться к внутренней переменной, определяющей нужные свойства Контрола?

SergKis: Vlad04 пишет А нельзя ли как- нибудь обратиться к внутренней переменной, определяющей нужные свойства Контрола If ( i := GetControlIndex(cControlName, cForm) ) > 0 cMask := _HMG_aControlInputMask[ i ] EndIf или If ( i := Form_1.Control_5.Index ) > 0 cMask := _HMG_aControlInputMask[ i ] EndIf Vlad04 пишет Конечно, это костыль любой вариант. Меня смущает перенос технологии Clipper - одно окно -> 18 вариантов документов (серия, номер) в Gui как есть. Может стоит сделать список из 18 документов и формировать окна (cForm := 'Dok_1', ..., 'Dok_18'). От массивов или прямыми DEFINE TEXBOX ... (через IDE) создавать окна для работы с док. Можно работать хоть с несколькими окнами одновременно.

Vlad04: Пример Вот как-то так на примере. Но, есть другие вопросы ( это не связано с переназначением маски) - как-то непонятно , если надо вводить все символы ХХХ.. Если ставишь АА, то разрешает только буквы - ограничение длины MaxLength не работает

Vlad04: SergKis Может стоит сделать список из 18 документов и формировать окна У меня сложная форма, много элементов, а документы- 2 поля с переменной маской, маленькая часть всего. cMask := _HMG_aControlInputMask[ i ] Это мы маску прочитали, а присвоить новую _HMG_aControlInputMask[ i ] :=cMask

Vlad04: SergKis Все оК! Еще короче и проще. Может быть , это и неправильно сточки зрения "ВЫСОКИХ МАТЕРИЙ", но все работает



полная версия страницы