Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чайниковый вопрос по TDataset/TIBDataset+DBGridEh / 13 сообщений из 13, страница 1 из 1
12.12.2003, 06:28
    #32351269
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Доброе время суток.
Значит, элементарная ситуация - есть датасет, есть грид, по гриду бродит юзер. Заходит в запись, меняет, двигается дальше. В момент движения происходит Post, на каковой хочется повесить диалог вида "Сохранить? Да/Нет/Отмена". Сделал так:

procedure TForm1.IBDataSet1BeforePost(DataSet: TDataSet);
begin
Case MessageDlg('Save changes?',mtConfirmation,[mbYes, mbNo, mbCancel],0) of
mrNo:DataSet.Cancel;
mrCancel:Abort;
end;
end;

При нажатии на No пишет "Not in edit mode". Ставил точку останова, проверял state - dsEdit. Если вместо TIBDataset использовать TTable BDE, сообщение имеет вид "Key violation". Что за притча?

И еще, чтоб ветки не плодить: в эх-гриде установлено свойство AutoFitColWidth=True. Если поля в колумн-эдиторе не заданы, то масштабирует ширину отлично. Если же поля добавить в список колонок, он просто делает все колонки одинаковой ширины. Это так и должно быть, или можно вылечить?
Поможите, плиз!

PS дело происходит на D7
...
Рейтинг: 0 / 0
12.12.2003, 13:42
    #32351427
VVD
VVD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Посмотри, что попадает в dataset из базы. Может там встречаются две одинаковых записи и неизвестно с какой из них работать. Ключ в datasetе сидит ?
...
Рейтинг: 0 / 0
12.12.2003, 13:43
    #32351429
Lelikk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
if MessageDlg('Update Record?', mtConfirmation, [mbYes, mbNo], 0) = mrNo

else
Abort;
...
Рейтинг: 0 / 0
12.12.2003, 14:42
    #32351475
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
To VVD:

Когда пытался с TTable, использовал DemoDB, таблица customers. Вроде, всё должно быть ОК - при записи изменений ведь никаких вопросов не возникает.

To Lelikk:

Нужен именно диалог с тремя вариантами - сохраняем (Yes), не сохраняем и выходим из редактирования (No), не сохраняем и продолжаем редактировать (Cancel)

Вообще, в документации сказано, что если датасет не в dsEdit, Cancel does nothing. А тут - ругается... У кого еще какие идеи есть?
...
Рейтинг: 0 / 0
12.12.2003, 14:53
    #32351487
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Что то у меня схожее было ...

procedure TForm1.IBDataSet1BeforePost(DataSet: TDataSet);
begin
if (not DataSet.Edit )
begin
DataSet.Edit();
end
Case MessageDlg('Save changes?',mtConfirmation,[mbYes, mbNo, mbCancel],0) of
mrNo:DataSet.Cancel;
mrCancel:Abort;
end;
end;


Что то в таком духе ,
правда за точность приведенного мной кода не гарантирую,
двно на делфях уже не пишу.
_______
...
Рейтинг: 0 / 0
12.12.2003, 16:02
    #32351517
VVD
VVD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Попробовал для TClientDataSet - не ругается, но делает полную чепуху.
Как гипотеза :
Post и Cancel - одноранговые противоположные операции и канселить хоть и before но уже пост плохой тон. Может Post можно только заабортить ?
Самому интересно стало.
...
Рейтинг: 0 / 0
12.12.2003, 18:48
    #32351603
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
To JibSkeart:

Та же песня. В том-то и дело, что проверять state в коде тут бесполезно - он dsEdit.

To VVD:

Да тут уже не моветон, тут уже concrete wall situation. :) Но гипотеза о неиспользовании BeforePost для вывода подтверждающего диалога отражается в документации:

if MessageDlg('Update Record?', mtConfirmation, [mbYes, mbNo], 0)=mrYes then
MyData.Post
else
MyData.Cancel;

(Cancel example, D7 on-line help)

ИМХО, помещать такой код в BeforePost бесполезно, ибо он сам вызывает Post, который опять вызовет событие BeforePost, с уходом в бесконечность. Видимо, предполагается использование в каом-то другом месте. А куда еще поместить вызов подтверждающего диалога, чтоб любые изменения датасета перехватывать в одном месте?
...
Рейтинг: 0 / 0
12.12.2003, 20:15
    #32351669
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Решение найдено.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
procedure TForm1.IBDataSet1BeforePost(DataSet: TDataSet);
begin
  if Dataset.State=dsEdit then
  Case MessageDlg('Save changes ?',mtConfirmation,[mbYes, mbNo, mbCancel], 0 ) of
    mrNo:
      begin
        DataSet.Cancel;
        DataSet.Edit;  //< ---- вот эта строчечка....
 
      end;
    mrCancel:Abort;
  end;
end;


Парадоксально, но факт. Причем таким образом датасет обратно в эдит не выходит - после этого происходит post. "О, сколько нам открытий чудных..."
...
Рейтинг: 0 / 0
12.12.2003, 20:30
    #32351682
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Облом - при этом решении всё одно происходит post неизменненой строки. Что никуда не годится. Эхххх....
...
Рейтинг: 0 / 0
12.12.2003, 20:40
    #32351691
vasjakur
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Ладно, остановился пока на этом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
procedure TRefListForm.RefDataSetBeforePost(DataSet: TDataSet);
begin
  Case MessageDlg('Save changes?', mtConfirmation, [mbYes, mbNo, mbCancel],  0 ) of
    mrCancel:Abort;
    mrNo:
      begin
        Dataset.Cancel;
        Abort;
      end;
  end;
end;


При этом из эдита датасет не хочет выходить, но хоть пост не происходит, и запись до начального вида восстанавливает. И то хлеб.
...
Рейтинг: 0 / 0
13.12.2003, 11:41
    #32351788
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Надо посмотреть я ведь как то подобную ситуацию уже обходил ведь :))
____
...
Рейтинг: 0 / 0
15.12.2003, 10:08
    #32352310
1man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
Попробуй последовать совету JibSkeart 12 дек 03, 14:53 только даже без проверки dsEdit, просто IBDataSet1->Edit(). То что у тебя State=dsEdit - это ни есть факт, а есть продукт работы некого ПО.
...
Рейтинг: 0 / 0
16.12.2003, 14:03
    #32353931
Nick74
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чайниковый вопрос по TDataset/TIBDataset+DBGridEh
А может стоит с BeforeScroll работать, а не с BeforePost?
BeforePost наверняка ведь работает примерно так:
Код: plaintext
1.
2.
3.
4.
5.
proc InternalPost;
begin
  if Assigned( FOnBeforePost ) FOnBeforePost;
  Post;  //!!!!!
  if Assigned( FOnAfterPost ) FOnAfterPost;
end;

Так чему же удивляться, что оно хочет state=dsEdit?
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Чайниковый вопрос по TDataset/TIBDataset+DBGridEh / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]