Страница 1 из 1

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

Добавлено: 07 май 2008, 18:26
galover
Всем привет, есть в окне интерфейса 2 поля для ввода дат - начала и конца периода. Как запретить пользователю вводить дату начала периода больше чем дата конца, ну или хотя бы выводить соответствующие предупреждение при ошибочном вводе, есть ли какое-то стандартное событие окончания ввода даты в поле, наподобие cmPick? Спасибо!

Добавлено: 08 май 2008, 00:57
Deinis
cmCheckField - изменение значения поля. В нем и проверяй соответствие дат и выдавай сообщение.

Добавлено: 08 май 2008, 15:23
galover
Странно, но для поля редактирования даты - событие не вызывается :-(

Добавлено: 08 май 2008, 16:10
Евгений
быть не может, это фантастика :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.

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

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

:eek: