Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Вниз

Почему падает TForm.Create?   Найти похожие ветки 

 
alexEagle   (2004-01-29 00:42) [0]

Я не могу понять почему два идентичных вызова одного и того же метода приводят к AccessViolation в одном случае и нормальной работе в другом.

Код такой:
procedure TfrmMain.ShowDispensers(bShow: Boolean=true);
...
frmTable := TfrmTable.Create(Self);
...


Причем программа падает, если вызов этой функции происходит из обработчика меню, и работает (по крайней мере окно создается), если вызвается в обработчике сообщения WM_USER в том же окне.

Трассировка не помогла, потому как ушел в дебри и потом застрял на нотификациях.

Люди добрые, поможите кто чем может :)


 
Германн   (2004-01-29 01:12) [1]

Кода слишком мало для анализа причин ошибки.


 
sniknik   (2004-01-29 08:23) [2]

в TfrmTable в onCreate чтонибудь делается? на самой форме чтонибудь лежит?
убери все и добавляй по одному действию/элементу, как начнет вылетать так найдеш причину.
но похоже(AccessViolation) у тебя там обрашение к чемуто что несоздано/уже освобождено.


 
Digitman   (2004-01-29 08:44) [3]


> alexEagle © (29.01.04 00:42)



> приводят к AccessViolation


"Search | Find Error ..." что говорит ? на какую строчку указывает ?


 
Broot   (2004-01-29 08:54) [4]

Self на что указывает при вызове из разных процедур? Попробуй на Application заменить


 
alexEagle   (2004-01-29 11:32) [5]

OnCreate отсуствует, self при создании один и тот же, в FormCreate даже не доходит - валится где-то в цепочке конструкторов (последний до которого мне позволила дойти трассировка - TControl.Create)


 
Плохиш   (2004-01-29 11:37) [6]

alexEagle © (29.01.04 11:32) [5]

Не используй в коде для TfrmTable переменньх, которые автоматически создаются в модулях с формами, на пр. frmTable.


 
alexEagle   (2004-01-29 11:38) [7]

Кроме того ошибка происходит по адресу 00000000 при попытке чтения из 00000000, так что Search|Find Error отдыхает


 
sniknik   (2004-01-29 11:48) [8]

ну если кода OnCreate нет, то это от того что на форме лежит.
один из вариантов при котором точно такой глюк будет...
например
ShowDispensers вызывается в OnCreate главной формы (первая обычно в списке создаваемых)
на форме TfrmTable (название) лежит грид в вместо таблицы, грид или любой другой db контрол, а этот грид подключен к таблице которая в датамодуле который не первый в списке создаваемых (обычно).

если у тебя так(или похоже) то проследи, чтобы вызовы с обрашением к обьектам были после создания а не до. (и не только твоем в коде, компоненты тоже учитывай)


 
alexEagle   (2004-01-29 11:51) [9]

чисто для плохиша -
if FViewType = dvtTable then frmTable := TfrmTable.Create(Self);
не работает так же как и
if FViewType = dvtTable then TfrmTable.Create(Self);


 
Anatoly Podgoretsky   (2004-01-29 11:57) [10]

alexEagle © (29.01.04 11:38) [7]
Очень конкретный адрес, где то используется неинициализированый объект.


 
Digitman   (2004-01-29 11:58) [11]


> alexEagle


если на этой строчке

frmTable := TfrmTable.Create(Self);

поставить брейкпойнт, а затем выполнить шаг (F8), то как раз здесь и проиходят "чудеса" ? я правильно понял ?


 
alexEagle   (2004-01-29 12:10) [12]

Да!
frmTable := TfrmTable.Create(Self);
или
TfrmTable.Create(Self);

Но объект так и не создается, в FormCreate не доходит, но уже падает


 
Юрий Зотов   (2004-01-29 12:19) [13]

1. В опциях проекта включите Use debug DCUs и сделайте Build.
2. Пройдите отладчиком свой констуктор и все унаследованные до TCustomForm включительно. Либо Вы найдете причину сбоя (что скорее всего), либо он будет на строке InitInheritedComponent. Последнее означает ошибку при заливке ресурсов (маловероятную).
3. Предположительно, в конструкторе Вы обращаетесь к какому-то лежащему на форме компоненту ДО вызова inherited Create.


 
alexEagle   (2004-01-29 12:20) [14]

Я скажу большее, я создал чистую форму и все равно валится


 
Silver Alex   (2004-01-29 12:25) [15]


> alexEagle © (29.01.04 12:20) [14]

код бы глянуть.Если хочешь вышли, посмотрим


 
alexEagle   (2004-01-29 12:48) [16]

Вобщем трассировка приводит к методу TComponent.Notification
Понять что происходит далее я не в силах, но падает в нем при вызове из метода TComponent.InsertComponent.


 
alexEagle   (2004-01-29 12:49) [17]

К сожалению код не могу выслать по нескольким причинам:
- сложность настройки IDE под проект
- это комерческий продукт, я не имею права на его сырцы


 
Digitman   (2004-01-29 12:50) [18]


> создал чистую форму и все равно валится


для "чистой" формы убери всякие self"ы и иже с ними в кач-ве владельца, поставь nil и смотри что получится


 
Anatoly Podgoretsky   (2004-01-29 12:53) [19]

Если для чистой формы, то проблема в библиотеках


 
alexEagle   (2004-01-29 13:20) [20]

С NIL получается то же самое. Какие библиотеки?


 
Digitman   (2004-01-29 13:25) [21]


> Какие библиотеки?


убери все лишнее из RTP либо пересобери проект без RTP

пробуй


 
Юрий Зотов   (2004-01-29 13:33) [22]

> alexEagle © (29.01.04 12:48) [16]

При создании формы у Вас где-то происходит обращение к компоненту, который еще не создан (вероятнее всего, еще не залит из DFM).

> трассировка приводит к методу TComponent.Notification

Там в параметрах есть AComponent. Посмотрите в окне Watches, чему равны его Name и ClassName (включив разрешение вызова функций). И проверьте текст Notification, если он замещался.

> падает в нем при вызове из метода TComponent.InsertComponent.

Посмотрите по стеку вызовов, откуда вызывается InsertComponent и еще выше. Нужна эта информация.


 
Digitman   (2004-01-29 13:43) [23]


> трассировка приводит к методу TComponent.Notification


о какой нотификации может идти речь, если форма "чистая" и имеет nil в кач-ве владельца ? непонятно ...


 
Юрий Зотов   (2004-01-29 13:47) [24]

> Digitman © (29.01.04 13:43) [23]

Значит, или не чистая, или Owner <> nil. Нам дают неточную информацию (вероятнее всего, из-за взаимного недопонимания).


 
alexEagle   (2004-01-29 13:48) [25]

Речь идет о внутренней нотификиции делфи - типа вставка элемента и т.д.


 
Digitman   (2004-01-29 13:54) [26]


> внутренней нотификиции делфи


а это здесь причем ? мы же о ран-тайме здесь говорим вроде бы ?


> типа вставка элемента и т.д


какое отношение это имеет к рассматриваемой "чистой" форме с owner=nil ? никакого !


 
sniknik   (2004-01-29 13:57) [27]

сомнения берут насчет того что форма чистая.

> Код такой:
> procedure TfrmMain.ShowDispensers(bShow: Boolean=true);
> ...
> frmTable := TfrmTable.Create(Self);
> ...
вместо него сделай такой код

procedure TfrmMain.ShowDispensers(bShow: Boolean=true);
begin
TForm.Create(nil).ShowModal;
end;

только именно такой! без отсебятины, и посмотри валится ли истинно "чистая" форма.


 
Digitman   (2004-01-29 13:58) [28]

к тому же , если уж при ран-тайм-трассировке код странным образом приводит к вызову методов Notification() и InsertComponent(), то в Evaluate/Modify всегда можно посмотреть, кто куда вставляется и/или извещается о чем-то ... на то есть 1-й параметр AComponent этих методов ..


 
alexEagle   (2004-01-29 14:03) [29]

TForm.Create(nil).ShowModal;
выдает ту же ошибку


 
Digitman   (2004-01-29 14:11) [30]

т.е., если в обработчике события TMenuItem (созданного, я полагаю, в дизайн-тайм) процедуре OnClick() сразу же (безо всяких там ShowDispensers) вызвать конструктор абсолютно "чистой" формы с owner=nil, то как раз эта ситуация и происходит ? если так - чудеса да и только)..


 
sniknik   (2004-01-29 15:21) [31]

alexEagle © (29.01.04 14:03) [29]
где идет вызов ShowDispensers?

десяток строк до, десяток после думаю не повредят секретности вашего проэкта.


 
sniknik   (2004-01-29 15:26) [32]

просто мне уже начинает казатся что меню в одной форме а процедура описана в другой.
хотя непонятно, так должно работать если форма существует.
действитильно чудеса.


 
Ihor Osov'yak   (2004-01-29 16:10) [33]

Да нет, чудес не бывает. Например, очень "умелое" юзание GetMem с последующим FreeMem, что то вроде
GetMem(p, 8);
FreeMem(p, 16);

напрочь сбивают с толку делфийский менеджер кучи, и после таких шедевров могут быть траблы, похожие на описанные выше, тот же эксепшен в безобидном конструкторе безобидного класса.


 
Digitman   (2004-01-29 16:15) [34]


> Ihor Osov"yak © (29.01.04 16:10) [33]


да нет) ... чудеса, думаю, всегда бывают, когда ищешь не там где потерял, а там где светлей)


 
YuRock   (2004-01-29 16:32) [35]

> Digitman © (29.01.04 16:15) [34]

> Чудеса всегда бывают, когда ищешь не там где потерял, а там где светлей

Красивый афоризм. Надо будет запомнить.


 
alexEagle   (2004-01-29 16:35) [36]

Спасибо всем кто ответил, решение проблемы я уже нашел.

На самом деле оказалось, что я допустил классическую ошибку С++-программиста, пишущего на делфи - забыл вызвать inherited Destroy в деструкторе дочернего для frmTable окна. Именно поэтому вылетало исключение впоследствии.

Ну не могу я привыкнуть к тому, что кроме того что вручную нужно вызывать деструктор, так еще и в деструкторе вручную нужно прописывать inherited Destroy.


 
Digitman   (2004-01-29 16:51) [37]


> забыл вызвать inherited Destroy в деструкторе дочернего
> для frmTable окна


поясни ...

о каком inherited Destroy и о каком "дочернем окне" может идти речь, если ты пытаешься создать "абсолютно чистую" форму и на этапе конструирования ты получаешь граблями ?
т.е о каком диструкторе м. идтим речь, если конструирование еще идет, и в нем нет ничего, что бы могло хоть как-то вести к "криминалу", уводящему в разрушение при исключении в констр.методе ??

сие есьм премного любопытно)...


 
sniknik   (2004-01-29 17:09) [38]

а как же

alexEagle © (29.01.04 14:03) [29]

> TForm.Create(nil).ShowModal;
> выдает ту же ошибку


 
alexEagle   (2004-01-29 17:09) [39]

На самом деле ошибка происходила не при создании окна, а через некоторое время после вызова деструктора frmTableItem, который создавался как дочернее окно для frmTable. поскольку происходила ошибка при работе с памятью то приложение падало не сразу а через некоторое время, и поскольку брэкпойнт стоял именно на создании frmTable, то падало именно тогда. Как оказалось впоследствии , оно могло падать и дальше и ближе. Все зависит от того где и что было запорото, но в последнем сообщением об ошибке все равно был указан адрес 00000000 поскольку если предыдущие можно было игнорировать то в этому случае двигаться видимо было некуда.

Экспериментально добивался работы программы на несколько секунд если оставлял MessageBox после окончания всех действий в процедуре ShowDispensers.

Одним словом, ребяты, не забывайте что ООП в делфи корявенькое!


 
sniknik   (2004-01-29 17:11) [40]

> Одним словом, ребяты, не забывайте что ООП в делфи корявенькое!
а ты без колес ездить не пытался? оправдываясь тем что привык на катере...


 
YuRock   (2004-01-29 17:13) [41]

> alexEagle © (29.01.04 17:09) [39]
> ООП в делфи корявенькое

Это у кого-то привычки корявенькие


 
Sandman25   (2004-01-29 17:17) [42]

[39] alexEagle © (29.01.04 17:09)

Сначала сделайте виртуальный конструктор на C++, а потом поговорим :)


 
Юрий Зотов   (2004-01-29 17:18) [43]

> alexEagle © (29.01.04 17:09) [39]
> Одним словом, ребяты, не забывайте что ООП в делфи корявенькое!

Извините, а на основании чего же Вы сделали такой вывод?

На основании того, в Delphi нет статических объектов? Но это не имеет к модели ООП никакого отношения.

Или на основании Ваших собственных ошибок, которые Вы описали? Так Delphi тоже не имеет к ним никакого отношения.

Сдается мне, что если человек не умеет ездить на велосипеде, то совсем не велосипед в этом виноват.


 
Digitman   (2004-01-29 17:19) [44]


> ООП в делфи корявенькое


оп-пааа !

вот эт заява !!!))))

а, по-моему, ты просто гонишь нам тут)

какие еще, нахрен, "дочерние окна" с учетом


> Я скажу большее, я создал чистую форму и все равно валится


?


 
alexEagle   (2004-01-29 17:26) [45]

я не знаю зачем нужен виртуальный конструктор, на знаю зачем не нужен inherited и альтернативный деструктор


 
Sandman25   (2004-01-29 17:29) [46]

[45] alexEagle © (29.01.04 17:26)

Вы делаете выводы на основе Ваших привычек.
На Informix-4GL пишется END IF после каждого IF. Так что, мне теперь говорить, что C и Паскаль не являются абсолютно структурными языками? :)


 
Digitman   (2004-01-29 17:30) [47]


> alexEagle © (29.01.04 17:26) [45]


еще раз повторяю - ты просто гонишь тут ботву !

в "чистой" форме НИКТО не понуждал тебя писать разные там


> виртуальный конструктор


> inherited и альтернативный деструктор


!!

форма и без этих волшебных для тебя выкрутасов замечательно сконструируется !

однако, ты утверждал якобы совершенно иное в [14]


 
Юрий Зотов   (2004-01-29 17:40) [48]

> alexEagle © (29.01.04 17:26) [45]

> я не знаю зачем нужен виртуальный конструктор,

А если бы знали, то поняли бы (и по достоинству оценили) всю мощь и элегантность этого механизма. Вполне возможно, что Ваше мнение об ООП в Delphi тогда сразу изменилось бы.

> знаю зачем не нужен inherited и альтернативный деструктор
Не нужны? А как же наследование полиморфизм? Разве это не два из трех китов самого понятия ООП?

Сдается мне, что не знаете Вы на самом деле совсем другого - известной басни Крылова.


 
YuRock   (2004-01-29 17:59) [49]

> Digitman © (29.01.04 17:30) [47]
> ты просто гонишь тут ботву

Нет, он не гонит. Просто он неточно выразился. Эти дочерние окна (которые неправильно выгружались перед созданием frmTable) становятся таковыми по настройке.

Вначале они - обычные MDIChild, а по нажатию на пункт меню - они удаляются, создается frmTable, а затем те же "дочерние окна" создаются через CreateParented на frmTable.

Вот так у него все построено, так что он не гонит.

И ничего удивительного нет, что на TForm.Create(nil).Show тоже падало - ведь на самом деле память поролась при удалении этих, я бы так назвал, "в будущем дочерних" окон.

> ты просто гонишь тут ботву

А вот ругаться неприлично!!!


 
Digitman   (2004-01-29 18:08) [50]


> YuRock © (29.01.04 17:59) [49]


> А вот ругаться неприлично!!!


да что ты говоришь ?)

где ж ты был, когда сей сударь гнул из себя пупа земли, рассыпаясь в мой адрес далеко-о-о неласковыми перлами, вообще не имеющими отношения к программингу ?)

а вот я помню прекрасно)

считай, что я просто отвел душу).. после - не будешь же возражать ? - искренних и вполне корректных с моей стороны попыток здесь, в этой ветке, помочь "заблудшему" ...

но я тоже человек ! со своими недостатками ...
и прошлые мои с ним "околопрограммные баталии" + сегодяшнее [39] несколько вывели меня из себя...

каюсь(..


 
sniknik   (2004-01-29 18:17) [51]

YuRock © (29.01.04 17:59) [49]
раз уж ты понимаеш как это происходит напиши пример этого глюка (так чтобы TForm.Create(nil).ShowModal падал).
минимум кода, лиш бы падал. а то у меня не получается. яшик в анкете и в имени, шли в любое время.
буду очень благодарен. (мне это очень интересно)

(alexEagle не прошу, код из под его пальцев видимо жутко секретен, его через охрану не пропустят)


 
Anatoly Podgoretsky   (2004-01-29 18:45) [52]

alexEagle © (29.01.04 17:09) [39]
Поделись травкой.


 
YuRock   (2004-01-29 18:49) [53]

> Anatoly Podgoretsky © (29.01.04 18:45) [52]
> Поделись травкой

Он не курит.

А тебе плохо не становится, когда подобную ошибку ищеш в течении 2-х суток?


 
YuRock   (2004-01-29 18:50) [54]

... ищеш = ищешь


 
Юрий Зотов   (2004-01-29 19:23) [55]

> YuRock © (29.01.04 18:49) [53]

Всяко бывает. Но уверяю Вас, если обвинять в собственных ошибках "кривую ООП в Delphi", то количество ошибок и время их поиска уменьшаться не будут. А вот наоборот - так это почти наверняка.


 
Андрей Сенченко   (2004-01-29 20:48) [56]

эхма .. а приятно таки наблюдать битву Мастеров за чистоту своей Системы ...
для человека пишущего скрипты на 5 операторах :)

В потрепаться ?



Страницы: 1 2 вся ветка

Форум: "Основная";
Текущий архив: 2004.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.01 c
1-29437
Yarcev
2004-01-30 12:55
2004.02.10
Отчеты


1-29335
C@esar
2004-01-25 14:25
2004.02.10
POPUP MENU XP


3-29269
SnapIn
2004-01-17 12:09
2004.02.10
Поместить результат селекта в переменную


7-29624
Maxio
2003-11-25 12:33
2004.02.10
Мегание Label


14-29615
Rouse_
2004-01-19 00:02
2004.02.10
Профессиональная работа...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский