Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Действие для всех бъектов формы / 11 сообщений из 11, страница 1 из 1
13.03.2008, 09:13
    #35186913
_Chaynik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
Добрый день! Уважаемые профессионалы, подскажите пожалуйста, как правильно реализовать такую вещь. Есть многостраничная форма с кучей контролов. Надо последовательно проверить корректность их содержимого. То есть для каждого контрола повторяется одно и то же действие. Повторять один и тот же код меняя только объект как то не очень. Как правильно оформить процедуру или класс , который будет проделывать нужные действия или может есть еще какой способ ?
...
Рейтинг: 0 / 0
13.03.2008, 09:21
    #35186929
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
цикл for each для перебора элементов в коллекции
функция pemstatus() для проверки наличия свойств/методов у объектов.

Вот пример рекурсивного обхода всех контролов для изменения размеров шрифта.
thisform.ResizeObject()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
lpara toObj
* Изменение размеров и шрифта объектов формы
* Ориентируемся только по полностью развернотому окну программы
* Считаем, что разработка была под 800x600 со шрифтом  9 
local lnK,loC
lnK = gnDefaultFontSize /  9 

if pemstatus(toObj, 'Top',  5 )
	with toObj
		.top = toObj.top * lnK
		.left = toObj.left * lnK
		.height = toObj.height * lnK
		.width = toObj.Width * lnK
	endwith
endif

if pemstatus(toObj, 'FontSize',  5 )
	toObj.FontSize = round(toObj.FontSize * lnK,  0 )
endif

do case
	case pemstatus(toObj, 'Controls',  5 )
		for each loC in toObj.Controls
			this.ResizeObject(loC)
		endfor
	case pemstatus(toObj, 'Pages',  5 )
		for each loC in toObj.pages
			this.ResizeObject(loC)
		endfor
	case pemstatus(toObj, 'Buttons',  5 )
		for each loC in toObj.Buttons
			this.ResizeObject(loC)
		endfor
endcase

Вызывается thisform.ResizeObject(thisform)
...
Рейтинг: 0 / 0
13.03.2008, 10:17
    #35187067
_Chaynik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
Извиняюсь, изначально неверно описал задачу. Проверять надо не все объекты, только часть из них. Смысл в том, чтобы при внесении данных и нажатии кнопки "сохранить" проверялось заполнение контролов, обязательных для заполнения. Если что-то неправильно, сообщить пользователю и установить фокус на нужный объект. Типа такого

CASE EMPTY(THISFORM.PAGEFRAME.page1.text1.VALUE)=.T.
MESSAGEBOX('Не заполнены обязателные реквизиты',0,'Ошибка')
THISFORM.PAGEFRAME.ACTIVEPAGE = 1
THISFORM.PAGEFRAME.page1.text1.SETFOCUS()
THISFORM.PAGEFRAME.page1.text1.BACKCOLOR= 16744703

Объектов несколько десятков, повторять для каждого одно и то же не хочется. А если сделать для контролов LostFocus + NODEFAULT или Valid + RETURN 0, тоже как-то не то. Вообще, как правильнее это реализовать. Может я делаю совсем не то и не так?
...
Рейтинг: 0 / 0
13.03.2008, 10:52
    #35187199
Kruchinin Pahan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
_ChaynikИзвиняюсь, изначально неверно описал задачу. Проверять надо не все объекты, только часть из них. Смысл в том, чтобы при внесении данных и нажатии кнопки "сохранить" проверялось заполнение контролов, обязательных для заполнения. Если что-то неправильно, сообщить пользователю и установить фокус на нужный объект. Типа такого

CASE EMPTY(THISFORM.PAGEFRAME.page1.text1.VALUE)=.T.
MESSAGEBOX('Не заполнены обязателные реквизиты',0,'Ошибка')
THISFORM.PAGEFRAME.ACTIVEPAGE = 1
THISFORM.PAGEFRAME.page1.text1.SETFOCUS()
THISFORM.PAGEFRAME.page1.text1.BACKCOLOR= 16744703

Объектов несколько десятков, повторять для каждого одно и то же не хочется. А если сделать для контролов LostFocus + NODEFAULT или Valid + RETURN 0, тоже как-то не то. Вообще, как правильнее это реализовать. Может я делаю совсем не то и не так?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
LOCAL loObj
loObj = .NULL.
CASE EMPTY(THISFORM.PAGEFRAME.page1.text1.VALUE)
   loObj = THISFORM.PAGEFRAME.page1.text1
ENDCASE
IF !ISNULL(loObj)
   MESSAGEBOX('Не заполнены обязателные реквизиты', 0 ,'Ошибка')
   THISFORM.PAGEFRAME.ACTIVEPAGE = loObj.Parent.PageOrder
   loObj.SETFOCUS()
   loObj.BACKCOLOR=  16744703 
ENDIF
...
Рейтинг: 0 / 0
13.03.2008, 11:26
    #35187327
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
_ChaynikВообще, как правильнее это реализовать. Может я делаю совсем не то и не так?
Не так. Изначально.

Проверять надо не контролы, а значения .

Как правило, большинство контролов привязаны к полям той или иной таблицы. И совершенно не имеет значения, что отображено в контролах. Принципиально важно, что оказалось записано в поля таблиц-источников. Вот их-то и надо проверять.
...
Рейтинг: 0 / 0
13.03.2008, 11:39
    #35187379
_Chaynik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
ВладимирМ _ChaynikВообще, как правильнее это реализовать. Может я делаю совсем не то и не так?
Не так. Изначально.

Проверять надо не контролы, а значения .

Как правило, большинство контролов привязаны к полям той или иной таблицы. И совершенно не имеет значения, что отображено в контролах. Принципиально важно, что оказалось записано в поля таблиц-источников. Вот их-то и надо проверять.

Немного не понял. Контролы действительно привязаны к полям таблицы. используется буферизация. Если я правильно представляю, в буферизованной таблице при модификации таблицы записи присваивается некий отрицательный номер, который при сбросе буфера заменяется на реальный. Может ли в таких условиях различаться содержимое контрола и поля таблицы ? И как тогда правильно сделать ?

С уважением, _Chaynik
...
Рейтинг: 0 / 0
13.03.2008, 12:00
    #35187470
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
_ChaynikНемного не понял. Контролы действительно привязаны к полям таблицы. используется буферизация. ......
Может ли в таких условиях различаться содержимое контрола и поля таблицы ? И как тогда правильно сделать ?


Обычно делается так

- Создаются ограничения на поля и записи таблицы через PK, CK, FK, Rule, Trigger - это гарантирует непротиворечивость данных на уровне СУБД, при этом не важно как данные попали в таблицу через твой интерфейс или через стороннюю софтину.

- в кнопке сохранить анализируют возврат ф-ии TableUpdate и AERROR после чего выдают "человеческое сообщение" об ошибке
...
Рейтинг: 0 / 0
13.03.2008, 13:39
    #35187933
_Chaynik
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
to PaulWist

Да это все там уже есть, и проверка достоверности и обработка функции AERROR и разбор возвращаемых ошибок. Просто кроме этого хотелось контролировать именно заполнение полей, чтобы юзер не оставлял пустым поле, которое обязательно должно быть заполнено.
...
Рейтинг: 0 / 0
13.03.2008, 14:03
    #35188017
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
_ChaynikПросто кроме этого хотелось контролировать именно заполнение полей, чтобы юзер не оставлял пустым поле, которое обязательно должно быть заполнено.
Простейшее решение: делаешь свой класс на основе TextBox там добавляешь свойство "cEmptyMessage"
тем полям которые необходимо заполнять прописываешь в cEmptyMessage текст сообщения
перед сохранением проверяешь.
Метод формы CheckEmpty()
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
para toObj
local llRet, loC

if pemstatus(toObj, 'cEmptyMessage',  5 ) and !empty(toObj.cEmptyMessage) and empty(toObj.Value)
	MessageBox(toObj.cEmptyMessage,  16 , 'ВНИМАНИЕ')
	toObj.SetFocus()
	llRet = .T.
endif

* Если контейнер - проверка объектов внутри
do case
	case pemstatus(toObj, 'Controls',  5 )
		for each loC in toObj.Controls
			if this.CheckEmpty(loC)
				llRet = .T.
				exit
			endif
		endfor
	case pemstatus(toObj, 'Pages',  5 )
		for each loC in toObj.pages
			if this.CheckEmpty(loC)
				llRet = .T.
				exit
			endif
		endfor
endcase
return llRet

соответственно в кнопке "Сохранить" код
Код: plaintext
1.
2.
3.
if !thisform.CheckEmpty(thisform)
	... код сохранения
	thisform.release()
endif
...
Рейтинг: 0 / 0
13.03.2008, 14:19
    #35188082
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
_Chaynikto PaulWist

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

Ну если всё есть тогда не понятен сам вопрос - зачем проверять заполнение контрола если на уровне данных происходит проверка, или же всё таки чего-то не хватает для того, что бы в БД не попадали незаполненные данные?

2Dima T
Dima T Простейшее решение: делаешь свой класс на основе TextBox там добавляешь свойство "cEmptyMessage"

Это латание дыр, надо "причесать" модель данных, а не пытаться кривость структуры латать интерфейсом.
...
Рейтинг: 0 / 0
13.03.2008, 14:45
    #35188218
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Действие для всех бъектов формы
PaulWist2Dima T
Dima T Простейшее решение: делаешь свой класс на основе TextBox там добавляешь свойство "cEmptyMessage"

Это латание дыр, надо "причесать" модель данных, а не пытаться кривость структуры латать интерфейсом.
Согласен в целом, но есть случаи когда такое решение необходимо. Например SetFocus() по сообщению от БД проблематично делать.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Действие для всех бъектов формы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]