Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Глюк в ДБГрид.   Найти похожие ветки 

 
drink ©   (2006-02-07 22:44) [0]

Глюк в 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;

Зарание спасибо


 
ZeroDivide ©   (2006-02-08 08:44) [1]

...и там данные не изменялись, то данные не изменяются
А глюк в чем? Все так и должно быть.

Редактировать данные прямо в гриде - не очень хороший стиль. Лучше сделай формочку и вызывай ее модально, чтобы пользователь подтвердил либо отмену изменений либо принятие их, осмысленно.


 
msguns ©   (2006-02-08 09:31) [2]

"ADOTable"
"..редактирование данных в ДБГрид"
"при закрытии окна вылетает диалоговое окно"

Побвывав бы !

Надо запретить всем новичкам редактирование в гриде. Во избежание появления подобных "программистов"


 
Johnmen ©   (2006-02-08 09:44) [3]

>Глюк в DBGrid.

Предлагаю все явления, неподвластные осмыслению неопытной души, называть глюками!
:)


 
Desdechado ©   (2006-02-08 11:41) [4]

if( Table.State in [dsEdit,dsInsert] ) then
Table.Post;
а потому уже проверка на модифицированность


 
Ega23 ©   (2006-02-08 12:02) [5]

Если мне не изменяет память, то событие AfterPost возникает только при переходе на другую запись в НД. Переход на другой столбец в DBGrid не означает переход на новую запись в НД.

ИМХО: редактировать данные в DBGrid - плохо, мерзко и отвратительно. Как минимум не получается поставить "дуракозащиту".


 
Sergey13 ©   (2006-02-08 12:12) [6]

2[5] Ega23 ©   (08.02.06 12:02)
>ИМХО: редактировать данные в DBGrid - плохо, мерзко и отвратительно.
Мощно задвинул. 8-)


 
Johnmen ©   (2006-02-08 12:34) [7]


> Ega23 ©   (08.02.06 12:02) [5]
> ИМХО: редактировать данные в DBGrid - плохо, мерзко и отвратительно.


Слава Аллаху, что только ИМХО, и ничего более...


 
evvcom ©   (2006-02-08 15:01) [8]


> Если мне не изменяет память, то событие AfterPost возникает
> только при переходе на другую запись в НД.

Изменяет. Только после Post. А Post можно вызвать либо явно, либо неявно, находясь в режиме dsEdit или dsInsert, переходом на другую запись.


 
drink ©   (2006-02-08 19:14) [9]

ZeroDivide, спасибо за совет. Но мне хотелосьбы редактировать в DBGride.

...и там данные не изменялись, то данные не изменяются
А глюк в чем? Все так и должно быть.

Дело в том что что они совсем не изменяются, даже там где изменялись.

1. Изменил данные в одной ячейки.
2. Переместил фокус на другую ячейку. В этой ячейки, данные не изменял.
3. Закрыл таблицу.
4. Программа не спросила, сохранить изменения или нет, а должна.


 
evvcom ©   (2006-02-09 13:53) [10]


> Программа не спросила, сохранить изменения или нет, а должна.

C какого перепугу она тебе чего-то должна? Компонент выставил соответствующие флаги, а уж анализировать их или нет, это дело твое, а не "программы".


 
Desdechado ©   (2006-02-09 16:48) [11]

drink ©   (08.02.06 19:14) [9]
вы все еще вывариваете? тогда это диагноз...
а мог бы использовать [4]


 
drink ©   (2006-02-09 21:44) [12]


> drink ©   (08.02.06 19:14) [9]
> вы все еще вывариваете? тогда это диагноз...
> а мог бы использовать [4]


Desdechado, я использовал ваш совет, реакция тажа самая!!!!

1. Изменил данные в одной ячейки.
2. Переместил фокус на другую ячейку. В этой ячейки, данные не изменял.
3. Закрыл таблицу.
4. Программа не спросила, сохранить изменения или нет.


 
Desdechado ©   (2006-02-09 22:11) [13]

покажи код, где ты использовал совет


 
drink ©   (2006-02-09 22:23) [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;


 
drink ©   (2006-02-09 22:27) [15]

procedure TTownBookForm.FormCloseQuery(Sender: TObject;
 var CanClose: Boolean);


 
Johnmen ©   (2006-02-10 00:32) [16]

А где "закрытие таблицы"?


 
ЮЮ ©   (2006-02-10 03:24) [17]

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
 далее по тексту


 
drink ©   (2006-02-10 08:48) [18]


> А где "закрытие таблицы"?


procedure TTownBookForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);


> Поэтому вместо непонятного Modified рекомендую проверять
> DataSet.State:
> См.[4] - уже полтора суток назад дали правильный совет.
>


см. [14]

Результат тот же самый.


 
evvcom ©   (2006-02-10 08:51) [19]

Ну а F7/F8 чего говорят? Или ты с ними не знаком? Ты хоть в эту FormCloseQuery попадаешь? А то поди слетел обработчик в дизайне, а ты сидишь и репу чешешь, да нам по ушам ездишь.


 
ЮЮ ©   (2006-02-10 09:49) [20]


> 1. Изменил данные в одной ячейки.
> 2. Переместил фокус на другую ячейку. В этой ячейки, данные
> не изменял.
> 3. Закрыл таблицу.
> 4. Программа не спросила, сохранить изменения или нет, а
> должна.


На другую ячейку этой же записи или другой? Если Другой, то Post выполнится без твоего участия. О состоянии DataSet-а говорит также значок в первой колонке грида. Если он изменился на ">" после потери фокуса гридом, значит сработал какой-то обработчик. Само собой ничего не делается.

Поставь брэк-поинт на
if DataModule1.TownTable.State in [dsEdit,dsInsert] then
и проверь этот State  во время срабатывания обработчика


 
drink ©   (2006-02-10 17:30) [21]


>
>
> На другую ячейку этой же записи или другой? Если Другой,
>  то Post выполнится без твоего участия.


Переместил фокус на ячейку другой записи. Да, но программа не спросила сохранить изменения или нет.


 
drink ©   (2006-02-10 17:38) [22]

Все, народ не парьтесь. Допёр, все работает, всем огромное спасибо.


 
Desdechado ©   (2006-02-10 18:00) [23]

и проблема, как обычно, в драйвере ruki.sys
иначе бы сообщил, что не так делал


 
drink ©   (2006-02-10 21:36) [24]


> На другую ячейку этой же записи или другой? Если Другой,
>  то Post выполнится без твоего участия.


ЮЮ, извини, а можно это как-нибудь выключить? Если можно то как?


 
Desdechado ©   (2006-02-10 22:42) [25]

нельзя, имхо
это стандартное поведение - перешел на другую запись, значит, согласен с изменениями в текущей


 
ЮЮ ©   (2006-02-11 08:10) [26]

Поставить такой же "дикий" обработчик на 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;

Но в таком случае, лучше редактировать данные на отдельной форме, а не на гриде, ибо убивается те плюсы, котрые дает редактирование в гриде.


 
drink ©   (2006-02-11 10:27) [27]

thenks



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
15-1139309619
Ega23
2006-02-07 13:53
2006.02.26
Как вы пишете ПО?


8-1126982161
ArtemESC
2005-09-17 22:36
2006.02.26
Как реализовать освящение


15-1139185823
DimonS
2006-02-06 03:30
2006.02.26
Тут такой вопросец наметился насчет выбора принтера...


8-1126701118
Littlekan
2005-09-14 16:31
2006.02.26
Уровень ProgressBar на мониторе


2-1139167798
cava
2006-02-05 22:29
2006.02.26
obgect pascal