| Контролы Владимир    Журавлев, 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 yi12
=messagebox('Неверный месяц','Предупреждение ')
Return 0
Endif
************************************
If dd=0
=messagebox('Неверный день ','Предупреждение')
Return 0
Endif
******************************
If mm0
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  Все - кладите контрол в    грид, цепляейте его к двум полям и текст тестбоксах покажет значения поля.  Вообще контрол обладает    удивительным свойством решать кучу проблем, связанных с гридом, которые по другому    никак не решаются. Приведенные коды грязноваты, но я надеюсь, если кто ими воспользуется    , сделает их такими, какими нужно. 
 |