Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.18;
Скачать: [xml.tar.bz2];

Вниз

Помогите с созданием компонентов из 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
1-59239
TTCustomDelphiMaster
2002-11-06 14:45
2002.11.18
Пользовательские сообщения


1-59200
Lexey
2002-11-06 11:36
2002.11.18
Какие продукты Borland являются бесплатными???


6-59303
@Ujin
2002-09-22 12:49
2002.11.18
как сделать attach и


3-59008
koks
2002-10-29 11:55
2002.11.18
QuantumGrid: 2 вопроса


3-59023
GenDOS
2002-10-29 16:09
2002.11.18
Где взять BDE? Нужен дистрибутив, отдельный.





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