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

Вниз

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

 
nali   (2006-08-22 11:25) [0]

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


 
StriderMan ©   (2006-08-22 11:35) [1]

т.к. 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;


 
StriderMan ©   (2006-08-22 11:44) [2]

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

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


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

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


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


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


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


 
nstur   (2006-08-29 08:37) [5]

Подробнее, с заморочками (и в рантайме) на 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-29 12:00) [6]


> nstur   (29.08.06 08:37) [5]

а что есть CollectionAsComponent?


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

CollectionAsComponent это

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


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



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

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

Наверх




Память: 0.48 MB
Время: 0.026 c
3-1176305371
Lavrenty
2007-04-11 19:29
2007.07.08
формат даты в DBGridEh


15-1181195773
sergeyst
2007-06-07 09:56
2007.07.08
Куда пропадают кнопки


3-1176281444
Pavel Kuznecov
2007-04-11 12:50
2007.07.08
Ibase-Column unknown когда есть Parameter


2-1181799859
zero-g
2007-06-14 09:44
2007.07.08
Delphi + MySql


2-1181677759
framez
2007-06-12 23:49
2007.07.08
Socket