Форум: "Основная";
Текущий архив: 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.012 c