Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сохранение и загрузка свойства в файл в рантайме


nali ©   (2006-08-22 11:25:00) 

Привет мастера!
У меня опять вопрос по TCollection:
Есть наследник TCustomGrid, есть свойство Columns (наследник
TCollection, наподобие как у DBGrid).
Как бы научить компонент сбрасывать свойство Columns в файл
и загружать из файла в рантайме ? Какой-нибудь бы простой способ используя, например TWriter и TReader, если так можно...


nstur   (2006-08-30 13:00:00) [1]

CollectionAsComponentэто

TCollectionAsComponent = class(TComponent) //Используется только для сохранения коллекции
private
 FKadrDataList: TKadrDataList;
published
 property KadrDataList: TKadrDataList read FKadrDataList write FKadrDataList;
end;


По моему коллекции (сами по себе) в dfm не пишутся (или я не нашел как это делается). Поэтому создал компонент (временный) со свойством из одной коллекции и оперирую с ней.


StriderMan   (2006-08-29 12:00:00) [2]


> nstur   (29.08.06 08:37) [5]

а что есть CollectionAsComponent?


nstur   (2006-08-29 08:37:00) [3]

Подробнее, с заморочками (и в рантайме) на http://nstur.narod.ru/Delphi/component1.html

А простой вариант:

procedure TAAA.LoadComponentFromTextFile(AFileName: string);
var
 ms: TMemoryStream;
 fs: TFileStream;
begin
 if NOT FileExists(AFileName) then Exit;

 fs := TFileStream.Create(AFileName, fmOpenRead);
 ms := TMemoryStream.Create;
 try
   ObjectTextToBinary(fs, ms);
   ms.position:= 0;
   ms.ReadComponent(CollectionAsComponent);
 finally
   ms.Free;
   fs.free;
 end;
end;

procedure TAAA.SaveComponentToTextFile(AFileName: string);
var
 ms: TMemoryStream;
 fs: TFileStream;
begin
 fs := TFileStream.Create(AFileName, fmCreate or fmOpenWrite);
 ms := TMemoryStream.Create;
 try
   ms.WriteComponent(CollectionAsComponent);
   ms.position:= 0;
   ObjectBinaryToText(ms, fs);
 finally
   ms.Free;
   fs.free;
 end;
end;


StriderMan   (2006-08-23 08:18:00) [4]


> nali   (22.08.06 19:14) [3]
> но не получается сохранить не published свойства или поля в обоих случаях.


Вообще-то если сделать DefineProperties, то можно сохранять поля в поток хоть из private.


nali   (2006-08-22 19:14:00) [5]

Вобщем-то 1, но подошел бы и второй вариант через компонент обертку
(в TCustomDBGrid так и сделано), но не получается
сохранить не published свойства или поля в обоих случаях...


StriderMan   (2006-08-22 11:44:00) [6]

Пардон, немного не понял задачу.
1. Нужно толькоColumns сохранить? или
2.научить Grid сохранять свои Columns вместе с собой?

если 1 , и
> например TWriter и TReader, если так можно
то я думаю в первых двух приведенных мной методах - все что нужно,
если два, то еще и DefinePropertiesпригодится.


StriderMan   (2006-08-22 11:35:00) [7]

т.к. TCollection не потомок TComponent, то придется городить сохранение самостоятельно. Как это сделать? загляни в реализацию TCustomDBGrid. Обрати внимание на методы:

procedure TCustomDBGrid.ReadColumns(Reader: TReader);
begin
 Columns.Clear;
 Reader.ReadValue;
 Reader.ReadCollection(Columns);
end;

procedure TCustomDBGrid.WriteColumns(Writer: TWriter);
begin
 if Columns.State = csCustomized then
   Writer.WriteCollection(Columns)
 else  // ancestor state is customized, ours is not
   Writer.WriteCollection(nil);
end;

procedure TCustomDBGrid.DefineProperties(Filer: TFiler);
var
 StoreIt: Boolean;
 vState: TDBGridColumnsState;
begin
 vState := Columns.State;
 if Filer.Ancestor = nil then
   StoreIt := vState = csCustomized
 else
   if vState <> TCustomDBGrid(Filer.Ancestor).Columns.State then
     StoreIt := True
   else
     StoreIt := (vState = csCustomized) and
       (not CollectionsEqual(Columns, TCustomDBGrid(Filer.Ancestor).Columns, Self, TCustomDBGrid(Filer.Ancestor)));

 Filer.DefineProperty('Columns', ReadColumns, WriteColumns, StoreIt);
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо