powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глобальная валидация DataWindow
12 сообщений из 12, страница 1 из 1
Глобальная валидация DataWindow
    #37955975
scholar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть довольно большой проект на PB10.5. Возникла необходимость валидации всех вводимых данных.
Некоторые поля в некоторых DW уже валидируются, и эти правила нужно применять после начальной (общей) проверки.
Очень не хочется проходиться по всему коду и в каждом окне вставлять вызов валидирующей функции.
Может быть есть возможность прикрутить эту функцию в одном месте, и после этого каким-то образом (наследование?) указать что во всех DW она должна вызываться неявно.
Буду рад услышать любые советы по этому вопросу.
Заранее спасибо!
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956414
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Примените наследование.

Ваш КО :)
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956454
scholar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо:)
Я так понимаю, вы предлагаете пройтись по исходникам всех окон и заменить
type dw_1 from datawindow within tratata
на
type dw_1 from MyDatawindow within tratata
и в Mydatawindow каким-то образом отслеживать itemchanged?
чем это принципиально отличается от того, чтобы пройтись по всем окнам и вставить в начало itemchanged вызов валидирующей функции?
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956538
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем что при добавлении очередного объекта не надо будет править что-то
Собственно затем оно и нужно :)
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956567
scholar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хорошо, я так понимаю обхода всего кода не избежать.
Но можно ли это сделать как-то гуманно, а не кликать на каждом окне "Edit Source"?
Может в более новых версия ПБ есть функция поиска/замены по исходному коду всей библиотеки?

ПС. И еще вопрос - как реализовать в предке перехват события, а затем отдавать его на обработку наследнику?
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956586
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scholar..валидации всех вводимых данных..
А проверка во всех случаях одинаковая? (верится с трудом)
Если да, то создать объект, который запустить при старте ПО и пусть он контролирует клавиатуру.
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956601
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scholar..как реализовать в предке перехват события, а затем отдавать его на обработку наследнику?
Смотрите Help - "AncestorReturnValue"
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37956632
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я думаю, скорее перехватывать не itemchanged, или вернее не только его
Но лучше не изобретать велосипед, а сделать несколько dw и наследовать от них, а сейчас поправить и перекомпилить
В случае с PFC это всегда так и делается. Даже для очень больших проектов это занимает сравнительно немного времени, а бонусы очевидны
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37958180
scholar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
создать объект, который запустить при старте ПО и пусть он контролирует клавиатуру
Это суровый метод...
Смотрите Help - "AncestorReturnValue"
Спасибо за наводку, сейчас рою документацию, изучаю работу наследования.
сделать несколько dw и наследовать от них
Не нашел возможности наследовать DataWindow. Обычное окно, пользовательский объект - да.
Этого хватает, но есть однин нюанс:
Когда я в предке обрабатываю window.dw_1.itemchanged и возвращаю 1, в потомке ничего не происходит, нужно явно вызывать метод предка через super.
Нельзя ли как-нибудь обойти это? Цель простая - минимизировать количество изменяемого кода.
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37960162
maniac85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scholarНе нашел возможности наследовать DataWindow. Обычное окно, пользовательский объект - да.
там же окно и класс есть standart visual
а там хоть кнобку хоть датавиндоу
Когда я в предке обрабатываю window.dw_1.itemchanged и возвращаю 1, в потомке ничего не происходит, нужно явно вызывать метод предка через super.
Нельзя ли как-нибудь обойти это? Цель простая - минимизировать количество изменяемого кода.все там происходит
хелп чтоли читайте а не ройте

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
ItemChanged event (DataWindows)

Return value 

Set the return code to affect the outcome of the event:

0  (Default) Accept the data value
1  Reject the data value and do not allow focus to change
2  Reject the data value but allow the focus to change
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37960307
maniac85
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чота раньше отправил чем дописал а там и обед внезапно застиг
scholarНе нашел возможности наследовать DataWindow. Обычное окно, пользовательский объект - да.
там же, где окно и класс, есть standart visual
а там хоть кнобку хоть датавиндоу
Когда я в предке обрабатываю window.dw_1.itemchanged и возвращаю 1, в потомке ничего не происходит, нужно явно вызывать метод предка через super.
Нельзя ли как-нибудь обойти это? Цель простая - минимизировать количество изменяемого кода.тут я ерунду написал, коды возврата разумеется на очередность событий не влияют
там галка есть extend ancestor script
хотя по умолчанию она ставится, это ж надо было снять и забыть
...
Рейтинг: 0 / 0
Глобальная валидация DataWindow
    #37967783
scholar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо!
standart visual - то что нужно.
автортам галка есть extend ancestor script
Да, галка есть. Она вставляет в начало метода
Код: sql
1.
call parent::method


Это не совсем то что нужно, т.к. из предка невозможно запретить наследнику обрабатывать событие если валидация провалена и придется в наследнике обрабатывать код возврата.
Решил вопрос следующим образом:
1. Для DW
1.1. Делаю предка DW, в котором конструктор пробегает по всем полям и вставляет для них валидирующее выражение. К счастью, в данном проекте свойство validation используется всего в одном или двух местах и их легко будет переделать на itemchanged. Код конструктора выглядит примерно так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
event constructor;string colname, colvariable, filter
int i, icount
filter = '^[0-9a-zA-ZА-Я]*$'
icount = integer(this.describe('DataWindow.Column.Count'))
FOR i = 1 TO icount
  colvariable = '#'+string(i)+'.name'
  colname = this.describe(colvariable)
  this.modify(colname+'.validation="Match(GetText( ),~''+filter+'~')"')
  this.modify(colname+'.validationmsg="validation works!"')
NEXT
end event


1.2. Прохожу по исходникам всех DW и меняю
Код: sql
1.
type dw_1 from datawindow 


на
Код: sql
1.
type dw_1 from myDatawindow


Поскольку замена простая и безвариантная, ошибок быть не должно.

Минус такого решения в том, что при провале валидации в потомке после вывода соответствующего сообщения, выводится также сообщение предка, заданное свойством validationmsg, но это не критично.
2. Для single line edit
Все то же самое, но имплементирую событие modified. Поскольку нельзя отменить изменения, делаю так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
type variables
string initialvalue = ''
end variables

event modified;string filter;

filter = '^[0-9a-zA-Z]*$'

if not match(this.Text, filter) then
	messagebox('','validation works!',StopSign!)
	this.Text = this.initialvalue
else
	this.initialvalue = this.Text
end if
end event

event constructor;this.initialvalue=this.text
end event



Кто-то знает как сделать поиск/замену в строке по регулярному выражению?
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Глобальная валидация DataWindow
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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