Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
1

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

23.11.2014, 22:15. Просмотров 739. Ответов 12
Метки нет (Все метки)

Всем привет. Возникла проблема при динамическом создании новой формы:
На Form1 есть кнопка при нажатии которой создается Form2.
Так же в Unit2 есть процедура TForm2.Create(Sender: TObject) в которой при создании формы я задаю свойства Width, Height, Left, Top... Вылетает ошибка: Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 0042C61D in module 'Project1.exe'. Read of address 0000004C'. Process stopped. Use Step or Run to continue. После повторного вызова все что находиться в процедуре Form2.Create не выполняется. В чем дело ребят помогите...

Код программы:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
uses Unit2;
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  if (not Assigned(Form2)) then
  Form2:=TForm2.Create(Self);
  Form2.Show;
end;
 
end.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm2 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2: TForm2;
 
implementation
 
{$R *.dfm}
 
procedure TForm2.FormCreate(Sender: TObject);
begin
  Form2.Width:= 500;
  Form2.Height:= 600;
end;
 
end.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2014, 22:15
Ответы с готовыми решениями:

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

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

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

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

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

12
FIL
Модератор
3431 / 2561 / 732
Регистрация: 19.09.2012
Сообщений: 7,933
23.11.2014, 22:35 2
Добавь:
Delphi
1
2
3
4
5
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  Form2 := nil;
end;
0
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
23.11.2014, 22:39  [ТС] 3
Не помогло.
Я не думал что обработчик OnClose как то тут связан.
0
FIL
Модератор
3431 / 2561 / 732
Регистрация: 19.09.2012
Сообщений: 7,933
23.11.2014, 22:43 4
Из dpr-файла создание Form2 убрано?
0
northener
пофигист широкого профиля
3447 / 2343 / 634
Регистрация: 15.07.2013
Сообщений: 13,878
23.11.2014, 22:51 5
Думаю что приведенный в топике код неполный или не точный.
0
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
23.11.2014, 23:02  [ТС] 6
Из файла проекта Form2 убрано, форма создается динамически. Код полный не знаю в чем проблема.
после ошибки останавливается на:
Delphi
1
  Form2:=TForm2.Create(Self);
Добавлено через 5 минут
Файл проекта:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
program Project1;
 
uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2};
 
{$R *.res}
 
begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
0
northener
пофигист широкого профиля
3447 / 2343 / 634
Регистрация: 15.07.2013
Сообщений: 13,878
23.11.2014, 23:21 7
Цитата Сообщение от Veg2zA Посмотреть сообщение
Код полный
Тогда в нем не могло появиться AV.
0
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
23.11.2014, 23:28  [ТС] 8
факт остается фактом. Это может быть связана с неполной совместимостью Delphi 7 и Win7?
0
northener
пофигист широкого профиля
3447 / 2343 / 634
Регистрация: 15.07.2013
Сообщений: 13,878
23.11.2014, 23:52 9
Цитата Сообщение от Veg2zA Посмотреть сообщение
факт остается фактом.
Заархивируй проект и прикрепи к сообщению.
Цитата Сообщение от Veg2zA Посмотреть сообщение
Это может быть связана с неполной совместимостью Delphi 7 и Win7?
Нет никакой несовместимости. Ни полной ни неполной.

Добавлено через 4 минуты
И прежде убедись, что переменная Form2: TForm2; описана только в одном месте!
0
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
24.11.2014, 00:05  [ТС] 10
Я работаю над основным проектом возникла такая ошибка, думал где то ошибся. Создал новый чистый проект с 1 кнопкой, проблема такая же.
Project1.zip
0
northener
пофигист широкого профиля
3447 / 2343 / 634
Регистрация: 15.07.2013
Сообщений: 13,878
24.11.2014, 00:14 11
Лучший ответ Сообщение было отмечено Veg2zA как решение

Решение

А ну да. Совсем забыл, что ссылка на экземпляр класса внутри события OnCreate еще не валидна.
Вот так надо.
Delphi
1
2
3
4
5
procedure TForm2.FormCreate(Sender: TObject);
begin
  Width:= 500;
  Height:= 600;
end;
И впредь никаких упоминаний переменных указывающих на экземпляр класса внутри методов этого класса!
1
Veg2zA
0 / 0 / 0
Регистрация: 23.11.2014
Сообщений: 6
24.11.2014, 00:19  [ТС] 12
Спасибо огромное, сам уже загнался, всю голову сломал.
0
northener
пофигист широкого профиля
3447 / 2343 / 634
Регистрация: 15.07.2013
Сообщений: 13,878
24.11.2014, 03:15 13
Цитата Сообщение от Veg2zA Посмотреть сообщение
Спасибо огромное, сам уже загнался, всю голову сломал.
Да не за что.
Будь это не воскресным вечером, нашел бы ошибку раньше.
0
24.11.2014, 03:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2014, 03:15

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

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

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


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

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

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