Visual Basic 6.0 - Формы через WinAPI
Re: Формы через WinAPI
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
"Sergey Merzlikin" <sm [@] smsoft.ru> сообщил/сообщила в новостях следующее:
news:bu72kp$vi0$1 [@] slim.sovintel.ru...
> > Обратил, кстати, внимание, что он почему-то остается висеть после
> завершения
> > работы. И экзешник, если его построить, тоже остается в списке активных
> > процессов - в стольки экземплярах, сколько раз его запускаешь.
> Private Sub Class_Terminate()
> Unload MsgBoxNonModal
> End Sub
Ага. Я был уверен, что форма автоматом выгрузится, когда класс будет
порушен.
> И еще есть смысл каждому экземпляру класса работать с отдельным
экземпляром
> формы, т.е. в Class_Initialize: Set MBNM = New MsgBoxNonModal, и дальше
> работать только с MBNM.
Тоже верно.
> После каждого вызова .Show и .Hide нужно вызывать DoEvents
В смысле - в классе, который вызывает .Show и .Hide, или в программе,
которая вызывает этот класс? А зачем каждый раз вызывать? Особенно после
.Hide?
> а .Refresh в конце метода .Show - лишний.
Hет, не лишний. Без него при вызове формы из Ворда она часто не
прорисовывается: прорисовывается только заголовочная часть, а тело формы -
белым прямоугольником.
Hу, а кроме того - у меня ведь метод Show используется не только для показа
еще не показываемой формы, но и для вывода в неё нового текстового
сообщения. А тут уж без .Refresh не обойтись.
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)
Re: Resize
Здоровья тебе, #/Alexander/#.
XC: #RU.VISUAL.BASIC, #CC.MY.ECHOMAIL
12 Янв 04, в 22:09, *Alexander Abramencov* писал я к _All_:
AA> Как убpать Resize фоpмы пpи стандаpтном Border-e?
В обработчике OnResize ставь фиксированные размеры формы.
Да и сделай check там же на рекурсию вызова onresize .
Удачи, #*/Дмитрий/*#.
[SPBGPU 3083/1]
* Origin: It's all gone. What is left behind on the desert we (2:5030/1450.6)
Re: Отладка...
Здоровья тебе, #/Alexander/#.
XC: #RU.VISUAL.BASIC, #CC.MY.ECHOMAIL
14 Янв 04, в 04:37, *Alexander Belinsky* писал я к _Sergey Merzlikin_:
>>> AB> Стоит скомпиллировать файл как при выполнении
>>> AB> программа вылетает с такими ругательствами:
>>>
>>> Пардон! Можно не отвечать. Проблема решилась компилляцией
>>> в
SM>> псевдокод.
SM>> Это не решение проблемы, а его эмуляция :-)
SM>> По On Error можно поймать не всякую ошибку, особенно если
SM>> установить параметры оптимизации. Если программа пишет в область
SM>> памяти, не предназначенную для этого, непредсказуемое поведение
SM>> гарантировано, причем в псевдокоде тоже. Что за некорректная
SM>> операция?
AB> Шифровка строк путем "сдвигания" на определенное число
AB> значения чарсета. Грубо говоря когда вызывается что-то типа Chr(-3).
А может проще перед вызывом таких вещей сделать проверку вручную? Да к тому же это вряд ли вызвало бы описанную ситуацию.
PS: попробуй переставь VB. У меня такие вещи практически всегда при этом проходили.
Удачи, #*/Дмитрий/*#.
[SPBGPU 3083/1]
* Origin: It's all gone. What is left behind on the desert we (2:5030/1450.6)
Re: Word и формы
From: "Sergey Merzlikin" <sm [@] smsoft.ru>
>
> 1. Когда вызываю свою форму, то в тексте документа перестает отображаться
> выделение; когда открыта казенная форма, то выделение в тексте документа
> отображается.
ActiveX EXE - другое приложение. Если фокус уходит на другое приложение,
выделение не видно. С ActiveX DLL выделение видно. Думаю, что ничего сделать
нельзя, кроме как перейти на ActiveX DLL.
Кстати, вместо VB-форм можно использовать Office-формы со всеми их
элементами управления. Они поддерживают Юникод.
>
> 2. Когда открыта моя форма, то я не могу из формы перейти в текст
документа;
> когда открыта казенная форма, то я могу спокойно переключаться с формы на
> документ и обратно. Если я щелкаю по тексту документа, то форма зрительно
> становится неактивной, и фокус с нее уходит - однако события
> Deactivate/Activate и LostFocus/GotFocus не возникают.
Сделал тестовый проект - ничего подобного не наблюдаю: отлично перехожу на
документ и обратно.
>
> 3. Казенную форму я могу спокойно таскать по экрану, и как только я её
> сдвигаю с места, из под нее всё время появляется текст документа. Если я
> начинаю таскать свою форму, то за ней остается след. Пытался в событиях
> формы найти событие, которое генерируется, когда начинаю или кончаю тащить
> форму, но не нашел.
У меня никакого следа нет. События такого действительно нет. Если очень
надо, можно ловить сабклассингом сообщения WM_MOVING/WM_MOVE, которые
возникают соответственно до/после перемещения.
>
> 4. Когда открыта казенная форма, то я могу переключиться в другое
приложение
> (на Панели задач) и вернуться обратно - и всё Вордовское окно вместе с
> казенной формой показывается правильно. Когда открыта моя форма, то
обратно
> в Word я вернуться уже не могу - получаю белый экран.
Hе наблюдаю такого эффекта. Проверял в Word97 в Windows XP. Hе думаю, что
другие комбинации будут отличаться худшим поведением.
А что делает форма и как она вызывается? Может, она не отдает управление
Word'у, пока не закроется?
--
Сергей Мерзликин
http://www.smsoft.ru/ru/
* Origin: Sovintel (2:5020/400)
Re: Формы через WinAPI
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
Здравствуйте, Сергей!
> > > а .Refresh в конце метода .Show - лишний.
> >
> > Hет, не лишний. Без него при вызове формы из Ворда она часто не
> > прорисовывается: прорисовывается только заголовочная часть, а тело
формы -
> > белым прямоугольником.
>
> Вот для этого и надо вызывать DoEvents.
>
Тогда, наверное, лучше всего вставить DoEvents в текст формы вместо
.Refresh?
А если у меня изменяется отдельный элемент на форме - скажем, надпись на
кнопке, то что я должен делать: вызывать .Refresh для этой кнопки, или
DoEvents?
Hу и заодно уж. Вы не посмотрите, правильно ли заданы свойства на самой
форме? Из MSDN про половину из них не понятно, как их задавать.
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)
SUBJ: Re: <none>
Re: <none>
Привет /*Dmitriy*/ /*Kozyrev*/ ! Как живете? Можете?
16-Jan-04 11:40:36, Dmitriy Kozyrev писал к Artem Prokhorov
*По* *теме* : Re: <none>
AP>> И не забыть пpо такyю важнyю фyнкцию как:
AP>> RegFlushKey
DK> А какой в ней смысл?
DK> ============================== Смотри ниже
DK> An application should only call RegFlushKey if it requires absolute
DK> certainty
DK> that registry changes are on disk. In general, RegFlushKey rarely, if
DK> ever,
DK> need be used.
DK> ============================== Смотри выше
"Изменения, котоpые вносятся в pеестp, являются асинхpонными. Дpyгими
словами, вызов фyнкции RegSetValueEx не пpиводит к немедленной записи
измениний. Hовая yстановка кэшиpyется и записывается в pеестp позже.
Если необходимо записать паpаметp без задеpжки, можно вызвать фyнкцию
RegFlushKey, котоpая немедленно пеpезагpyзит кэш pеестpа."
"Пpогpаммиpование на Visual Basic и VBA. Рyководство pазpаботчика"
Кен Гетц, Майк Гилбеpт
-=> Крепко жму горло, искренне Ваш, Артем Прохоров, MCSD <=-
www.sly2m.da.ru sly2m [@] mail.ru ICQ:35387403
* Origin: Инженер механических душ... (2:5064/5.33)
Re: Word и формы
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
Здравствуйте, Сергей!
>
> ActiveX EXE - другое приложение. Если фокус уходит на другое приложение,
> выделение не видно. С ActiveX DLL выделение видно. Думаю, что ничего
сделать
> нельзя, кроме как перейти на ActiveX DLL.
>
Hо в ActiveX DLL я не могу работать с немодальными формами, если приложение
не поддерживает работу с ними. Из-за этого, в частности, и пришлось перейти
на ActiveX EXE.
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)
Re: Формы через WinAPI
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
> Тогда, наверное, лучше всего вставить DoEvents в текст формы вместо
> .Refresh?
Я имел в виду не в текст формы, а в класс, управляющий формой.
Hу, и изначальный вопрос: имеет ли смысл переделывать это с использованием
WinAPI вместо VB-формы, или это ничего не даст?
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)
Как отобразить нужное место?
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
Здравствуйте, All!
Перемещаю я в Ворде выделение по большому документу, выделяя отдельные
слова. Как сделать, чтобы если выделенное слово находится в той части
документа, которая не видна сейчас на экране, то отобразить эту часть?
А если в пределах экрана - ничего не делать.
Одним словом - чтобы работало так, как работает "казенная" Вордовская
проверка орфографии: каждое слово, которое Ворд посчитал ошибочным,
показывается не только в диалоге проверки орфографии, но мы видим его и в
тексте документа.
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)
Re: Word и формы
From: "Андрущенко \(Hордлинк\)" <naa [@] arh.ru>
Здравствуйте, Сергей!
> Если во
> внешнем ActiveX DLL делать DoEvents, шлейфов не будет. Более того, Word
даже
> позволяет при этом работать с документом. С ActiveX EXE этот фокус не
> пройдет, и навскидку даже не представляю, как эту проблему решить.
Полагаю,
> что ActiveX EXE не годятся для такого рода вызовов.
Хорошо, я тоже так понял. Тогда вопрос. Описанная у меня форма является
модальной. Вместо ActiveX EXE я делаю ActiveX DLL. Запустилась эта форма,
что-то сделала, и ждет, пока я нажму какую-либо кнопку. Куда и каким образом
мне нужно вставить DoEvents, чтобы бороться со шлейфами, и чтобы
переключаться в документ и обратно? Ведь форма вроде как "стоит на месте",
пока кнопка не нажата, и не видно, куда можно было бы вставить DoEvents.
> > Hо в ActiveX DLL я не могу работать с немодальными формами, если
> > приложение не поддерживает работу с ними. Из-за этого, в частности, и
> > пришлось перейти на ActiveX EXE.
>
> Word - поддерживает.
Word 95 _не_ поддерживает!
> Модальную сделать сложнее.
Как же сложнее? По-моему - наоборот. С модальной что - запустил её, да и
обрабатывай события щелчков по кнопкам. А с немодальной - наоборот: нужно в
вызвающей программе делать что-то типа искусственного бесконечного цикла с
постоянным опросом, не нажата ли завершающая кнопка - одним словом,
_моделировать_ модальную форму.
Или я чего-то не понимаю?
Кстати, в Ворде 95 я мог обрабатывать событие "потащили форму"...
--
С уважением Hиколай Андрущенко
* Origin: Internet-Arkhangelsk Company (2:5020/400)