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

Вниз

Помогите с созданием компонентов из dfm файла.   Найти похожие ветки 

 
Zhirnov Maxim ©   (2002-11-03 17:05) [0]

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


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

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



 
Zhirnov Maxim ©   (2002-11-03 17:39) [2]

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


 
Zhirnov Maxim ©   (2002-11-03 18:17) [3]

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


 
Zhirnov Maxim ©   (2002-11-04 18:37) [4]

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


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


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

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


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

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


 
Zhirnov Maxim ©   (2002-11-07 11:18) [7]

После запуска этой функции (пример из помощи) выскакивает сообщение "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;


 
KoluChi ©   (2002-11-07 11:28) [8]

Попробуй следующее (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}


 
KoluChi ©   (2002-11-07 11:41) [9]

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


 
Zhirnov Maxim ©   (2002-11-07 13:14) [10]

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


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

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

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



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

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

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


 
Zhirnov Maxim ©   (2002-11-07 16:05) [13]

> 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. В чём тут дело, что я опять не так делаю. Помогите пожалуйста кто не занят.


 
Zhirnov Maxim ©   (2002-11-07 18:36) [14]

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


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

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

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


 
Zhirnov Maxim ©   (2002-11-08 17:49) [16]

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
1-59118
NaZGHUL
2002-11-08 12:15
2002.11.18
Помогите!!!!!


1-59194
lolita
2002-11-06 13:02
2002.11.18
Delphi HELP !!!


14-59434
Agent Smith
2002-10-30 17:24
2002.11.18
VirtualCD & WinXP


1-59170
wmz
2002-11-08 18:54
2002.11.18
Просмотр


1-59212
Sergic
2002-11-06 14:14
2002.11.18
создание собственных типов при использовании COM