Форум: "Компоненты";
Текущий архив: 2007.07.08;
Скачать: [xml.tar.bz2];
ВнизСохранение и загрузка свойства в файл в рантайме Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.041 c