Форум: "Основная";
Текущий архив: 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.009 c