Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
2-1181924542
Первокласник Вася
2007-06-15 20:22
2007.07.08
Размер формы


2-1181825444
Alex_C
2007-06-14 16:50
2007.07.08
Ускорение работы программы


2-1181565348
repus
2007-06-11 16:35
2007.07.08
Помогите ожалуйста.


15-1181115561
boriskb
2007-06-06 11:39
2007.07.08
переехать в Казахстан?


2-1181845802
Infinityx93
2007-06-14 22:30
2007.07.08
как чистить стринггрид???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский