TClientDataSet - как отменить загрузку из файла? - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть TClientDataSet, который хранит данные в формате .cds.

Допустим, я сделал это:

clientDataSet1.loadFromFile('myclient.cds');

После того, как я это сделал, есть ли способ отменить загрузку и перевести компонент в состояние, в котором он находился ДО того, как я вызвал этот метод, чтобы я мог добавлять / удалять поля, не связанные с файлом .cds?

Полагаю, мне нужно использовать параметр 'clearData', но я это можно сделать только во время разработки, я не нашел способа вызвать его во время выполнения.

1 Ответ

3 голосов
/ 19 февраля 2020

Как вы, возможно, знаете, SaveToFile и LoadFromFile существуют в основном для поддержки режима работы "Портфель" CDS, при котором вы можете работать с локальной копией записей базы данных, будучи отключенными от исходной базы данных записей, сохраняя изменения локально, а затем применить их, как только вы подключитесь к нему. Сохраненный файл включает в себя кэш изменений CDS, так что вы можете сделать что-то вроде этого:

 clientDataSet1.LoadFromFile('myclient.cds');
 clientDataSet1.UndoLastChange;

, и это вернет записи CDS в состояние, в котором они находились до последнего изменения, сохраненного в CDS до вызова SaveToFile.

Однако, это не совсем то, о чем вы просили, и мне показалось, что вернуть CDS в то состояние, в котором он находился до вызова LoadFromFile, и при этом если он может содержать совершенно разные данные.

Если вы хотите иметь возможность восстановить это предыдущее состояние, вы можете, при условии , предпринять шаги, чтобы сохранить его перед вызовом LoadFromFile.

Простейшим будет

clientDataSet1.SaveToFile('myclient.prv');
clientDataSet1.loadFromFile('myclient.cds');

if ReloadPreviousVersion then
  clientDataSet1.loadFromFile('myclient.prv');

или, если вы хотите избежать сохранения на диск

var
  PrvData : OleVariant;
[...]
  PrvData := clientDataSet1.Data;
  clientDataSet1.loadFromFile('myclient.cds');

  if ReloadPreviousVersion then
    clientDataSet1.Data := PrvData;

(или вы можете сохранить / загрузить из памяти stream).

Кстати, я не знаю, знакомы ли вы с ним, но CDS имеют свойство SavePoint , которое очень удобно для возврата и отмены изменений; к сожалению, SavePoints не позволяют возвращать прошлые операции, такие как LoadFromFile и ApplyUpdates, потому что они очищают кэш изменений CDS.

Что касается вашего запроса 'clearData', если вы просто хотите очистить данные CDS, просто наберите

clientDataSet1.EmptyDataSet;
...