powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Child Forms Acces Violation
11 сообщений из 11, страница 1 из 1
Child Forms Acces Violation
    #32124361
vislex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравсвтуйте!

Прошу прощение за то что вопрос может быть избитый, но все же помогите пожалуйста разобраться.

Создаю дочернюю форму из формы №1 (к примеру)
NewPrihod_NaklForm:=TNewPrihod_NaklForm.Create(Self);
Все работает.

Создаю дочернюю форму из формы №2 (к примеру)
NewPrihod_NaklForm:=TNewPrihod_NaklForm.Create(Self);

тоже вроде работает.
Так вот стоит мне опять создать дочернюю форму из формы №1 так возникает Access Violation. Глюк наблюдается с родительской формой.
Если я вместо Self укзываю название главной формы приложения, то все работает, но это некорректно.

Спасибо
С Уважением, Алексей
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124387
m_kus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаёшь, а потом удаляешь? Каким образом удаляешь?
Для создания форм есть специальная процедура - Application.CreateForm(...), почему ей не пользуешься?
И вообще, как то не очень понятно написан вопрос (оттого я так туманно и отвечаю), можно поподробней?

Могу предположить что, форма 2 уничтожается, унося с собой NewPrihod_NaklForm, а где-то остаются ссылки на эту самую NewPrihod_NaklForm, обращение к которым и вызывает всеми любимый Access Violation
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124441
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для создания форм есть специальная процедура - Application.CreateForm(...), почему ей не пользуешься?

Это чем же таким она специальная? Не надо людей с толку сбивать. Тем более, что этой процедурой можно создать форму с владельцем TApplication - а это не нужно делать во многих случаях. Почти всегда я бы сказал.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124727
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
By default, a form owns all components that are on it. In turn, the form is owned by the application. Thus when the application shuts down and its memory is freed, the memory for all forms (and all their owned components) is also freed.

И почему же почти во всех случаях не нужно создавать форму с владельцем Application ? Я бы сказал, что как раз узкоспециальные случаи.

В данном случае впрочем, могу предположить, что указание Application не спасет. Возможно, при повторном создании из формы №1, предыдущая форма не была уничтожена; или она уничтожается неправильно.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124738
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
И почему же почти во всех случаях не нужно создавать форму с владельцем Application? Я бы сказал, что как раз узкоспециальные случаи.

И что же в ней такого особенного? Чем она лучше TForm.Create(Owner)?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
  Instance: TComponent;
begin
  Instance := TComponent(InstanceClass.NewInstance);
  TComponent(Reference) := Instance;
  try
    Instance.Create(Self);
  except
    TComponent(Reference) := nil;
    raise;
  end;
  if (FMainForm = nil) and (Instance is TForm) then
  begin
    TForm(Instance).HandleNeeded;
    FMainForm := TForm(Instance);
  end;
end;


Прежде чем кидаться словами из пошлой книги, не мешает исходники глянуть.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124739
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если у тебя приложение MDI, никогда не закладывайся на переменные, как ты делаешь NewPrihod_NaklForm:=TNewPrihod_NaklForm.Create(Self);

Я делаю так

Код: plaintext
1.
with TNewPrihod_NaklForm.Create(Application.MainForm) do
  Init;
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124757
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И почему же почти во всех случаях не нужно создавать форму с владельцем Application? Я бы сказал, что как раз узкоспециальные случаи.

Когда захочется добраться из одной формы до формы, создавшей ее, тогда станет понятно, почему Application не подходит. И чтобы не вспоминать потом, какие как создавал, лучше все создавать явно указывая владельца-форму.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32124914
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 eNose:
Не знаю, что ты хотел сказать этим пошлым кодом.
...
Instance.Create(Self);
...
Чем является Self у метода Application.CreateForm, как ты думаешь?
Кстати, пошлой книгой является Help.

2 tygra:
Ну по мне, добираться из одной формы до формы, создавшей ее, - как раз и есть узкоспециальный случай. Возможно, у тебя без этого не обойтись - с другой стороны, хорошей практикой является работа внутри формы, т.е. локализации области видимости.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32125327
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
aag, найди 10 отличий:
Form1 := TForm1.Create(Application)
и
Application.CreateForm(TForm1, Form1)
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32125347
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 eNose:
По существу этих отличий нет, так с этим я и не спорил. Я полемезировал :) с Тигрой по поводу нужности/полезности создания формы с владельцем Application. Мое мнение - за редким исключением - это нужно.
...
Рейтинг: 0 / 0
Child Forms Acces Violation
    #32125349
Фотография eNose
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[не активирован]
[не одобрен]
2 aag: можно делать так, как душе угодно. Но вот проблемы с поиским предка возникают у людей, привыкших к Application.CreateForm... По-моему, лучше явно указывать предка (чаще всего можно nil указать).
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Child Forms Acces Violation
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]