Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с созданием компонентов из dfm файла. [D1, D2, D3, D4, D5, D6, Win95/98, WinME, NT4, Win2k, WinXP]


Zhirnov Maxim ©   (2002-11-03 17:05:00) 

Дано задание: имеется Дельфийский dfm файл, необходимо по нему создать все описанные в нём компоненты. Учитывая при этом все параметры, типа: Align, Height, Width, Left, Top, Visible, Enable и т.д.(необходимо учитывать всё). Короче требуют анилизатор dfm файлов, как в самой Delphi. Помогите пожалуйста. Требуют работающую программу к 16 ноябрю 2002 года. Всем кто
поможет дельным советом - ОГРОМНОЕ спасибо.


Zhirnov Maxim   (2002-11-08 17:49:00) [1]

Всё - я разобрался. Извените что отвлёк. Всем помогавшим - большое спасибо.


Юрий Зотов   (2002-11-07 18:45:00) [2]

NewComponent := StringToComponent(Memo1.Text);
if NewComponent is TControl then
TControl(NewComponent). Parent := Form1;

После этого контрол появится на форме. Никакие Create не нужны.


Zhirnov Maxim   (2002-11-07 18:36:00) [3]

В общем-то я разобрался, но: почему когда я вызываю StringToComponent и в качестве параметра показываю содержимое dfm файла, сначала создаётся форма которая уже существует, со всеми компонентами, а потом добавляются ещё и компоненты из dfm файла?


Zhirnov Maxim   (2002-11-07 16:05:00) [4]

> KoluChi © (07.11.02 13:38)
> P.S. А чем тебе не нравится ReadComponentResFile/
> WriteComponentResFile
А чем они лучше / хуже StringToComponent? Правда с ней (с функцией) у меня всё же что-то не получается. Вроде и RegisterClass стал делать, спасибо Юрию ЗОТОВУ, и компилятор ни разу не поругался, а компонент на форме не появляется. Я сейчас экспериментирую с простейшим примером (мне так проще
разобраться): есть Memo в котором описан компонет TButton. В OnClick другой кнопки я делаю следующее:
NewComponent := StringToComponent( Memo1.Text );
NewComponent.Create( Form1 )

А она (Button) не хочет появляться и всё тут.
NewComponent у меня описан как TComponent. В чём тут дело, что я опять не так делаю. Помогите пожалуйста кто не занят.


Юрий Зотов   (2002-11-07 14:43:00) [5]

> А почему при вызове StringToComponent выскакивает сообщение о
> не нахождении какого-либо класса?

Класс самой формы и классы всех ее компонентов должны быть зарегистрированы в программе. Если она уже использует такую форму и такие компоненты, то они регистрируются автоматически и делать ничего не надо. Если же какой-то класс не используется, то перед чтением DFM нужно вызвать RegisterClass(es). Достаточно сделать это один раз, например в секции initialization главного модуля программы.


KoluChi   (2002-11-07 13:38:00) [6]

Result := BinStream.ReadComponent( nil );
так действительно не работает, попробуй
Result := BinStream.ReadComponent( Form1 );

P.S. А чем тебе не нравится ReadComponentResFile/WriteComponentResFile


Zhirnov Maxim   (2002-11-07 13:14:00) [7]

А почему при вызове StringToComponent выскакивает сообщение о не нахождении какого-либо класса? Что я не так объявил? Помогите пожалуйста.


KoluChi   (2002-11-07 11:41:00) [8]

Данный способ работает с бинарным DFM, для преобразования используй ObjectResourceToText, ObjectTextToResource.


KoluChi   (2002-11-07 11:28:00) [9]

Попробуй следующее (fido7.ru.delphi):
constructor TForm1.Create(AOwner: TComponent); // override;
var
fname: String;
begin
{ Для динамически создаваемых контролов, может требоваться
RegisterClasses(..); }
fname := FormFilename;
if FileExists( fname ) then
begin
CreateNew(AOwner);
ReadComponentResFile(fname, Self);
end
else
inherited Create( AOwner );
end;

procedure TForm1.FormCloseQuery( Sender: TObject;
var CanClose: Boolean);
begin
WriteComponentResFile(FormFileName, Self);
end;

{Peter Below, Vladimir Titov}


Zhirnov Maxim   (2002-11-07 11:18:00) [10]

После запуска этой функции (пример из помощи) выскакивает сообщение "Class TForm1 not found". В Value я передаю
содержимое dfm файла. Я в Delphi недавно, поэтому самому найти ошибку в своих действиях не удаётся. И ещё насколько я понял эта функция не воспринимает кириллицу. В dfm файле есть: "Caption = GUI интерфейс", и после запуска программы компилятор ругается на эту строчку. Как это обойти (не заключая "GUI интерфейс" в кавычки типа "")? Помогите пожалуйста.

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;


Zhirnov Maxim   (2002-11-05 21:11:00) [11]

Ребята извените, я больше так постараюсь не делать!!! :о(


Николай Быков   (2002-11-04 18:49:00) [12]


> Zhirnov Maxim © (03.11.02 18:17)
> Ленивый я

С таким подходом тебе инкто не поможет


Zhirnov Maxim   (2002-11-04 18:37:00) [13]

Помогите пожалуйста.


Zhirnov Maxim   (2002-11-03 18:17:00) [14]

Ленивый я - пока время не прижмёт разбираться не хотелось бы. Может у кого есть готовый пример? А Юрию ЗОТОВУ - ОГРОМНОЕ спасибо.


Zhirnov Maxim   (2002-11-03 17:39:00) [15]

Юрию Зотову - ОГРОМНОЕ спасибо. Теперь осталось во всём досканально разобраться. СПАСИБО!!!


Юрий Зотов   (2002-11-03 17:23:00) [16]

Создавайте разом всю форму. См. ObjectTextToBinary, ReadComponentReadComponentResFile и др. функции из группы streaming utilites. В хелпе есть, и даже с примерами.


Наверх

Титульная страница Поиск, карта сайта Написать письмо