Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интерфейсная бага VFP приводящая к ошибке 0xc0000005 / 8 сообщений из 8, страница 1 из 1
01.02.2006, 17:25
    #33516897
Krey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Коротко об ошибке. Если в проекте используются MDI формы и у какой-то из них установлено свойство MaxButton = .F., то при определенном стечении обстоятельств приложение сваливаеться с ошибкой доступа к памяти (0xc0000005).
У меня в приложении это было так: есть базовый класс формы проекта frmbase от которого наследуються все классы форм проекта. В базовой форме св-во MDIForm = .t.
Есть базовый класс диалога frmdialog, наследующийся от frmbase. В нем MaxButton=.f. MDIForm = .t. (забыл убрать)

Действия пользователя:
Вызов экземпляра диалога.
Вызов из диалога формы с гридом.
Выход из формы.
Закрытие диалога.
Приложение сваливаеться если до вызова диалога существовала какая-либо форма, развернутая на весь экран.

Код демонстрирующий ошибку:
Код: plaintext
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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
* Определения классов
DEFINE CLASS MaxMDIFormClass as Form
	MDIForm = .t.	
	WindowState =  2 
ENDDEFINE

DEFINE CLASS ReleaseButtonClass as CommandButton
	Caption = "Close"
	PROCEDURE Click
		thisform.release()
	ENDPROC
ENDDEFINE

DEFINE CLASS CallButtonClass as CommandButton
	Caption = "Show"
	PROCEDURE Click
		LOCAL loForm
		loForm = CREATEOBJECT("FormChildClass")
		loForm.show( 1 )
	ENDPROC
ENDDEFINE

DEFINE CLASS FormChildClass as Form
	MDIForm = .t.	
	ADD Object button1 as ReleaseButtonClass 
ENDDEFINE

DEFINE Class FormParentClass as Form
	MDIForm = .t.	
	MaxButton = .f.
	WindowType =  1 
	ADD Object button as CallButtonClass
	ADD Object button2 as ReleaseButtonClass WITH Top =  20 
ENDDEFINE


* Код
PUBLIC MaxMDIForm as MaxMDIFormClass
MaxMDIForm = CREATEOBJECT("MaxMDIFormClass")
MaxMDIForm.show()

LOCAL FormParent as FormParentClass
FormParent = CREATEOBJECT("FormParentClass")
FormParent.show()

К сожалению эта ошибка трудно воспроизводима в реальном приложении. Что бы ее локализовать мне пришлось очень долго перепахивать весь проект, постепенно убирая из форм все что не приводит к ошибке, до тех пор пока не остались пустые формы со свойствами MDIForm = .t. и MaxButton = .f. :-). Поэтому если вы используете MDI формы и ваше приложение иногда сваливаеться с 0xc0000005 проверьте св-во MaxButton.
...
Рейтинг: 0 / 0
01.02.2006, 17:32
    #33516928
Krey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
*проверьте св-во MaxButton
хотел сказать проверьте св-во MDIForm в формах, которые не должны раскрываться на весь экран.
...
Рейтинг: 0 / 0
01.02.2006, 18:08
    #33517059
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Баг конешно на лицо, но он не связан непосредственно с тем как фокс очищает память от объектов. Судя по всему какой-то конфликт с системным меню. Поставь SET SYSMENU OFF и баг пропадет.
...
Рейтинг: 0 / 0
01.02.2006, 18:26
    #33517120
Krey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Я и не говорил что связан. Это другая история.
Если убрать меню баг действительно пропадает, но зачем его убирать?. Пользователь здорово нервничает когда у него окно программы дергаеться. Гораздо правильней убрать MDIForm с окна, которое не должно раскрываться на весь экран, т.к. на это св-во на это окно не должно распространяться.
...
Рейтинг: 0 / 0
02.02.2006, 01:45
    #33517729
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Hi Krey!

Да, а собственно перед падением можно заметить "лишнюю" иконку системного
меню - слева от первого пункта главного меню - т.е. судя по всему, фокс
"забывает" убрать эту иконку, т.к. считает что после закрытия
максимизированной MDIForm очередная активизируемая MDI форма (а это по сути
есть "предыдущая форма") тоже будет максимизируемой, но это не так - вот это
самое системное меню потом и вызывает падение.
При этом если закрывать форму не по кнопке (ThisForm.Release()), а через это
самое системное меню, или "крестик", или хоткеем Ctrl+F4 - то проблемы не
будет - тогда это "встраиваемое" системное меню удалится при закрытии формы.
Даже программная эмуляция вида
KEYBOARD '{CTRL+F4}'
и та прячет проблему.
Вообще-то стоит это дело послать в MSFT как багрепорт. В VFP9SP1 проблема
имеет место быть.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
02.02.2006, 11:16
    #33518310
Krey
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
В VFP9 без SP тоже есть, и боюсь что в VFP8SP1 тоже присутствует. Проверять лень.

Баг репорт пошлите сами, у меня начальство-скряги и Fox соответственно пиратский. Незачем светиться лишеий раз.

Насчет того почему этот баг возникает здесь не все ясно. Ясно только то, что это как-то связано с интегрированием меню окна.
После закрытия формы FormChildClass форма MaxMDIFormClass переходит в нормальный режим окна. Соответственно MDI тут не работает. Кроме того мне не понятно почему система валиться только после выгрузки FormParentClass. Т.е. если ее скрыть, но оставить висеть в памяти программа "временно" работает.
...
Рейтинг: 0 / 0
02.02.2006, 11:55
    #33518426
Crip
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Да это один из тех багов которые кочуют в фоксе от версии к версии. Просто мало кому удается их четко выделить. Я для интереса пустил код на VFP6. Фокс отругался на меню, но не упал. Отсюда кстати и сделал вывод.
...
Рейтинг: 0 / 0
03.02.2006, 02:59
    #33520652
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Интерфейсная бага VFP приводящая к ошибке 0xc0000005
Hi Krey!

> В VFP9 без SP тоже есть, и боюсь что в VFP8SP1 тоже присутствует.
> Проверять лень.

В VFP8SP1 точно так-же.

> Баг репорт пошлите сами, у меня начальство-скряги и Fox соответственно
> пиратский. Незачем светиться лишеий раз.

;)

> Насчет того почему этот баг возникает здесь не все ясно. Ясно только то,
> что это как-то связано с интегрированием меню окна.

Угу, с "встраиванием" системного меню (того что Move,Minimize,Close...)
максимизируемого окна - причём только для MDI окон - иначе это меню на своём
месте остаётся - под иконкой окна в его Caption. Видимо не отслеживается та
ситуация, что если фокус уходит на "неразворачиваемое" окно, то и собственно
другие, ранее максимизированные MDI окна уходят в состояние Normal - а при
этом их системное меню "возвращается" под иконку! Т.е. из линейки меню его
надо выкинуть - а это не делается.

> Кроме того мне не понятно почему система валиться только после выгрузки
> FormParentClass

Не только - просто кликни по этому "левому" во всех смыслах :) меню (т.е. по
иконке которая осталась в строке меню).
Также думаю что и некоторые другие манипуляции с меню могут вызвать падение.

Помнится с этой-же иконкой связан и другой глюк - где-то MSFT ошиблось
слегка, и при добавлении этой самой иконки в строку меню, эта самая строка
меню "вырастает" в высоту на 1 пиксель :( Это обычно незаметно, но скажем
открой окно редактирования кода, максимизируй его (это тоже MDI окно), а
потом через Ctrl+F1 попереключайся между ним, и скажем командным окном,
которое не является MDI - хорошо заметно "прыгание" системного тулбара. С
пользовательскими MDI и не-MDI окнами ситуация аналогична.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Интерфейсная бага VFP приводящая к ошибке 0xc0000005 / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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