Контроли, FoxPro, Бази даних, статті

Володимир Журавльов, 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

Все – кладіть контрол в грід, чіпляє його до двох полях і текст тестбоксах покаже значення поля.

Взагалі контрол володіє дивовижною властивістю вирішувати купу проблем, пов’язаних з грідом, які по іншому ніяк не вирішуються. Наведені коди бруднуваті, але я сподіваюся, якщо хто ними скористається , Зробить їх такими, якими потрібно.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*