![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
OnSetText Глюк или реальность? [D7, MSSQL]
Bless © (2006-09-18 11:22:00)Описание непонятного мне поведения:
есть ADODataSet -> datasource -> dbgrid
dataset настроен на таблицу, у которой есть NOT NULL поле xxx (или поля) и еще какое-нибудь поле без ограничений yyy.
Если попробовать в гриде добавить новую запись, заполнить в этой записи yyy и сделать Post (сдвинувшись на предыдущую запись), то возникает ошибка типа "поле xxx не позволяет Null-значения". Это нормальное поведение.
Если же повесить на field yyy ADODataset-a обработчик OnSetText (с любым содержимым, например просто "//" между begin - end) и проделать все то же самое, то ошибка не выскакивает (правда, и новая запись не добавляется, она просто пропадает)!
Это нормально?
Bless (2006-09-18 12:10:00) [1]
> sniknik © (18.09.06 11:55) [3]
Угу.
Просто сначала, не подсмотрев в DB.pas, я представлял, что это выглядит это приблизительно так:
procedure SetText(value)....
begin
...
if assigned(FOnSetText) then FOnSetText(self, value);
//если value изменилось, то оно будет значение поля,
//если нет, то значением поля будет value переданное в SetText
...
end;
Т.е. я решил, что этот обработчик вызывается внутри метода SetText. А оказалось, что вместо него.
Bless (2006-09-18 12:00:00) [2]Все понял, прошу прощения, все логично.
Отсутствие исключения нормально, т.к. я ничего полю в обработчике не присваивал, а следовательно, вообще новую запись не редактировал, а значит никаких post в базу реально не было.
sniknik (2006-09-18 11:55:00) [3]попробуй вместо //
procedure TForm1.ADODataSet1DSetText(Sender: TField; const Text: String);
begin
Sender.AsString:= Text;
end;
sniknik (2006-09-18 11:48:00) [4]ну ты же подменяеш стандартный обработчик записи значения в поле, чего тогда ждеш исключения если ты сам его не возбуждаеш -> "просто "//" между begin - end"?
а в стандартном оно наверняка есть.
Виталий Панасенко (2006-09-18 11:47:00) [5]А не пробовал тоже самое делать в OnNewRecord ?