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

Вниз

Сохранение (чтение) компoнентов в поток?   Найти похожие ветки 

 
SergeyDon   (2002-09-13 15:00) [0]

Если динамически создаю компoненты:
for i:=0 to n do
a:=TLabel.create(ScrollBox);

Как сохранить в файл созданные компаненты на ScrollBox и как их от туда считать.
Именно те которые в ScrollBox! а не все лежащие на форме.


 
SergeyDon   (2002-09-17 09:43) [1]

Может, что нетак спросил?
Неужели никто не делал такое.


 
NeyroSpace ©   (2002-09-17 10:00) [2]

Смотри вопрос заданый мной месяца 1,5 назад.

function ComponentToString(Component: TComponent): string;
var
ms: TMemoryStream;
ss: TStringStream;
begin
ss := TStringStream.Create(" ");
ms := TMemoryStream.Create;
try
ms.WriteComponent(Component);
ms.position := 0;
ObjectBinaryToText(ms, ss);
ss.position := 0;
Result := ss.DataString;
finally
ms.Free;
ss.free;
end;
end;

procedure StringToComponent(Component: TComponent; Value: string);
var
StrStream:TStringStream;
ms: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
ms := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, ms);
ms.position := 0;
ms.ReadComponent(Component);
finally
ms.Free;
end;
finally
StrStream.Free;
end;
end;



С помощью пары этих функций мы можем преобразовать любой компонент в текст, а затем проинициализировать другой компонент того же класса этими данными.
Ниже приведен ресурс формы с одной кнопкой и текст обработчика нажатия на эту кнопку.

object Form1: TForm1
Left = 262
Top = 129
Width = 525
Height = 153
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
Scaled = False
PixelsPerInch = 96
TextHeight = 13
object Button1: TButton
Left = 16
Top = 32
Width = 57
Height = 49
Caption = "Caption"
TabOrder = 0
OnClick = Button1Click
end
end

procedure TForm1.Button1Click(Sender: TObject);
var
Button: TButton;
OldName: string;
begin
Button := TButton.Create(self);

//...сохраняем имя компонента
OldName := (Sender as TButton).Name;

//...стираем имя компонента, чтобы избежать конфликта имен. //...После этого Button1 станет = nil.
(Sender as TButton).Name := "";

//...преобразуем в текст и обратно
StringToComponent( Button, ComponentToString(Sender as TButton) );

//...дадим компоненту уникальное(?) имя
Button.Name := "Button" + IntToStr(random(1000));

//...вернем исходному компоненту имя. //...После этого Button1 станет снова указывать на объект.
(Sender as TButton).Name := OldName;

//...размещаем новую кнопку справа от исходной
Button.parent := self;
Button1.Tag := Button1.Tag + 1;
Button.Left := Button.Left + Button.Width * Button1.Tag + 1;
end;




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


составление статьи: Андрей Чудин, ЦПР ТД Библио-Глобус.

Перейти: Список всех статей



Delphi: статьи | Хранение настроек



--------------------------------------------------------------------------------



 
-= Demon =-   (2002-09-17 10:04) [3]

То что спросил не так - это точно. Что именно ты собираешься сохранять в файл? Я так понял информацию о компонентах, как то тип, имя, координаты, размеры... Тогда это так:

var
i: integer;
f: TextFile;
......
begin
AssignFile(f,FileName);
Rewrite(f);

with ScrollBox do
for i:=0 to ComponentCount-1 do
with Components[i] do
begin
writeln(f,Name);
................
end;

.............
CloseFile(f);
end;

Так сохранишь информацию по ВСЕМ компонентам на ScrollBox...


 
NeyroSpace ©   (2002-09-17 10:09) [4]

Ищи статью: Примеры применения потоковой системы VCL
на
http://vasiliev.dax.ru/doc/fc.php?PHPSESSID=88d9f506c0ee8b7f1e5b51758711b042&pageid=3&nocache=1717835553&PHPSESSID=88d9f506c0ee8b7f1e5b51758711b042


 
Юрий Зотов ©   (2002-09-17 23:01) [5]

> -= Demon =- (17.09.02 10:04)
Не знаю, как спросил, так или не так, зато знаю как ответил. Приведенный Вами код пишет в файл только имена компонентов (которые, кстати, при динамическом создании запросто могут и отсутствовать). ОК, имена записаны. Вопрос - что дальше?

> Автор вопроса.
См. методы TStream - Read/WriteComponent(Res) и функции Read/WriteComponentResFile. Это то, чем пользуется сама Delphi.

Можно сохранять и в виде текста (ObjectBinaryToText/ObjectTextToBinary), но это менее компактно и слишком легко доступно для юзера.



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

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

Наверх




Память: 0.48 MB
Время: 0.019 c
1-98183
Андрусь
2002-09-17 20:19
2002.09.30
откуда пришёл фокус


1-98082
Осирис
2002-09-19 15:59
2002.09.30
Диалоговое окно


4-98406
o_viz2000
2002-08-15 09:27
2002.09.30
Передать нажатие клавиш в ДОС-окно


8-98235
TColor
2002-05-31 16:33
2002.09.30
TColor and HTML


1-98175
Maloy
2002-09-17 19:32
2002.09.30
Запуск программ