Страница 1 из 1
Как выполнить проверку
Добавлено: 07 май 2008, 18:26
galover
Всем привет, есть в окне интерфейса 2 поля для ввода дат - начала и конца периода. Как запретить пользователю вводить дату начала периода больше чем дата конца, ну или хотя бы выводить соответствующие предупреждение при ошибочном вводе, есть ли какое-то стандартное событие окончания ввода даты в поле, наподобие cmPick? Спасибо!
Добавлено: 08 май 2008, 00:57
Deinis
cmCheckField - изменение значения поля. В нем и проверяй соответствие дат и выдавай сообщение.
Добавлено: 08 май 2008, 15:23
galover
Странно, но для поля редактирования даты - событие не вызывается
Добавлено: 08 май 2008, 16:10
Евгений
быть не может, это фантастика
cmCheckField - событие возникает, после модификации.
Код: Выделить всё
Interface TestDt;
var
DtBeg, DtEnd: Date;
view as select * from kated;
Screen Scr;
Fields
DtBeg: NoProtect;
DtEnd: NoProtect;
<<
.@@@@@@@@@@ .@@@@@@@@@@
>>
end;
HandleEvent
cmCheckField:
{
if (DtBeg > DtEnd)
Message('Начальная дата больше конечной даты!')
}
cmInit:
{
DtBeg := Date(01,01,2007);
DtEnd := Date(02,01,2007);
}
end;
end.
Добавлено: 08 май 2008, 16:25
galover
У меня интерфейс сделан для отчета пользователя. Окно с контролом редактирования даты расположено в том же интерфейсе, где и реализация IUserReport. Т.е. в IUserReport::Run я вызываю окно, и вот в нем событие не приходит
Не хотелось бы делать отдельный фейс для этого окна
Добавлено: 08 май 2008, 17:09
galover
странно, но событие уходит в главный обработчик интерфейсов, а не обработчик окна, в котором находится контрол
Добавлено: 09 май 2008, 13:08
edward_K
#statusline "statgal"
в проекте попробуйте - сие могет повлиять
Добавлено: 12 май 2008, 12:54
galover
edward_K
Unfortunally
Не работает корректно механизм сообщений
Так и уходит сообщение из окна выше в обработчик интерфейса, скорей всего это связано с механизмом работы пользовательских отчетов. Может еще есть какие фишки?
Добавлено: 12 май 2008, 17:59
galover
в общем такая проблема, события cmCheck, cmSetDefault уходят на уровень интерфейса, а не обрабатываются на уровне окна. Я бы и рад их там обрабатывать. НО!, вылезает куча проблем, например CurField работает неверно для полей объявленных в окне, возвращает отрицательные числа и проверка вида if(CurField() = #my_window_field) не проходит. #statusline "statgal" ставил и в cfg файле и в сорце интерфейса, не помогает! Что еще можно попробовать???
Добавлено: 12 май 2008, 18:49
galover
Выше постом я чуток прогнал. Вылезла интересная особенность! CurField() нельзя кэшировать! Т.е. взять один раз, записать в переменную и затем сравнивать с константами вроде #field1 и #field2. Т.е., вот так неправильно
var _field : integer;
//---------------------------------
handleEvent
cmPick:
{
_field = CurField();
if (_field = #field1 or _field = #field2)
}
а правильно только так
handleEvent
cmPick: if (CurField() = #field1 or CurField2() = #field2)
сурово!
но как же быть с событиями, вылетающими за пределы окна. Такое ощущение, что окно становится неактивным в какой-то момент и событие уходит выше. Sucks
Добавлено: 12 май 2008, 21:56
edward_K
1. statgal надо писать в первой строке проекта (prj).
2. обычно пишут так
case curfield of
#field1 : {}
#field2 : {}
end;
но у меня несколько case прекрасно работают.
3. событие сие вообще табличное. В окне table указано?
можно попробовать еще в tableevent объявлять.
Добавлено: 13 май 2008, 10:58
galover
Спасибо за помощь и советы!
Пока забил правда, а то уже хаками попахивает, вынес все из окна в отдельный фейс, теперь события уже никуда не денутся
Ну а с case я тоже делал, но не знал как объединить несколько case в один, только сейчас узнал что вот так:
case CurField() of
#field1, #field2 : {}
end;