![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Глюк в ДБГрид. [D7, XP]
drink © (2006-02-07 22:44:00)Глюк в DBGrid. Доброе время суток, всем. У меня такая проблема, при редактировании данных в ДБГрид, если фокус ввода переместился и там данные не изменялись, то данные не изменяются и диалоговое окно не вылетает, как - будто таблица не изменялась. У меня при закрытии окна вылетает диалоговое окно, ну типа сохранить изменения или нет. Может кто-нибудь встречался с подобной проблемой, объясните, как исправить?
Это процедура закрытия окна.
procedure TForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin
if DataModule1.ADOTable.Modified then
case Application.MessageBox(PChar(
Сохранить изменения в документе ?)
,'Внимание',MB_YESNOCANCELMB_ICONEXCLAMATION)of
id_YES:
begin
DataModule1.ADOTable.Post;
end;
id_NO:
begin
DataModule1.ADOTable.Cancel;
end;
id_CANCEL:CanClose:=false;
end;
end;
end;
Зарание спасибо
drink (2006-02-11 10:27:00) [1]thenks
ЮЮ (2006-02-11 08:10:00) [2]Поставить такой же "дикий" обработчик на DataSet.BeforeScroll:
if DataModule1.TownTable.State in [dsEdit,dsInsert] then
case Application.MessageBox(PChar(
'Сохранить изменения в документе?')
,'Внимание',
MB_YESNOCANCEL+MB_ICONEXCLAMATION)of
id_YES: ;
id_NO: DataModule1.TownTable.Cancel;
id_CANCEL: Abort;
end;
Но в таком случае, лучше редактировать данные на отдельной форме, а не на гриде, ибо убивается те плюсы, котрые дает редактирование в гриде.
Desdechado (2006-02-10 22:42:00) [3]нельзя, имхо
это стандартное поведение - перешел на другую запись, значит, согласен с изменениями в текущей
drink (2006-02-10 21:36:00) [4]
> На другую ячейку этой же записи или другой? Если Другой,
> то Post выполнится без твоего участия.
ЮЮ, извини, а можно это как-нибудь выключить? Если можно то как?
Desdechado (2006-02-10 18:00:00) [5]и проблема, как обычно, в драйвере ruki.sys
иначе бы сообщил, что не так делал
drink (2006-02-10 17:38:00) [6]Все, народ не парьтесь. Допёр, все работает, всем огромное спасибо.
drink (2006-02-10 17:30:00) [7]
>
>
> На другую ячейку этой же записи или другой? Если Другой,
> то Post выполнится без твоего участия.
Переместил фокус на ячейку другой записи. Да, но программа не спросила сохранить изменения или нет.
ЮЮ (2006-02-10 09:49:00) [8]
> 1. Изменил данные в одной ячейки.
> 2. Переместил фокус на другую ячейку. В этой ячейки, данные
> не изменял.
> 3. Закрыл таблицу.
> 4. Программа не спросила, сохранить изменения или нет, а
> должна.
На другую ячейку этой же записи или другой? Если Другой, то Post выполнится без твоего участия. О состоянии DataSet-а говорит также значок в первой колонке грида. Если он изменился на ">" после потери фокуса гридом, значит сработал какой-то обработчик. Само собой ничего не делается.
Поставь брэк-поинт на
if DataModule1.TownTable.State in [dsEdit,dsInsert] then
и проверь этот State во время срабатывания обработчика
evvcom (2006-02-10 08:51:00) [9]Ну а F7/F8 чего говорят? Или ты с ними не знаком? Ты хоть в эту FormCloseQuery попадаешь? А то поди слетел обработчик в дизайне, а ты сидишь и репу чешешь, да нам по ушам ездишь.
drink (2006-02-10 08:48:00) [10]
> А где "закрытие таблицы"?
procedure TTownBookForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
> Поэтому вместо непонятного Modified рекомендую проверять
> DataSet.State:
> См.[4] - уже полтора суток назад дали правильный совет.
>
см. [14]
Результат тот же самый.
ЮЮ (2006-02-10 03:24:00) [11]Note: In general, an application need not check the status of Modified. Properties, events, and methods of TDataSet and its descendants that modify records generally check this status automatically and take appropriate actions based on its value.
Поэтому вместо непонятного Modified рекомендую проверять DataSet.State:
См.[4] - уже полтора суток назад дали правильный совет.
if DataModule1.ADOTable.State in [dsEdit,dsInsert] then
далее по тексту
Johnmen (2006-02-10 00:32:00) [12]А где "закрытие таблицы"?
drink (2006-02-09 22:27:00) [13]procedure TTownBookForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
drink (2006-02-09 22:23:00) [14]if DataModule1.TownTable.State in [dsEdit,dsInsert] then
case Application.MessageBox(PChar(
'Сохранить изменения в документе?')
,'Внимание',
MB_YESNOCANCEL+MB_ICONEXCLAMATION)of
id_YES:
DataModule1.TownTable.Post;
id_NO:
DataModule1.TownTable.Cancel;
id_CANCEL:
CanClose:=false;
end;
Desdechado (2006-02-09 22:11:00) [15]покажи код, где ты использовал совет
drink (2006-02-09 21:44:00) [16]
> drink © (08.02.06 19:14) [9]
> вы все еще вывариваете? тогда это диагноз...
> а мог бы использовать [4]
Desdechado, я использовал ваш совет, реакция тажа самая!!!!
1. Изменил данные в одной ячейки.
2. Переместил фокус на другую ячейку. В этой ячейки, данные не изменял.
3. Закрыл таблицу.
4. Программа не спросила, сохранить изменения или нет.
Desdechado (2006-02-09 16:48:00) [17]drink © (08.02.06 19:14) [9]
вы все еще вывариваете? тогда это диагноз...
а мог бы использовать [4]
evvcom (2006-02-09 13:53:00) [18]
> Программа не спросила, сохранить изменения или нет, а должна.
C какого перепугу она тебе чего-то должна? Компонент выставил соответствующие флаги, а уж анализировать их или нет, это дело твое, а не "программы".
drink (2006-02-08 19:14:00) [19]ZeroDivide, спасибо за совет. Но мне хотелосьбы редактировать в DBGride.
...и там данные не изменялись, то данные не изменяются
А глюк в чем? Все так и должно быть.
Дело в том что что они совсем не изменяются, даже там где изменялись.
1. Изменил данные в одной ячейки.
2. Переместил фокус на другую ячейку. В этой ячейки, данные не изменял.
3. Закрыл таблицу.
4. Программа не спросила, сохранить изменения или нет, а должна.
evvcom (2006-02-08 15:01:00) [20]
> Если мне не изменяет память, то событие AfterPost возникает
> только при переходе на другую запись в НД.
Изменяет. Только после Post. А Post можно вызвать либо явно, либо неявно, находясь в режиме dsEdit или dsInsert, переходом на другую запись.