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

Вниз

Как наиболее рационально решить следующую проблему?   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.015 c
1-60580
Up
2002-08-08 01:44
2002.08.19
Старый UPX (0.84?)


1-60551
anod
2002-08-05 16:36
2002.08.19
Удалить меню


1-60707
anod
2002-08-06 21:47
2002.08.19
Как сделать,


6-60788
Delphi 5.01
2002-05-27 20:53
2002.08.19
Chitaem i zapisivaem s ftp servera


3-60519
AlexDulub
2002-07-30 00:55
2002.08.19
Работа с ADO