Обсуждение программирования на Visual Basic в конференции ru.visual.basic
Re: Проблемы с прогой при выкл. компа |
From: "Sergey Broudkov" 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" 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" Здравствуй, 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" 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" 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" 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" Здравствуй, 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> диска...). www.vbstreets.ru - есть хоpоший фоpум по VBA. Всех благ тебе, Sergey. ICQ 177792013 FmMB200016700 *Hа уши давит* - Artist - Track 13 * Origin: 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) |