Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
ВнизКак наиболее рационально решить следующую проблему? Найти похожие ветки
← →
NetroSpace (2002-08-06 17:07) [0]Есть текстовый файл с описание типов обьектов и их свойств, например в текстовом формате *.dfm. Я начинаю создавать динамические обьекты, но писать огромное число строк типа:
If s="Text" then Edit1.Text:="yo";
if s="Top" then Edit1.Top:=50;
...
не хочется (на самом деле получается очень большая конструкция CASE). Должен же быть способ перечислять все свойства обьекта по порядку, обращаясь к ним через числовой индекс?
Ведь сама делфи как-то этот текстовый файл обрабатывает?
← →
Skier (2002-08-06 17:36) [1]>NetroSpace
> Ведь сама делфи как-то этот текстовый файл обрабатывает
Delphi "обрабатывает" *.dfm-файл классами TWriter и TReader
← →
NeyroSpace (2002-08-06 17:57) [2]Спасибо Skier! А есть ли где-нибудь примеры использования этих классов?
← →
Skier (2002-08-06 18:02) [3]>NeyroSpace
А что тебя конкретно интересует ? Цель какая ??
← →
NeyroSpace (2002-08-06 18:20) [4]У меня есть база данных где хранится разнородная информация, поэтому для вывода данных вместе с ними хранится информация о компонентах/обьектах в которые нужно создать для отображения этой информации. Подскажи как динамически собрать обьект по его текстовому описанию:
object Form1: TForm1
Left = 194
Top = 107
Width = 696
Height = 480
Caption = "Form1"
Color = clBtnFace
Font.Charset = DEFAULT_CHARSET
Font.Color = clWindowText
Font.Height = -11
Font.Name = "MS Sans Serif"
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 13
object Edit1: TEdit
Left = 52
Top = 56
Width = 61
Height = 21
TabOrder = 0
Text = "Edit1"
end
end
← →
Skier (2002-08-06 18:41) [5]>NeyroSpace
Функции из Help-а, думаю что это тебе подойдёт.
Только перед созданием объектов не забудь
зарегистрировать классы
(см. RegisterClass(...) или RegisterClasses(...))
function ComponentToString(Component: TComponent): string;
var
BinStream:TMemoryStream;
StrStream: TStringStream;
s: string;
begin
BinStream := TMemoryStream.Create;
try
StrStream := TStringStream.Create(s);
try
BinStream.WriteComponent(Component);
BinStream.Seek(0, soFromBeginning);
ObjectBinaryToText(BinStream, StrStream);
StrStream.Seek(0, soFromBeginning);
Result:= StrStream.DataString;
finally
StrStream.Free;
end;
finally
BinStream.Free
end;
end;
function StringToComponent(Value: string): TComponent;
var
StrStream:TStringStream;
BinStream: TMemoryStream;
begin
StrStream := TStringStream.Create(Value);
try
BinStream := TMemoryStream.Create;
try
ObjectTextToBinary(StrStream, BinStream);
BinStream.Seek(0, soFromBeginning);
Result := BinStream.ReadComponent(nil);
finally
BinStream.Free;
end;
finally
StrStream.Free;
end;
end;
← →
NeyroSpace (2002-08-06 21:35) [6]Мне бы пример хотя бы для TEdit, чтобы от начала и до конца. Нет времени чтобы вникнуть в тонкости взаимодейтсвия VCL и WinApi... Сверху продавливают решение в лоб, ну ОЧЕНЬ страшное, а я чувствую, что есть простое и красивое решение. Плиз подскажи где можно посмотреть пример! А то меня заживо в коде похоронят :-(
Ах да мне нужно использовать нестандартные компоненты...
← →
NeyroSpace (2002-08-07 14:54) [7]Спасибо Абдулинину Марату за статью
http://vasiliev.dax.ru/doc/fc.php?PHPSESSID=88d9f506c0
ee8b7f1e5b51758711b042&pageid=3&subpageid=2&articleid=45
Вот самый простой пример на ее основе:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
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;
procedure TForm1.FormCreate(Sender: TObject);
var
Button: TButton;
begin
Button := TButton.Create(self);
memo1.Lines.LoadFromFile("TButton.txt");
StringToComponent(Button, Memo1.Lines.Text); //...преобразуем в текст и обратно
//...размещаем новую кнопку справа от исходной
Button.parent := self;
Button.Left := 10;
end;
end.
Содержимое файла TButton.txt:
object DynButton:TButton
Left=196
Top=24
Width=89
Height=33
TabOrder=0
Caption="DynButton"
end
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.19;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.008 c