Как выполнить проверку

Программирование на Атлантисе (VIP, FCOM, ARD), FastReport

Модераторы: m0p3e, edward_K, Модераторы

Ответить
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Как выполнить проверку

Сообщение galover »

Всем привет, есть в окне интерфейса 2 поля для ввода дат - начала и конца периода. Как запретить пользователю вводить дату начала периода больше чем дата конца, ну или хотя бы выводить соответствующие предупреждение при ошибочном вводе, есть ли какое-то стандартное событие окончания ввода даты в поле, наподобие cmPick? Спасибо!
Deinis
Местный житель
Сообщения: 783
Зарегистрирован: 29 мар 2005, 17:49
Откуда: Москва
Контактная информация:

Сообщение Deinis »

cmCheckField - изменение значения поля. В нем и проверяй соответствие дат и выдавай сообщение.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Странно, но для поля редактирования даты - событие не вызывается :-(
Евгений
Посетитель
Сообщения: 41
Зарегистрирован: 25 авг 2005, 09:50

Сообщение Евгений »

быть не может, это фантастика :eek:

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.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

У меня интерфейс сделан для отчета пользователя. Окно с контролом редактирования даты расположено в том же интерфейсе, где и реализация IUserReport. Т.е. в IUserReport::Run я вызываю окно, и вот в нем событие не приходит :( Не хотелось бы делать отдельный фейс для этого окна
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

странно, но событие уходит в главный обработчик интерфейсов, а не обработчик окна, в котором находится контрол
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

#statusline "statgal"
в проекте попробуйте - сие могет повлиять
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

edward_K
Unfortunally :( Не работает корректно механизм сообщений :( Так и уходит сообщение из окна выше в обработчик интерфейса, скорей всего это связано с механизмом работы пользовательских отчетов. Может еще есть какие фишки?
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

в общем такая проблема, события cmCheck, cmSetDefault уходят на уровень интерфейса, а не обрабатываются на уровне окна. Я бы и рад их там обрабатывать. НО!, вылезает куча проблем, например CurField работает неверно для полей объявленных в окне, возвращает отрицательные числа и проверка вида if(CurField() = #my_window_field) не проходит. #statusline "statgal" ставил и в cfg файле и в сорце интерфейса, не помогает! Что еще можно попробовать???
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение 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
edward_K
Заслуженный деятель интернет-сообщества
Сообщения: 5188
Зарегистрирован: 29 мар 2005, 17:49
Откуда: SPB galaxy spb

Сообщение edward_K »

1. statgal надо писать в первой строке проекта (prj).
2. обычно пишут так
case curfield of
#field1 : {}
#field2 : {}
end;
но у меня несколько case прекрасно работают.
3. событие сие вообще табличное. В окне table указано?
можно попробовать еще в tableevent объявлять.
galover
Местный житель
Сообщения: 794
Зарегистрирован: 16 ноя 2007, 13:52

Сообщение galover »

Спасибо за помощь и советы! :cool: Пока забил правда, а то уже хаками попахивает, вынес все из окна в отдельный фейс, теперь события уже никуда не денутся :) Ну а с case я тоже делал, но не знал как объединить несколько case в один, только сейчас узнал что вот так:

case CurField() of
#field1, #field2 : {}
end;

:eek:
Ответить