InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Контролы


Владимир Журавлев, http://nsvisual.com


Контролы являются далеко не самыми часто используемыми компонентами Фокса.
Вот что могу посоветовать по их использованию
Пусть у нас есть поле типа Date . Вводим неправильную дату. Идет сообщение на Английском, по поводу которого ольшинство Русскоязычных пользователей возражают.
Использование Set Notify off убирает сообщение , но не позволяет ничего сделать в Valid. Обычным решением является использование текстовой коробки с форматом даты.
Но в этом случае приходится использовать двойную конвертацию из даты и назад и не удается использовать замечательное свойство привязки к данным-controlsource. Обработку ошибок в этом случае помещают в interactivechange или keypress Вот какой предлагается рецепт.
Сделаем контрол с двумя текстовыми коробками-видимой и невидимой. Заведем контролу свойство-controlsorce. В событи Init напишем:

set notify off

this.text1.controlsource=this.controlsource

this.text1.width=this.width

this.text2.width=this.width

this.text2.value=dtoc(this.text1.value)

Its refresh event has code

this.text2.value=dtoc(this.text1.value)
Формат видимой коробки - DMY Первоначальное значение Dateformat-D
В valid запишем:
Local oo

If type('this.value')='C' and this.format='D'

If len(alltrim(substr(this.value,7,4)))=2

yi=int(val(alltrim(substr(this.value,7,4))))

If yi<90

This.value=alltrim(stuff(this.value,7,2,'20'))+alltrim(str(yi))

Else

This.value=alltrim(stuff(this.value,7,2,'19'))+alltrim(str(yi))

Endif

Endif

oo=this.value

IF EMPTY(ALLTRIM(substr(oo,7,4))) AND EMPTY(ALLTRIM(SUBSTR(oo,4,2))) AND

EMPTY(ALLTRIM(substr(oo,1,2)))

this.parent.text1.value=ctod(this.value)



Return 1

Endif

Local dd, mm,yy,nn, local k

Dimension nn[12]

nn[1]=31

nn[2]=28

nn[3]=31

nn[4]=30

nn[5]=31

nn[6]=30

nn[7]=31

nn[8]=31

nn[9]=30

nn[10]=31

nn[11]=30

nn[12]=31

yy=val(substr(oo,7,4))



If (len( alltrim(substr(oo,7,4)))!=4 or yy=0 )

=messagebox('Неверный год ','Предупреждение)

Return 0

Endif





mm=val(substr(oo,4,2))

dd=val(substr(oo,1,2))

*******************************

If mm=0 or mm>12

=messagebox('Неверный месяц','Предупреждение ')

Return 0

Endif

************************************

If dd=0

=messagebox('Неверный день ','Предупреждение')

Return 0

Endif

******************************

If mm<=12 and mm>0

k=yy-4*int(yy/4)

If k!=0 and dd>nn[mm]

=messagebox('Неверный день ','Предупреждение')



Return 0



Endif

If k=0 and dd>nn[mm] and mm!=2

=messagebox('Неверный день ','Предупреждение')



Return 0

Endif

If k=0 and dd>nn[mm] and mm!=2

=messagebox('Неверный день ','Предупреждение')



Return 0

Endif

If k=0 and dd>nn[mm]+1 and mm=2

=messagebox('Wrong day ','Alarm')

Return 0

Endif

Endif

Endif

this.parent.text1.value=ctod(this.value)

return 1
Теперь смело можем класть контрол на формы , присваивать его controlsource нужным полям и все будет говорить по Русски. Как это работает?
Невидимый текст2 на самом деле привязывается к данным, а видимый все отражает.

Цветная кнопка и кнопка с картинкой


Вы наверное замечали, что в кнопках нельзя изменять цвет. Еще есть другая проблема:
Если поместить в грид в непервую его колонку картинку, а в ее click какой нибудь код, то он сплошь и рядом не сработает.
Думаю, здесь что то с координатами. Картинка просто толком не может понять, когда в нее тыкаются мышью, а кнопка может. Таким образом напрашивается на базе контрола сделать кнопку с настраиваемым цветом и кнопку с изменяющимися картинками , которую можно класть в грид с любым кодом.
Итак сделаем контрол -цветную кнопку и заведем в нем свойство caption , notsiz ( определяет, будем ли масштабировать кнопку), и метод set selcolor

this.label1.forecolor=rgb(0,0,255)

this.specialeffect=1

Init event has the following code

This.label1.forecolor=this.forecolor

This.label1.backcolor=this.backcolor

If not empty(this.caption)

This.label1.caption=alltrim(this.caption)

This.label1.top=2+int((this.height-20)/2)

If not this.notsiz

This.width=int(this.label1.FontSize*TXTWIDTH(alltrim(this.label1.caption),this.label1.FontName,this.label1.FontSize ))+1

Endif

Endif

*!* this.width=this.label1.width+1

This.command1.width=this.width-3

This.command1.height=this.height-2

This.refresh


Метод Click
this.parent.click
Теперь , если контрол положить на экран и задать его backcolor и caption, он их отобразить. Изменнение Sinked по нажатию кнопки дает эффект ее утопления и поднятия .
Контрол для грида имеет внутри кнопку со стилем-невидимости ( не установка visible=.f.) а именно стиля. Click кнопки имеет код - this.parent.click

Две картинки


Заведем контролу два свойства picture1, picture2 Init контрола присваивает из этих свойств свойства картинок. Заведем теперь метод переключения видимой картинки и смело можно класть контрол в грид Я обычно кладу в грид два разных контрола , и переключаю их с помощью setall dynamiccurrentcontrol Итого получается уже четыре возможности показать разные картинки-открытые и закрытые папки, доступные и недоступные кнопки.

Vaszil Besneyee поставил задачу показать в гриде чекбокс, чей текст зависит от одного поля таблицы, а статус от другого.

Я предложил следующее решение. Заведем контрол и положим туда чекбокс с пустым caption Добавим туда текстовую коробку рид онли. Заведем в контроле два свойства- controlsource, и controlsource1 В Init контрола присвоим эти свойства controlsource чекбокса и текстовой коробки.

this.check1.controlsource=this.controlsource this.text1.controlsource=this.controlsource1

Все - кладите контрол в грид, цепляейте его к двум полям и текст тестбоксах покажет значения поля.

Вообще контрол обладает удивительным свойством решать кучу проблем, связанных с гридом, которые по другому никак не решаются. Приведенные коды грязноваты, но я надеюсь, если кто ими воспользуется , сделает их такими, какими нужно.


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua