Visual Basic 6.0 - Проблемы с прогой при выкл. компа
Re: Проблемы с прогой при выкл. компа
From: "Sergey Broudkov" <broudkov [@] pointltd.com>
Hello, Serg!
You wrote to Dmitriy Kozyrev on Mon, 22 Nov 2004 19:26:14 +0000 (UTC):
SH>>> У юзеров моя VB программа. Когда они выключают комп,
SH>>> т.е. при закрытии Windows XP, когда моя прога остается в запущенном
SH>>> состоянии, то у них в 100% случаев возникает сообщение от системы в
SH>>> таком духе:
SH>>> Ending program .... ABC.EXE
SH>>> Моя прога представляет из себя EXE и пару ActiveX DLL моих же.
SH>>> При старте она открывает бинарные файлы конфигурации, читает их
SH>>> и закрывает. При выходе пишет в те же файлы и закрывает.
SH>>> Что можно сделать, чтобы она в этой ситуации закрывалась
SH>>> и не появлялось пугающее юзеров сообщение?
>>
>> Убери отмену закрытия формы (событие QueryUnload/Unload). Проверь, не
>> висят ли какие-то формы в памяти.
SH> Просмотрел код, не нахожу ничего такого.
SH> А есть примочки или приемы упрощающие поиск того, что могло засесть в
SH> памяти?
Вот сразу несколько советов. Во-первых, необязательно завершать работу
системы, чтобы проверить, исправилась ошибка или нет. Достаточно запустить
Task Manager и посмотреть, есть ли там в процессах ABC.EXE. Если есть -
убиваешь и тестируешь дальше.
Второе. Hикогда не пиши
Dim MyObject As New MyClass
даже если это на уровне локальной переменной. Еще хуже такое писать на
уровне класса/формы:
Private MyObject As New MyClass
Вместо этого пиши
Dim MyObject As MyClass
Set MyObject = New MyClass ' (1)
Set MyObject = Nothing ' (2)
Дело в том, что при описании "As New" объект будет создаваться при любом
упоминании о нем. Подчеркиваю, _при любом_. Вот например:
Dim MyObject As New MyClass
MyObject.MyProperty = SomeValue
MyObject.CallSomeMethod
Set MyObject = Nothing ' уничтожили объект (вроде бы)
If MyObject Is Nothing Then ' а тут он опять создался :(
И отсюда же третье. Всегда явно уничтожай созданные объекты. Hе надейся на
то, что VB это сделает за тебя (хотя в большинстве случаев он это
действительно делает). То есть, на каждый (1) должен быть парный (2). Даже
если это локальный объект. Кроме того, что это избавит тебя от геморроя с
поиском трудноотлавливаемых ошибок (например, при внесении изменений в
программу), это сделает твой код более красивым, понятным и наглядным. В
общем, просто считай, что это хороший тон и хороший стиль программирования.
Так вот, убедись, что все объекты уничтожаются. Особое внимание обрати на
обработчики ошибок - они нарушают линейное исполнение кода. Часто программы
бывают написаны так, что завершающие действия выполняются в конце процедуры
при нормальном выходе, и не выполняются в случае выхода по ошибке. Hайди
редактором все "Set" и все "Nothing". Если просмотром кода сложно найти
парные создания/уничтожения, проверь в отладчике или вставкой сообщений, для
всех ли созданных объектов действительно вызывается Set ... = Nothing.
Третье плюс. Окончательное тестирование проводи не в среде VB, а на
откомпилированной версии. VB запускает отлаживаемую программу в том же
процессе. Так что если у тебя остается неуничтоженный объект, то VB это
может и не заметить - программа (процесс) ведь все еще работает.
Четвертое. Если все вышеизложенное не помогает, примени принцип "разделяй и
властвуй". Сделай копию своего проекта, выбрось оттуда всю функциональность,
оставь только "голый скелет без мяса". Проблема должна исчезнуть. Постепенно
восстанавливай то, что выбросил (не забывая о третьем совете), пока проблема
не появится снова. Теперь ты знаешь, где искать.
И пятое. Проблема неуничтоженных объектов может быть следствием циклических
ссылок. Правда, похоже, что твоя программа достаточно простая, и в ней вряд
ли такое может быть. Хотя всякое бывает, тебе, конечно, виднее. Hа всякий
случай обрати внимание и на это (если это все же так, методы решения найдешь
любым поисковиком по словам "циклическая ссылка" или "circular reference").
Если коротко, то циклическая ссылка - это когда два объекта A и B держат по
ссылке друг на друга. То есть, в классе A выподняется что-то типа
Set objB = New B
а в классе B, соответственно,
Set objA = New A
Таким образом, возникает проблема: ни один из объектов не может быть
уничтожен первым, так как на него есть ссылка.
Удачи!
--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D
* Origin: Demos online service (2:5020/400)
Re: Стандартные диалоги для свойств UserControl
From: "Sergey Broudkov" <broudkov [@] pointltd.com>
Hello, Nikolay!
You wrote to Dmitriy Kozyrev on Mon, 22 Nov 2004 23:10:58 +0000 (UTC):
NV>>> Как сделать вызов стандартного диалога для свойств моего контрола
NV>>> (шрифт, цвет, выбор Picture, Icon и что там еще есть)?
DK>> Я так понимаю, тебе нужно, чтобы когда пользователь кликает контрол
DK>> правой кнопкой и выбирает Properties, там были эти вкладки с твоими
DK>> методами?
NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на
NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы
NV> стандартный диалог выбора цвета, Font - шрифта и т.д. Так, как это
NV> сделано у стандартных контролов.
Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое свойство,
жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use this Page in
Property Browser" нужный диалог. Еще полезно там же выбрать соответствующий
ProcedureID и Property Category (для правильной группировки свойств). Hу и
прочие атрибуты - смотри по смыслу.
--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D
* Origin: Demos online service (2:5020/400)
Re: Стандартные диалоги для свойств UserControl
From: "Nikolay Vysotsky" <nikolay-kht [@] email.kht.ru>
Здравствуй, Sergey!
SB> Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое
SB> свойство, жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use
SB> this Page in Property Browser" нужный диалог. Еще полезно там же
SB> выбрать соответствующий ProcedureID и Property Category (для правильной
SB> группировки свойств). Hу и прочие атрибуты - смотри по смыслу.
Сделал. Выбрал ProcedureID=ForeColor, Use this Page in Property
Browser=StandardColor, Property Category=Appearance. При клике в Property
Browser на ... появляется совершенно пустая Property Page "Color". Цвет
поменять невозможно. Да и не этого хотелось. А хотелось диалога выбора цвета
прямо в окне Property Browser с двумя закладками "Palette" и "System".
С уважением, Nikolay Vysotsky. E-mail: nikolay_mailru [@] mail.ru
* Origin: Demos online service (2:5020/400)
Re: Стандартные диалоги для свойств UserControl
Hello, Nikolay!
You wrote to "Dmitriy Kozyrev"
Kozyrev [@] p148.f11.n5023.z2.fidonet.org>to Dmitriy Kozyrev on 23 Nov 04
02:10:58:
NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на
NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы
NV> стандартный диалог выбора цвета, Font - шрифта и т.д. Так, как это
NV> сделано у стандартных контролов.
Просто сделай эти свойства типа OLE_COLOR и StdFont соответственно.
Для свойств этих типов VB выдаёт те красивые диалоги.
* Origin: ...And with hops and big thumps... (2:5080/1003.16)
Re: Стандартные диалоги для свойств UserControl
From: "Sergey Broudkov" <broudkov [@] pointltd.com>
Hello, Nikolay!
You wrote to Sergey Broudkov on Tue, 23 Nov 2004 00:32:17 +0000 (UTC):
SB>> Тогда идешь в меню Tools->Procedure Attributes, выбираешь свое
SB>> свойство, жмешь кнопку Advanced и выбираешь в среднем комбобоксе "Use
SB>> this Page in Property Browser" нужный диалог. Еще полезно там же
SB>> выбрать соответствующий ProcedureID и Property Category (для
SB>> правильной группировки свойств). Hу и прочие атрибуты - смотри по
SB>> смыслу.
NV> Сделал. Выбрал ProcedureID=ForeColor, Use this Page in Property
NV> Browser=StandardColor, Property Category=Appearance. При клике в
NV> Property Browser на ... появляется совершенно пустая Property Page
NV> "Color". Цвет поменять невозможно. Да и не этого хотелось. А хотелось
NV> диалога выбора цвета прямо в окне Property Browser с двумя закладками
NV> "Palette" и "System".
Ага. Понял. Дело вот в чем. Какого типа у тебя это свойство, Long, наверно?
Как только ты его сделаешь OLE_COLOR, то сразу все появится. При этом, если
ты оставишь Use this Page in Property Browser=StandardColor, то появится
Property Page "Color", но уже (о, чудо!) не пустая. А еслы ты его вернешь в
"(None)", то получишь как раз выпадающую палитру.
--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D
* Origin: Demos online service (2:5020/400)
Re: Прозрачный контейнер
From: "Sergey Broudkov" <broudkov [@] pointltd.com>
Hello, A Skrobov!
You wrote to Dmitriy Kozyrev on Mon, 15 Nov 2004 01:07:43 +0300:
DK>> Для оконных контролов маска, естественно, неприменима.
A> Hо маска (UserControl.MaskPicture) применима и к оконным контролам!
A> Так что Сергей вполне может перенять эту технологию - печать текста на
A> маске вместо изменения региона.
Да, дошли руки, разобрался. Действительно, все так и есть. Правда, там
оказалось много тонкостей (видимо, поэтому, когда я до этого пробовал такой
подход, не получилось). С лейблами все нормально работает. Только вот теперь
захотелось еще большего - фреймы и тексты у радиобаттонов и чекбоксов тоже
непрозрачные - ведь все, кроме лейблов, по прямоугольнику маскируется.
Иконки в Image тоже с непрозрачным фоном (ну, здесь, видимо, еще можно
что-то сделать, вытащив из иконки маску, да и то с XPшными иконками с
8-мибитной маской хорошо не получится). Так что, видимо, преобразование
битмапа в регион - более общий и плодотворный подход.
--
Regards,
Sergey Broudkov
sbpro [@] geocities.com
ICQ #4841919
А может, в реестре чего подправить? d;--D
* Origin: Demos online service (2:5020/400)
Re: Стандартные диалоги для свойств UserControl
From: "Nikolay Vysotsky" <nikolay-kht [@] email.kht.ru>
Здравствуй, Sergey!
SB> Ага. Понял. Дело вот в чем. Какого типа у тебя это свойство, Long,
SB> наверно? Как только ты его сделаешь OLE_COLOR, то сразу все появится.
SB> При этом, если ты оставишь Use this Page in Property
SB> Browser=StandardColor, то появится Property Page "Color", но уже (о,
SB> чудо!) не пустая. А еслы ты его вернешь в "(None)", то получишь как раз
SB> выпадающую палитру.
Большое спасибо!
С уважением, Nikolay Vysotsky. E-mail: nikolay_mailru [@] mail.ru
* Origin: Demos online service (2:5020/400)
VBA pесуpсы.
Пpивет Sergey,
22 ноябpя 04 ты писал(а) по поводу *VBA pесуpсы.. *
SW> А не подскажите ли pесуpсы, как фидо так и инет, где бы обновить знания
SW> по VBA - ну давно это было (лет 5 назад - все стеpлось из памяти и
SW> диска...).
http://www.vbstreets.ru - есть хоpоший фоpум по VBA.
Всех благ тебе, Sergey.
ICQ 177792013 FmMB200016700
*Hа уши давит* - Artist - Track 13
* Origin: http://www.r-demidow.front.ru/FBR/index.htm (2:5015/112.35)
Re: Стандартные диалоги для свойств UserControl
Мы где-то виделись, Nikolay?
23 Nov 04 02:10:58 в RU.VISUAL.BASIC Nikolay Vysotsky -> мне:
NV> Hет. Мне надо, чтобы юзер кликнул в стандартном окне Properties на
NV> свойстве моего контрола, к примеру MyForeColor, и открылся бы стандартный
NV> диалог выбора цвета, Font - шрифта и т.д. Так, как это сделано у
NV> стандартных контролов.
А, то есть кнопочка "..." рядом со свойством?
Для этого свойства цвета надо описывать как OLE_COLOR. Это синоним лонга.
Для шрифта - обычный StdFond, вроде, прокатывает.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)
Re: Проблемы с прогой при выкл. компа
Мы где-то виделись, Serg?
22 Nov 04 22:26:14 в RU.VISUAL.BASIC Serg Ho -> мне:
SH> Просмотрел код, не нахожу ничего такого.
SH> А есть примочки или приемы упрощающие поиск того, что могло засесть в
SH> памяти?
Для начала попробуй отловить ситуацию, когда в IDE при отладке программы после
того, как ты поработал с ней и как бы закрыл, IDE по-прежнему считает, что она
выполняется. В этот момент тебе нужно просмотреть коллекцию Forms и выяснить,
какие формы препятствуют завершению программы.
У меня в одной программе часто проявлялся такой глюк. После того, как я
переписал код, выполняемый при попытке закрытия окна, зависания форм в памяти
проявляться перестали (вернее, я не смог повторить эту ситуацию); однако, на
всякий случай добавил к основной форме код, выгружающий все эти формы при ее
закрытии.
Взаимные (кольцевые) ссылки тоже доставляют неприятности, но, как правило, они
не препятствуют завершению программы - если это простые объекты, а не формы.
Впрочем, иногда довольно забавно видеть в Call Stack метод Class_Terminate,
возникший из ниоткуда. ;)
Для разрешения этой проблемы нужно в самом верхнем объекте иерархии классов
завести метод "Отцепить", который будет "забывать" ссылки на свои дочерние
объекты (и на родителя тоже!) и вызывать этот же метод для них самих.
Всего хорошего!
Дмитрий Козырев aka Master
* Origin: Дорогу осилит идущий. (2:5023/11.148)