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

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

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

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

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

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

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

Это чем же таким она специальная? Не надо людей с толку сбивать. Тем более, что этой процедурой можно создать форму с владельцем TApplication - а это не нужно делать во многих случаях. Почти всегда я бы сказал.
...
Рейтинг: 0 / 0
21.03.2003, 15:08
    #32124727
aag
aag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Child Forms Acces Violation
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
21.03.2003, 15:15
    #32124738
eNose
Участник
[не активирован]
[не одобрен]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Child Forms Acces Violation
И почему же почти во всех случаях не нужно создавать форму с владельцем 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
21.03.2003, 15:16
    #32124739
pkarklin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Child Forms Acces Violation
Если у тебя приложение MDI, никогда не закладывайся на переменные, как ты делаешь NewPrihod_NaklForm:=TNewPrihod_NaklForm.Create(Self);

Я делаю так

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

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

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


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