Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.11.2012, 11:05   #1
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
Восклицание Создание форм из процедуры

Здравствуйте!

Подскажите пожалуйста как можно написать процедуру такого типа.
У меня имеется 3 кнопки каждая из которых открывает свое окно таким способом

Код:
procedure TForm1.TButonn1Click(Sender: TObject);
  begin
    Form2 := Form2.Create(nil);
    Form2 .Caption := 'Forma2';
    Form2 .Show;
    Enabled  :=  False; //Сделаем не доступной форму Form1
  end;
И так на остальные кнопки меняется только Form2,3,4.
Так вот работает все замечательно, но писать на каждую кнопку столько строк не хочется и решил написать процедуру такого типа.

Код:
public
   procedure FCreate(FName:TForm; FClass:TFormClass; FTitle:string);

procedure TForm1.FCreate(FName:TForm; FClass:TFormClass; FTitle:string);
  begin
    FName := FClass.Create(nil);
    FName.Caption := FTitle;
    FName.Show;
    Enabled  :=  False; //Сделаем не доступной форму Form1
  end;
и на кнопку следующий обработчик
Код:
procedure TForm1.TButonn1Click(Sender: TObject);
  begin
    FCreate(Form2, TForm2, 'Forma2');
  end;
И так далее на каждую кнопку. Все вроде работает.
Но если такую же процедуру сделать на одной из создаваемых форм то при закрытии этих форм вылетает ошибка.

"access violation at 0x008a454d"

Последний раз редактировалось DIMASIKXXX32; 15.11.2012 в 11:23.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 15.11.2012, 11:12   #2
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
когда указываю что form1 нужно enabled=true
Хотелось бы увидеть где и как вы это делаете
P.S. если нужно просто блокировать форму, то достаточно "FName.Show;" заменить на "FName.ShowModal;", и не заморачиваться со всякими Enabled =)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 15.11.2012, 11:21   #3
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Хотелось бы увидеть где и как вы это делаете
P.S. если нужно просто блокировать форму, то достаточно "FName.Show;" заменить на "FName.ShowModal;", и не заморачиваться со всякими Enabled =)

Вот исходник http://narod.ru/disk/63711956001.760...sdasd.rar.html

Удалил все не нужное из папки

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Хотелось бы увидеть где и как вы это делаете
P.S. если нужно просто блокировать форму, то достаточно "FName.Show;" заменить на "FName.ShowModal;", и не заморачиваться со всякими Enabled =)
Согласен что можно использовать ShowModal но в моей программе по этим кнопкам создаются формы справочников на которых имеются кнопки добавление и редактирование по которым создается форма добавления и редактирования.

Последний раз редактировалось Stilet; 15.11.2012 в 12:48.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 15.11.2012, 11:31   #4
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
Плохо

Ай-яй-яй, как нехорошо с вашей стороны...
Изображения
Тип файла: jpg virus.jpg (42.0 Кб, 41 просмотров)
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 15.11.2012, 11:32   #5
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Мне кажется что то не правильно написано в процедуре создания

потому что если написать на Form1 обработчик по кнопке Button1
Код:
  Form2:=TForm2.create(nil);
  Form2.show;
  Form1.Enabled:=False;
А потом в написать на Form2 обработчик по кнопке Button1

Код:
  Form5:=TForm5.create(nil);
  Form5.show;
  Form2.Enabled:=False;
И при закрытии Form5 написать
Код:
  Form2.Enabled:=True;
  Action := caFree
То работает все ок.

Цитата:
Сообщение от Luuzuk Посмотреть сообщение
Ай-яй-яй, как нехорошо с вашей стороны...
ой извени не то скинул

http://narod.ru/disk/63711956001.760...sdasd.rar.html

Удалил все не нужное из папки

Последний раз редактировалось Stilet; 15.11.2012 в 12:51.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 15.11.2012, 11:38   #6
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure TForm1.TButonn1Click(Sender: TObject);
begin
  Form2 := Form2.Create(nil);
  Form2 .Show;
end;
Здорово, конечно, придумано, но попробуйте ответить на такой вопрос.
Если на кнопку Button1 нажать еще раз и еще... Что будет?

Правильно, в памяти будут плодиться экземпляры формы с потерянными ссылками на них (в этой ситуации разработчика от короткой расправы спасет только закрытие программы).
Поэтому, если создаете форму динамически, то:
- не давать создавать ее более чем один раз;
- если нужно больше форм одного класса, то придумать механизм хранения ссылок на экземпляры такой формы;
- или как справедливо сказано выше Luuzuk'ом запускать форму в модальном режиме, а по выходе память ею занятую освобождать (метод Free);
Прик вне форума Ответить с цитированием
Старый 15.11.2012, 11:40   #7
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

Цитата:
Сообщение от Прик Посмотреть сообщение
Код:
procedure TForm1.TButonn1Click(Sender: TObject);
begin
  Form2 := Form2.Create(nil);
  Form2 .Show;
end;
Здорово, конечно, придумано, но попробуйте ответить на такой вопрос.
Если на кнопку Button1 нажать еще раз и еще... Что будет?

Правильно, в памяти будут плодиться экземпляры формы с потерянными ссылками на них (в этой ситуации разработчика от короткой расправы спасет только закрытие программы).
Поэтому, если создаете форму динамически, то:
- не давать создавать ее более чем один раз;
- если нужно больше форм одного класса, то придумать механизм хранения ссылок на экземпляры такой формы;
- или как справедливо сказано выше Luuzuk'ом запускать форму в модальном режиме, а по выходе память ею занятую освобождать (метод Free);
Я согласен но для этого по моему просто будет достаточно проверять создана ли эта форма или нет если да то просто показать ее

Или я не прав

На счет проверки это понятно. вопрос в том что если создать форму 2 а потом из нее создать еще одну форму на пример form5 и по закрытии form5 сослатся на форму 2 то вылетает ошибка

Последний раз редактировалось Stilet; 15.11.2012 в 12:53.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 15.11.2012, 11:44   #8
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

на OnClose закрываемой формы делать
Код:
Action:=caFree;
и должно отпустить )
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 15.11.2012, 11:47   #9
DIMASIKXXX32
Пользователь
 
Регистрация: 26.01.2010
Сообщений: 72
По умолчанию

http://www.programmersforum.ru/showp...78&postcount=8

Это понятно так и делается

Здесь вируса нет!!!

Народ ну никто не подскажет в чем проблема?

Последний раз редактировалось Stilet; 15.11.2012 в 12:54.
DIMASIKXXX32 вне форума Ответить с цитированием
Старый 15.11.2012, 13:30   #10
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Ну, хотя бы так:
Код:
function TForm1.FCreate(FClass: TFormClass; FTitle: string) : TForm;
begin
  Result := FClass.Create(nil);
  Result.Caption := FTitle;
  Result.Show;
  Enabled := False; //Сделаем не доступной форму Form1
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2 := TForm2(FCreate(TForm2, 'Forma2'));
end;
TForm2 и TForm3 и TForm - это разные классы и они требуют приведения типов, а в процедуре этого не происходило и Form2, к примеру, все равно ни на что не указывало (nil). При обращении выходило AV.
Прик вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
БД Создание запроса и форм Lena_ Помощь студентам 0 18.10.2012 14:39
Создание форм Михаил Юрьевич Общие вопросы Delphi 5 16.07.2012 03:41
Создание нескольких форм Лера123 Общие вопросы Delphi 4 16.10.2010 18:16
Создание форм DeNyS=) Microsoft Office Access 2 13.12.2009 15:30
Создание нескольких форм в одной Лукманов Александр Общие вопросы Delphi 1 11.04.2009 13:08