Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];

Вниз

Сохранение (чтение) комп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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-98088
nikolo
2002-09-19 17:25
2002.09.30
Обхождение графов


6-98247
c0pYc@t
2002-07-30 10:08
2002.09.30
ServerSocket1.Socket.Connectons


3-97966
:: Hamster ::
2002-09-09 10:16
2002.09.30
Организация Transaction..или в чём тут может быть дело ?!


4-98402
ssv
2002-08-13 14:09
2002.09.30
WNetGetResourceParent


1-98207
arcad
2002-09-18 16:47
2002.09.30
Помогите сделать в TreeView цветные Items, попроще если можно





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский