Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.47 MB
Время: 0.007 c
1-60751
Bart
2002-08-07 12:45
2002.08.19
Нужна функция перевода числа в строку


1-60738
mmb
2002-08-07 11:41
2002.08.19
TCanvas можно ли создавать в run-time


1-60721
maxim2
2002-08-07 07:23
2002.08.19
Как сгенерить случайную цифру например от 10 до 100 ?


6-60796
Alexandr 413
2002-06-06 05:53
2002.08.19
Синхронизация времени через интернет


14-60862
kaif
2002-07-23 11:54
2002.08.19
Как настроить среду?





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