![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно обработать onValidate? [D6, FireBird]
Fom © (2004-02-04 10:30:00)
Мастаки, помогите...
Делаю проверку на вводимое значение для числового поля в событии
OnValidate:
...
begin
if GoodValue(Sender.AsFloat) <> 0 then
begin
ShowMessage("Bad value!");
Sender.Value := Sender.OldValue;
fMain.dbeLT.SetFocus;
end;
end;
...
Но такой код не верно работает, почему-то Sender.OldValue - это новое а не старое, но даже если и было оно новвым, то такая обработка зацикливается... Как правильно сделать?
Deniz (2004-02-04 14:12:00) [1]
Query1.CachedUpdates = True
procedure TForm1.Query1SIZESetText(Sender: TField; const Text: String);
var i : integer;
begin
i:=StrToInt(Text);
if i > 100 then
Sender.AsInteger:=Sender.OldValue;
else Sender.AsInteger:=i;
end;
Sandman25 (2004-02-04 11:38:00) [2]
[10] Fom (04.02.04 11:33)
Это уже проблемы программной логики и взаимозависимостей. Либо решайте ее, либо вообще откажитесь от идеи проверки непосредственно при вводе и проверяйте все в BeforePost
Fom (2004-02-04 11:33:00) [3]
Так и сделал, но при попытке перейти к какому-то третьему полю ввода или отменить(Cancel). все время выскакивает сообщение обработки OnEnter поля, которое зависит от ввода в другом поле...
Sandman25 (2004-02-04 11:28:00) [4]
Для этого лучше вводить данные в отдельной форме и при попытке войти в Edit (OnEnter) отправлять на другой Edit (SetFocus).
Для грида можно попытаться не пускать в колонку (OnColEnter)
Fom (2004-02-04 11:25:00) [5]
Ок. Спасибо за советы...
Еще тогда один трабл, как сделать, чтобы нельзя было вводить данные в поле, если не введены данные, в какое-то другое поле?
Sandman25 (2004-02-04 11:16:00) [6]
[6] Fom (04.02.04 11:13)
Напишите своего наследника TxxxField, у которого все это будет реализовано "внутри". И гемора не будет :)
Кстати, не забудьте о параметрах события OnValidate - может, получится объединить несколько обработчиков.
Fom (2004-02-04 11:13:00) [7]
ну и гемор, млин...
Mike Kouzmine (2004-02-04 11:05:00) [8]
BtforeEdit - запоминаешь, надо меняешь. Еще есть методы.
Sandman25 (2004-02-04 11:04:00) [9]
Можно.
1. После Cancel сразу вызвать Edit.
2. В BeforeEdit запоминаете старые значения всех полей.
В OnValidate восстанавливаете только то, что нужно восстановить.
Fom (2004-02-04 11:03:00) [10]
А нельзя остаться в режиме редактирования, но с со старым значением?
Sandman25 (2004-02-04 10:59:00) [11]
Dataset.Cancel
Fom (2004-02-04 10:46:00) [12]
Ну что ж, что-то у меня получилось :)
...
begin
if GoodValue(Sender.AsFloat) <> 0 then
raise Exception.Create("Bad value!");
end;
...
Но в поле ввода остается новое значение, как вернуть старое?