Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Gorezcaid
15 / 15 / 0
Регистрация: 09.08.2010
Сообщений: 90
#1

Динамическое создание формы

10.02.2013, 17:57. Просмотров 1688. Ответов 5
Метки нет (Все метки)

Всем привет, есть малый вопрос насчет передачи параметров.Пишу уже свои функции.
Сейчас пишу функции для работы с несколькими формами. Кратко о проблеме, по порядку:

1) Создал ещё одну форму Unit1 in 'StartUnit\Unit1.pas' {Form1}
2) Отключил её авто создание в Project - Options (для меня так требуется)
3) Как должно выглядеть без функции:
Delphi
1
2
3
4
5
procedure TForm1.Button1Click(Sender: TObject);
begin
   if(not Assigned(Form1))then//Если форма не существует,
   Form1:=TForm1.Create(Application);//Создать её
end;
4) Пытался написать функцию по выделению памяти для формы
Delphi
1
2
3
4
5
6
7
8
9
10
function fTest(pForm:TForm1):TForm1;
begin
   if(not Assigned(pForm))then//Если форма не существует,
   pForm:=TForm1.Create(Application);//Создать её
   Result:=pForm;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
   Form1:=fTest(Form1);
end;
5) Теперь в чем проблема
Как видно эта функция может создавать форму только для Form1, созданный с типом TForm1.
Как переписать функцию, чтобы можно было по переданному параметру pForm создавать формы для любого типа данных. Все формы происходят от одного типа TForm, но всё равно не получается это реализовать, выдает ошибку
[Error] MainUnit.pas(78): Incompatible types: 'TForm1' and 'TForm'

PS: В 4-м пункте "рабочий" пример, TForm1 нужно как-то передать через TForm.
Это только пример, структура проекта - сложнее.

Заранее спасибо.

Добавлено через 7 минут
Можно ещё проще, как из формы Form1 получить указатель на её класс TForm1
???

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.02.2013, 17:57
Ответы с готовыми решениями:

Динамическое создание формы
Всем привет. Возникла проблема при динамическом создании новой формы: На Form1...

Динамическое создание формы
вот например мне надо динамически создать новою TForm1 и обязательно присвоить...

Динамическое создание формы
Добрый день. Подскажите пожалуйста, можно-ли в Delphi динамически создавать...

Динамическое создание формы
Здравствуйте, помогите написать приложение, где на форме есть кнопка «создать...

Динамическое создание формы и компонентов
Всем доброго времени суток. Вопрос про динамическое создание форм очень много...

5
FIL
Модератор
3411 / 2549 / 724
Регистрация: 19.09.2012
Сообщений: 7,919
10.02.2013, 18:06 #2
Ты можешь четко вопрос сформулировать? А то текста много, и не понятно нифига.
Надо создать несколько одинаковых форм (таких, как Форм1) или что?
0
Gorezcaid
15 / 15 / 0
Регистрация: 09.08.2010
Сообщений: 90
10.02.2013, 18:09  [ТС] #3
Сейчас почитал, мне нужно "Имя класса объекта"
0
FIL
Модератор
3411 / 2549 / 724
Регистрация: 19.09.2012
Сообщений: 7,919
10.02.2013, 18:13 #4
Delphi
1
Form1.ClassName
1
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25728 / 17282 / 6865
Регистрация: 22.10.2011
Сообщений: 30,492
Записей в блоге: 6
10.02.2013, 18:15 #5
У объекта есть свойство ClassName, только это тебе не поможет, если объект не был создан (при попытке обратиться к этому свойству несозданного объекта программа просто вылетит и всё). Теперь что тебе надо?

Почему не создавать экземпляр по имени класса? GetClass никто не отменял... Передавай в свою функцию именно имя класса как строку, и создавай любые формы.
1
Gorezcaid
15 / 15 / 0
Регистрация: 09.08.2010
Сообщений: 90
10.02.2013, 19:03  [ТС] #6
Да, это, но с внешними формами не работает.

//Главная форма - нормально
ShowMessage(MainForm.ClassName);//Форма MainForm имеет класс TMainForm

//Подключенная форма
ShowMessage(Form1.ClassName);//выдает ошибку "Acces violation"

Добавлено через 4 минуты
А простой пример с GetClass() можете привести?

Добавлено через 42 минуты
Нашел тему в интернете "Открыть форму зная ее название"
В Unit1:
Delphi
1
2
3
4
5
6
...
implementation
 
initialization RegisterClasses([TForm1]);
{$R *.dfm}
...
На кнопку для создания формы
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var
Form : TForm;
FrmClass : TClass;
s : string;
begin
s:='TForm1'; //вот тут вытягиваешь имя формы из массива
FrmClass:=GetClass(s); //по имени ищем класс
Form:=nil;
if (FrmClass<>nil) and FrmClass.InheritsFrom(TForm) then
Form:=TFormClass(FrmClass).Create(nil);// и создаем обьект
 
if Form=nil then //обрабатываем возможные ошибки
begin
MessageDlg('Нет формы с таким именем', mtError, [mbOk], 0);
Exit;
end;
Form.Show;
end;
Регистрация класса - обязательна.
Осталось только переработать этот хлам, всем спасибо.
0
10.02.2013, 19:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.02.2013, 19:03

Динамическое создание формы и компонентов
Подскажите как динамически создать форму с Edit и Button и при нажатии на...

Динамическое создание формы + проверка при создании
Здравствуйте. Есть форма, которая создается динамически. mot :=...

Динамическое создание формы, по нажатию в области которой создается кнопка
Ребят, я тут запутался немного. Посмотрите код, пожалуйста. Мне нужно написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru