Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2016, 09:18   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Обновление данных для клона компонента ClientDataSet

Привет!

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

Код:
ClientDataSet1.CreateDataSet;
ClientDataSetClone1.CloneCursor(Self.ClientDataSet1,True); // Клонируем основной DataSet
К примеру, изменяем в таблице DBGrid ячейку и ручками вписываем туда новое значение подтверждая наши действия клавишей Enter, при этом, по другим строкам в таблице мышкой не кликаем.

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

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

Как добиться обновления данных в клоне сразу после их внесения в таблицу, без перескакивания по строкам?!
bilibian вне форума Ответить с цитированием
Старый 20.09.2016, 09:33   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Delphi Help
Цитата:
Call Post to commit changes to the current record. Methods that change the dataset state, such as Edit, Insert, or Append, or that move from one record to another, such as First, Last, Next, and Prior automatically call Post.
Цитата:
нужно после редактирования самой ячейки кликнуть на другую строку в таблице.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.09.2016, 09:48   #3
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

evg_m, как это решает мою проблему?!

Если вы имеете ввиду, что перед получением данных от клона, мне нужно пройтись циклом по оригиналу используя выше указанные методы, то это не приемлемо, так как придется отнимать выделение у пользователя. Теряется вся суть использования клона.
bilibian вне форума Ответить с цитированием
Старый 20.09.2016, 10:32   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Для того, чтобы клон получил новые данные ячейки, нужно после редактирования самой ячейки кликнуть на другую строку в таблице.
рискну предположить, что пока Вы не меняете строку в таблице, изменённые данные в ячейке ещё не записаны. Для проверки этого, например, попробуйте после редактирования, вместо того, чтобы кликнуть на другую строку, нажать клавишу "ESC".

Как с этим бороться?
я бы редактирование строки вытащил в отдельную форму. (по "Сохранить" выполняется Post). Думаю, что это решит вашу проблему.

если не хотите делать так, то делайте так, как в Excel - редактирование ячейки заканчивается либо на нажатию на кнопочку с зелёной "птичкой", либо по клику на другую ячейку, либо по нажатию клавиши Enter.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2016, 10:53   #5
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
того, чтобы кликнуть на другую строку, нажать клавишу "ESC".
Данное действие отменяет сделанные изменения в ячейке.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я бы редактирование строки вытащил в отдельную форму. (по "Сохранить" выполняется Post). Думаю, что это решит вашу проблему.
Верно, но мне не хотелось бы загромождать интерфейс. Если решение не получится найти, то в конечном счете придется поступить именно так.

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
либо по нажатию клавиши Enter
С Enter-ом не работает. Или вы имеете ввиду, чтобы написать под эту клавишу действие с выполнением Post?

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
либо на нажатию на кнопочку с зелёной "птичкой".
Попробую подумать над этим вариантом.

Последний раз редактировалось bilibian; 20.09.2016 в 10:59.
bilibian вне форума Ответить с цитированием
Старый 20.09.2016, 11:20   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
begin
  if (Ord(Key)=VK_RETURN) and (DataSet.State=dsEdit) then DataSet.Post;
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.09.2016 в 11:32.
Аватар вне форума Ответить с цитированием
Старый 20.09.2016, 11:23   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
evg_m, как это решает мою проблему?!
Цитата:
Цитата:
нужно после редактирования самой ячейки кликнуть на другую строку в таблице.
при этом выполняется переход НА ДРУГУЮ запись(строку) НАБОРА ДАННЫХ.(DataSet).
В этом случае
Цитата:
or that move from one record to another, ... automatically call Post.
Вот и надо САМОМУ вызвать(выполнить) Post
Цитата:
Call Post to commit changes to the current record.
где и когда ?
пример Аватара.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 20.09.2016, 11:31   #8
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Код:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
  if DataSet.State=dsEdit then DataSet.Post;
end;
Работает, но только в том случае, если не использовать Enter. Для Enter приходится писать вот такой вот бредовый колхоз:

Код:
procedure TForm1.DBGridEh1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_RETURN) then begin
    ClientDataSet1.Edit;
    ClientDataSet1.FieldByName('param1').Value := ClientDataSet1.FieldValues['param1'];
    ClientDataSet1.FieldByName('param2').Value := ClientDataSet1.FieldValues['param2'];
    ClientDataSet1.FieldByName('param3').Value := ClientDataSet1.FieldValues['param3'];
    ClientDataSet1.Post;
  end;
end;
bilibian вне форума Ответить с цитированием
Старый 20.09.2016, 11:31   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, хороший вариант. Намного лучше, чем у TC.
но имеет тот же недостаток, только в меньшем масштабе.
если не выйти из редактируемой ячейки, то её изменения в БД не попадают...


Цитата:
Для Enter приходится писать вот такой вот бредовый колхоз:
а разве так не сработает?
Код:
procedure TForm1.DBGridEh1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
   if (Key=VK_RETURN) and (DBGridEh1.DataSet.State=dsEdit) then DBGridEh1.DataSet.Post;
end;


p.s. правда, я бы всё равно рассмотрел вариант, когда запись изменений происходит разово (в рамках одной строки (== Record) и осознанно - с подтверждением пользователя.
А то можно дойти до того, чтобы повесить обработчик на изменение значения и по каждой буковке делать Post в БД. Если в БД логгирование висит, вот цирк будет!

Последний раз редактировалось Serge_Bliznykov; 20.09.2016 в 11:37.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.09.2016, 11:35   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ага, забыл, что по Enter не переходит, Можно по OnKeyPress, исправил в #6

PS вообще-то это не есть хорошо, post не должен быть после обработки каждой колонки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 20.09.2016 в 11:38.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление данных в ClientDataSet bilibian Общие вопросы Delphi 1 28.08.2016 09:58
Обновление компонента Label Karik_ Общие вопросы по Java, Java SE, Kotlin 5 03.05.2016 11:45
шифровка данных в Clientdataset iliili БД в Delphi 1 08.07.2011 20:04
Обновление отдельного компонента шаблона CodeNOT JavaScript, Ajax 2 16.04.2011 02:15
Возможно ли обновление отдельного компонента шаблона CodeNOT PHP 1 14.04.2011 19:35