Настройка ide vb


Содержание

Настройка ide vb

Вероятно, некоторым сие известно. Но я узнал недавно

GSerg » 28.06.2006 (Ср) 2:00

BV » 28.06.2006 (Ср) 2:12

GSerg » 28.06.2006 (Ср) 2:18

Lumen » 28.06.2006 (Ср) 10:30

AjaxVS » 28.06.2006 (Ср) 17:48

tyomitch » 28.06.2006 (Ср) 17:53

AjaxVS » 28.06.2006 (Ср) 18:02

Lumen » 29.06.2006 (Чт) 0:10

AjaxVS » 29.06.2006 (Чт) 0:29

А разве в стандартный комплект VB входят библы DirectX? +_+
Программисты VB не стали бы делать такое пасхальное яйцо, которое использовало бы сторонние библы.. Тем более, DirectX..

Update:
Посмотрел библиотеки, используемые этим яйцом.. DirectX не обнаружен. Зато есть \system32\shdocvw.dll — не флеш ли это? А миди проигрывается через midimap.dll.. Странно как-то..

Хакер » 29.06.2006 (Чт) 0:51

Конечно флэш. А ещё открой в IE страницу которой не существует. Там будет такая иконка — страничка, а на ней синяя буква i

Нажми на неё правой кнопкой и посмотри откуда эта картинка. Конечно же это часть Macromedia Flash — прадва две последнии буквы имени библы различаются.

я надеюсь автор поймёт для чего эта библа.
(а если не поймёт, то пусть откроет и посмотрит ресурсы этой длл, особенно BITMAP по номеру 337

2BV: Это не просто баян, это мегабаян. я его видал ещё когда XP небыло

tyomitch » 01.07.2006 (Сб) 23:22

Хакер » 02.07.2006 (Вс) 0:15

tyomitch
Блин, я вот где то видел, то ли в VBIDE то ли в VBDEBUG то ли ещё где.

AjaxVS » 02.07.2006 (Вс) 0:50

Хакер » 02.07.2006 (Вс) 1:34

AjaxVS » 02.07.2006 (Вс) 3:10

Вы че меня за лоха держите? +_+
Такой «кредит» и я могу за пару минут накатать.. Только не понятно, откуда взялся 1.25 Мб? И почему при запуске начинается WindowsInstaller, который появляется, если подключается какая-то сторонняя библа?

Я из-за чего сомневаюсь:

А тут кубиков вообще нет!

Да, кстати, я тупанул вначале — конечно, же «ShowVBCredits» написан не на VB! Просто посмотрите, на чем написаны .exe со всеми .dll, входяцими в поставку VB6 — и все станет на свои места..

Для непонимающих, как это сделать:
Microsoft Visual C++ 5.0
Microsoft Visual C++ DLL Method 1 [Debug]
Microsoft Visual C++ 6.0 [Debug]

Хакер » 02.07.2006 (Вс) 3:13

для кубиков нужно вспоминать формулы изометрической проекции. И вот я подумал. . . мне что в субботу d 6 утра больше делать нечего?

Но если тебе так уж нужны эти кубики то я их без всяких проблем сделаю.

AjaxVS » 02.07.2006 (Вс) 3:20

Да ладно, не обязательно.. Скажи хотя бы, как ты это собираешься сделать?

ЗЫ. Седня воскресенье. Не суббота. Тебе явно счас лучше ниче не делать +_+

Хакер » 02.07.2006 (Вс) 3:23

Код: Выделить всё SLSLayer.CreatePRegion(«( тут точки)»)
SLSLayer.BindLine(толщина_линии, точка1_х, точка1у, точка2_х, точка2_у)
SLSLayer.Poly («Точки_через запятую»)
SLSLayer.Finalize

а потом Render SkyContrainer.hDc

вот и усё. а класс такой есть только у меня [/quote]

Хакер » 02.07.2006 (Вс) 3:25

зы. ну там ещё до этого SetPolyColor и всякое такое вызывать надо.

но я буду прост, и сделаю всё на чистом WinAPI

tyomitch » 05.07.2006 (Ср) 23:44

Хакер » 06.07.2006 (Чт) 0:12

DirectXManiac » 06.07.2006 (Чт) 14:19

tyomitch » 06.07.2006 (Чт) 14:25

Денис Победря » 06.07.2006 (Чт) 14:42

Хакер » 06.07.2006 (Чт) 14:52

DirectXManiac » 06.07.2006 (Чт) 15:36

DirectXManiac » 06.07.2006 (Чт) 15:38

tyomitch » 06.07.2006 (Чт) 16:42

Улучшенный вариант: с правильным задником, благодарностями Хакеру, и, до кучи, мидями.

Итак, что по этому поводу выскажут наши донецькие товарищи?

Хакер » 06.07.2006 (Чт) 17:46

Интегрированная среда разработки Visual Basic

Visual Basic представляет собой интегрированную среду разработки, которая содержит набор инструментов, облегчающих и ускоряющих процесс разработки приложений. Причем процесс разработки заключается не в написании программы (программного кода), а в проектировании приложения. Приложение формируется средствами графического редактирования (компоновки), что позволяет свести процесс создания программного кода к минимуму.

Visual Basic IDI (Integrated Development Environment — интегрированная среда разработки) – это набор меню, панелей, инструментов и окон, в совокупности образующих рабочее место программиста. Это среда, в которой разрабатываются приложения.

2. Панели инструментов:

Стандартная (Standart) – используется для быстрого доступа к часто исполь-зуемым средствам и функциям;

Отладка (Debug) — используется для тестирования программ и исправления ошибок;

Правка (Edit) –используется при работе с программным кодом.

Редактор формы (Form Editor) – используется для изменения размеров, пере-мещения выравнивания элементов управления в форме.

Настройка панелей – Просмотр / Панели инструментов / Customize / вкладки Toolbars, Commands

3. Окно управления приложениями (окно проекта— ProjectExplorer) – помогает осу-ществлять управление одним или несколькими проектами и служит для быстрого по-лучения информации о различных составляющих проекта (формах, классах, модулях). Вызов окна — Ctrl+R или Просмотр / Исследователь программ.

4. Палитра (панель) элементов управления (ToolBox) – содержит набор наиболее по-пулярных стандартных объектов (кнопка, текстовое поле, таймер и т.д.), применяемых при создании проектов.

Вызов — кнопка на СПИ или Просмотр / Блок инструментов.

5. Окно свойств — в нём отражаются различные атрибуты (свойства) выделенных объек-тов. В левом перечислены названия свойств, а в правом значения. Имеется 2 закладки сортировки этих свойств по алфавиту или по категории.

Вызов – F4 или СПИ или Просмотр / Свойства окна.

6. Окно макета формы – позволяет увидеть и указывать расположение на экране ПК одной или несколько форм.

Вызов – Просмотр / Формат окна или кнопка на СПИ.

7. Окно просмотра объекта – в нем отображаются свойства, события и методы объек-тов, постовляемых с VB или создаваемых программистом.

Вызов – F2 или Просмотр / Окно Просмотра Объекта или кнопка на СПИ.

8. Окно формы – представляет собой контейнер для элементов управления формы ( Ак-тивизация формы —Просмотр / Объект или Shift+F7)

9. Окно кода программы — служит для ввода и редактирования кода программы, кото-рый разделяется на процедуры, связанные с определёнными элементами управления. (двойной щелчок мыши на форме или Просмотр / Код)

Комбинации клавиш при работе в окне кода:

Ctrl +X удаляет выделенный фрагмент в буфер обмена

Ctrl + C копирует выделенный фрагмент в буфер обмена

Ctrl +V вставка из буфера

Ctrl +Y удаление строки

Ctrl + N вставка строки

10. Окно непосредственного выполнения (просмотр/Окно просмотра объекта).

Окно появляется само (в процессе выполнения программы) или вызывается программи-стом в процессе отладки программы. VB выполняет строку с операторами сразу после на-жатия клавиши Enter в конце строки.

Окна могут быть закрепленными и незакрепленными. Закрепленные окна могут быть при-вязаны к любой из 4 сторон главного окна, где их не смогут перекрывать другие окна. Нельзя за-крепить окно Программного кода и окно Формы. Наличие одной кнопки закрытия окна в строке заголовка говорит о том, что окно закреплено.

Снять закрепление – Инструменты / Опции / Ввод.

VB — автоматически сохраняет текущую структуру окна.

Режимы интегрированной среды разработки

VB IDE имеет два режима – однодокументный интерфейс (все окна существуют незави-симо друг от друга, окно IDE отсутствует и многодокументный (все окна размещены внутри од-ного большого окна). Переключение: Инструменты / Опции / Advanced / SDE Development Envi-ronment

Приложение, создаваемое в среде Visual Basic, называется проектом. Программный проект — это совокупность частей, составляющих будущее WINDOWS-приложение. Любой проект должен обязательно состоять из экранных форм (хотя бы одной) и программных модулей (хотя бы одного). Visual Basic хранит каждый проект в отдельном файле с расширением vbp.

Экранная форма — это графическое представление WINDOWS-приложения вместе с содержанием этого окна. Содержание включает в себя:

§ совокупность свойств этого окна с их значениями;

§ совокупность, объектов, находящихся в этом окне;

§ совокупность свойств этих объектов с их значениями.

В Visual Basic экранная форма хранится в отдельном файле с расширением frm.

Программный модуль — это хранящийся в отдельном файле программный код (текст некоторой программы). Он может использоваться при решении чаще всего одной, а иногда и нескольких задач. Имя этого файла имеет расширение bas.

Программный код проекта существует не сам по себе, он привязан к отдельным объектам экранной формы. Часть кода, которая относится только к одному объекту, в свою очередь может состоять из нескольких фрагментов-процедур.

В Visual Basic программный код почти всегда привязывается к какому-либо событию, которое является сигналом к началу работы программы. Например, щелчок мыши по какому-либо объекту экранной формы; загрузка новой экранной формы; перемещение указателя мыши вдоль полосы прокрутки; нажатие какой-либо клавиши на клавиатуре.

Сначала проектируется экранная форма, затем устанавливаются события, которые будут происходить в работающем приложении, и только затем программируются действия, связанные с этими событиями.

Событие — это характеристика класса объекта, описывающая внешнее воздействие, на которое реагирует объект этого класса во время работы приложения.

Большинство процедур, из которых состоит программный код VB, привязаны к событиям и называются процедурами-событиями.

Не нашли то, что искали? Воспользуйтесь поиском:

87 Хитростей и трюков для Visual Basic’a

Cодержание

1 УПРАВЛЕНИЕ СОБЫТИЯМИ В КОМБОБОКСЕ

Две проблемы могут приключиться, когда смущенный юзер ползает по комбобоксу при помощи мышки вверх и вниз, а затем нажатием на Enter делает свой юзерский выбор. Во-первых, нажатие на серую стрелочку вызывает два события: Change и Click. Во-вторых, нажатие на Enter перемещает фокус к следующему элементу формы, тогда как нажатие на кнопку мыши не вызывает подобного эффекта (т.е. фокус остается на комбобоксе). Поэтому, если Ваш код помещен в секцию события Change, то на стрелочки вверх/вниз (клавиатурой) вызовет это событие, чего Вы, естественно, не хотите. Напротив, если Вы помещаете свой код только в секцию события Lost Focus и юзер щелкает мышью на своем выборе, то фокус не уйдет из комбобокса, а юзер будет созерцать текст, который он выбрал своей мышью, и думать, почему это ничего не происходит. Нижеприведенное решение «фильтрует базар» событий Click, генерирующихся нажатиями на стрелочки клавиатуры, и вынуждает контрол потерять фокус.В секции Declarations формы введите следующее

‘ В VB3 надо поменять тип флага на integer
Dim bNoise as Boolean
‘ True означает, что происходит «шум», на который не следует реагировать

А этот код введите в секции события Form_Load:

Этот код введите в событии KeyDown комбобокса:

Private Sub cbTest_KeyDown(KeyCode As _
Integer, Shift As Integer)
‘ если юзер использует стрелки для езды по списку комбобокса
‘ игнорировать события Click
If KeyCode = vbKeyDown Or KeyCode _
= vbKeyUp Then bNoise = True
End Sub

Этот код вводится в событии Click комбобокса:

Private Sub cbTest_Click()
If bNoise Then
‘ Ignore Noise events
‘ (up or down arrow)
bNoise = False
Else
‘ Увести фокус с контрола
SendKeys ««, True
End If
End Sub

Теперь Вам остается написать код, содержащий реакцию на выбор юзера, и занести его в секцию события LostFocus комбика.

Назад к СОДЕРЖАНИЮ

2. КОММЕНТИРОВАНИЕ И РАСКОММЕНТИРОВАНИЕ БЛОКОВ КОДА

VB5
Level: Beginning

VB 5.0 позволяет Вам разом закомментировать целый блок кода, а затем также быстро раскомментировать его. Это очень полезно при отладке, когда Вам не нужно исполнять целый ряд операторов, и в то же время Вы не можете их удалить вот так вот просто за здорово живешь. Между тем, пара кнопарей Comment/Uncomment присутствует только в тулбаре Edit, который надо специально вызывать :-(. Чтобы быстро вызвать тулбар Edit, кликните правой кнопкой мыши на любом тулбаре в VB, и выберите затем команду Edit.

Назад к СОДЕРЖАНИЮ

3. ЗНАЧЕНИЯ ПО УМОЛЧАНИЮ ДЛЯ НЕОБЯЗАТЕЛЬНЫХ ПАРАМЕТРОВ

VB5
Level: Beginning

Если Вы когда-либо программили на VB4, то Вы возможно пользовались мощной фишкой под названием Необязательные параметры (Optional parameters). VB5 пошел еще дальше: теперь эти параметры могут быть любого типа (не только Variants), и могут появляться в процедурах Property. Интересно, что Вы можете теперь задавать для них значение по умолчанию.

Property Get Value _
(Optional index As Long = 1)
End Property

Вы можете теперь делать это без бывшего ранее обязательным (и жутко тормозным) тестом IsMissing:

Property Get Value _
(Optional index As Long)
If IsMissing(index) Then index = 1
.
End Property

Назад к СОДЕРЖАНИЮ

4. НЕ СОЗДАВАЙТЕ ALIAS-НЫХ ПЕРЕМЕННЫХ

VB5
Level: Beginning

Никогда не передавайтe глобальную переменную в качестве аргумента в процедуру, которая также напрямую обращается к этой переменной из себя (зачем??). Если Вы на 100% уверены, что следуете этому правилу в Ваших программах, то зачеркните опцию Assume No Aliasing в диалоговом окне Advanced Optimizations, которое вызывается из пункта Compile диалога Project Properties (уф, надеюсь, понятно). Если компилятор native code знает, что этих самых alias-ных переменных нет, то он спокойно копирует значения переменных в шустрые регистры ЦПУ, и переписывает их значения обратно в RAM только при выходе из процедуры. Это увеличивает скорость исполнения скомпилированных программ.

Назад к СОДЕРЖАНИЮ

5. ЦЕНТРИРОВАНИЕ ФОРМЫ НА ЭКРАНЕ

VB5
Level: Beginning

Все знают о маленьком кодике, позволяющем Вам центрировать форму на экране вне зависимости от графического разрешения. Теперь Вы можете достичь того же результата, всего лишь присвоив значение vbStartUpScreen (=2) новому свойству StartUpPosition формы (появилось в версии 5). Вы даже можете отцентрировать форму относительно ее родительского окна, присвоив значение vbStartUpOwner (=1). Присвоение можно сделать в окне Property соответствующей формы. Когда Вы центрируете форму внутри родительского окна, не забудьте добавить второй аргумент в методе Show.

Form2.Show vbModal, Me

Назад к СОДЕРЖАНИЮ

6. НЕ УВЛЕКАЙТЕСЬ АВТООПТИМИЗИЦИЕЙ FAST CODE

VB5
Level: Beginning

Если взглянуть на опции native code оптимизации, то сперва так и подмывает щелкнуть на «Optimize for Fast Code». Однако, как ни странно это может прозвучать, данное действие далеко не всегда гарантирует ожидаемый эффект. Аппликухи, оптимизированные на скоростное исполнение, как правило, не оптимизируются (пардон за каламбур), а лишь получают большее количество памяти при загрузке. Это обращается для них более медленной загрузкой, что особенно заметно на машинах с недостаточным количеством RAM, и в итоге создает впечатление, что Ваша аппликуха работает медленнее, нежели оптимизированная под компактный код. По той же самой причине, советуется компилить аппликухи в P-code. В случае объемных, UI- и базоданских аппликух, выигрыш от компиляции в native-code отнюдь не перевесит увеличения размера аппликухи. Вообще, чтобы точно знать, какая компиляция нужна Вам, юзайте VB Application Performance Explorer (APE), который лежит на VB CD.

Назад к СОДЕРЖАНИЮ

7. НЕ ВСЕ ШАБЛОНЫ СОЗДАНЫ ОДИНАКОВО

VBA5
Level: Beginning

В отличие от других продуктов Office 97, шаблоны Word 97 содержат business-application engine, который хранится отдельно от документов, использюущих этот engine. Основанные на шаблонах книги Excel и презентации PowerPoint хранят в себе шаблоны, на основе которых они созданы. На практике, все документы Word состоят из 2х VBA проектов: первый проект создан на базе основного(оригинального, хранящегося в Word) шаблона (все документы Word основаны на шаблонах), а второй проект принадлежит самому документу Word. С другой стороны, книги Excel и презентации PowerPoint, созданные на шаблонах, содержат только один VBA проект. Каждый файл содержит свою собственную копию проекта оригинального шаблона. Изменения, производимые в этом шаблоне, не затрагивают основной шаблон, хранящийся в приложении.

Назад к СОДЕРЖАНИЮ

8. НАСТРОЙКА ТУЛБАРОВ В VB

VB5
Level: Beginning

Вот несколько предложений по настройке IDE в VB5:
Добавить закладки в тулбокс можно, кликнув правой кнопкой мыши на кнопке General (что на тулбоксе), и выбрав Add Tab. Вы можете также перемещать и удалять закладки, и перемещать иконы контролов с одной закладки на другую, используя обычный метод drag-and-drop.
Вытащить кнопку любого пункта меню на тулбар можно, кликнув правой кнопкой на любом тулбаре и выбрав пункт Customize. Перейдите на закладку Commands, выберите нужный пункт меню в правом окошке, и перетащите его на тулбар. Первыми кандидатами на добавление являются пункты Project-References,Project-Properties, и Tools-Add Procedure.
Как создать совершенно новый тулбар на вкладке Toolbars диалогового окна Customize. После того, как Вы определили содержимое будущего тулбара, для добавления кнопок на этот тулбар используйте описанную абзацем выше процедуру. Когда у Вас на экране активизировано диалоговое окно Customize, кликните правой кнопкой на любой кнопке тулбара и Вы сможете поменять рисунок кнопки, создать разделитель, спрятать/показать текст и т.д.

Назад к СОДЕРЖАНИЮ

9. КАК СПРЯТАТЬ ВСЕ ОКОШКИ ПРОЕКТА

VB5
Level: Beginning

Когда Вы работаете с несколькими пректами сразу, можно запутаться в нагромождении туевой хучи окошек из разных проектов. Однако, Вы можете временно спрятать все окошки, относящиеся к данному проекту, щелкнув по пиктограмме проекта в окошке Project Explorer так, чтобы все ветви, торчащие из него, исчезли. Тогда же свернутся и все окна, относящиеся к данному проекту. Эту возможность можно отменить, щелкнув на сответствующем квадратике на закладке General в меню Tools-Options.

Назад к СОДЕРЖАНИЮ

10. STANDALONE БИБЛИОТЕКИ ТИПОВ

VB4 16/32, VB5 (Enterprise Edition)
Level: Intermediate

Koгда Вы создаете Ваш out-of-process OLE сервер, то VB встраивает библиотеку типов сервера (companion type library) в EXE-файл, не генерируя при этом .TLB файл. Однако, если у Вас Enterprise Edition VB4 или VB5, то зачеркнув квадратик Remote Server File, Вы заставите VB создавать standalone билиотеку типов. В VB5, эта опция находится на вкладке Component диалогового окна Properties меню Project.

Назад к СОДЕРЖАНИЮ

11. ИСПОЛЬЗОВАНИЕ OBJECT BROWSER’a длЯ нахождениЯ недокументированных возможностей

VB5
Level: Intermediate
Если кликнуть правой кнопкой мыши в правом окошке Object Browser’а (там, где нарисованы члены классов), то выскочит контекстное меню с командой Show Hidden Members. Если щелкнуть на этой команде, то отныне Object Browserбудет показывать все hidden-свойства и методы (а также и классы) любой библиотеки, и Вы можете использовать это для более детального исследования библиотек объектов.
Например, в библиотеке VBA есть hidden класс под названием _HiddenModule, в который входят многие известные функции VBA плюс три недокументированные: ObjPtr, StrPtr, и VarPtr. ObjPtr возвращает адрес private area экземпляра объекта, StrPtr возвращает адрес первого символа в строке, VarPtr возвращает адрес переменной или дескриптора строки (string descriptor), если имеем случай переменной типа string.

Назад к СОДЕРЖАНИЮ

12. АДРЕС ПЕРЕМЕННОЙ

VB4 16/32
Level: Advanced

В VB5 есть встроенная функция VarPtr (см. Совет «ИСПОЛЬЗОВАНИЕ OBJECT BROWSER’a длЯнахождениЯ недокументированных возможностей»), но этой функции нет в VB4. Runtime library в VB4 включает эту функцию, но перед использованием ее нужно сначала объявить:

#If Win16 Then
Declare Function VarPtr Lib «VB40016.DLL» (variable As Any) As Long
#Else
Declare Function VarPtr Lib «VB40032.DLL» (variable As Any) As Long
#End If

Эта функция полезна при передаче пользовательских типов (Type structure) во внешнюю процедуру API, и в этом типе какое-либо из полей является адресом другой переменной или записи.

Назад к СОДЕРЖАНИЮ

13. КОГДА BENCHMARK’и (ИЗМЕРЕНИЯ СКОРОСТИ РАБОТЫ ПРОГИ) ДЛЯТСЯ СУТКАМИ

VB4 16/32, VB5
Level: Intermediate

Обычно, программисты на VB измеряют скорость выполнения кода при помощи Timer функции. Однако, если Ваша программа должна завершиться на следующий день, то Вы должны учесть, что значение, возвращаемое функцией Timer, ресетится в полночь. Если же Вас устроит значение с точностью до одной секунды, Вы можете упростить Ваш код с помощью функции Now.

Dim startTime As Date
StartTime = Now
‘ the code to be benchmarked
‘ .
Print «elapsedSeconds = » & Format$ ((Now — startTime) * 86400, «#####»)

Вам понадобится функция Format$ для округления результата до целого.

Назад к СОДЕРЖАНИЮ

14. APP.PATH МОЖЕТ ВОЗВРАЩАТЬ UNC-ПУТИ

VB5
Level: Intermediate

В отличие от VB4, App.Path в VB5 может возвращать UNC-путь, типа «\\server\programs\. «, в зависимости от обстоятельств, от того как запущена программа и запущена она из VB IDE или скомпилирована в EXE-файл. Эта особенность может сильно испортить вам жизнь, если Вы используете App.Path для установки текущего каталога при старте программы.

ChDrive App.Path
ChDir App.Path

Поскольку ChDrive на умеет обрабатывать UNC-пути, этот код может вызвать фатальную ошибку времени выполнения, но можт быть защищен использованием On Error Resume Next. Однако этот фикс не защитит Вас от всех невзгод, могущих произойти. Наилучшее решение состоит в том, чтоюы предоставить юзеру самому ввести каталог во время исполнения программы, затем записать полученный путь в регистр или INI-файл. Для более подробной инфы, см. статью Q167167 в Microsoft Knowledge Base.

Назад к СОДЕРЖАНИЮ

15 ЕЩЕ ОБ УНИВЕРСАЛЬНЫХ ПАРАМЕТРАХ МАССИВОВ

VB4 16/32, VB5
Level: Advanced
Вы можете написать единую процедуру для любых типов массива с любым типом в качестве аргумента, используя параметр типа Variant. Внутри процедуры, адресация элементов массива происходит обычным способом:

‘ return the number of items
Function ItemCount(anArray As Variant) As Long
ItemCount = UBound(anArray) — LBound(anArray) + 1
‘ the first element is
‘ anArray(LBound(anArray))
End Function

Вы можете даже запулить в процедуру многомерный массив с любым колическтвом измерений, а чтобы разобраться, сколько же у этого массива измерений, нужно производить обращения к функциям UBound и Lbound до возникновения ошибки:

Function ItemCount(anArray As Variant)As Long
Dim items As Long, i As Integer
On Error Resume Next
items = UBound(anArray) — LBound(anArray) + 1
For i = 2 to 999
items = items * (UBound(anArray, _
i) — LBound(anArray, i) + 1)
If Err Then Exit For
Next
ItemCount = items
End Function

Назад к СОДЕРЖАНИЮ

16. УМЕНЬШИТЬ РАЗМЕР КОДА, ИСПОЛЬЗУЯ ОПЕРАТОРЫ IIF И SWITCH

VB4 16/32, VB5
Level: Intermediate
Часто бывает целесообразным заменить блок If. Then. Else более компактной функцией Iif:

‘ возвращает большую из двух сравниваемых величин
maxValue = IIf(first >= second,first, second)

Switch — редко используемая функция, даже в тех многочисленных случаях, когда она более полезна нежели длиннющий блок If. ElseIf:

‘ надо узнать, х полижительный, отрицательный, или равен 0?
Print Switch(x 0, _
«positive», True, «Null»)

Заметим, что значение последней проверки всегда True, так как три условия являются взаимно исключающими и избыточными.

Назад к СОДЕРЖАНИЮ

17. УСКОРЬТЕ ВАШ КОД ИСПОЛЬЗОВАНИЕМ CHOOSE

VB3, VB4 16/32, VB5
Level: Beginning

Вы можете использовать Choose там, где можно заменить массив или построить таблицы результатов, на стадии компиляции (compile-time), вместо того, чтобы делать это на стадии выполнения (run time). Например, если Вам надо знать значения факториалов чисел от 1 до 10, попробуйте следующий пример (Choose производит выбор факториала из набора имеющихся значений всесто того, чтобы высчитывать факториал каждый раз заново):

Function Factorial(number As Integer) _
As Long
Factorial = Choose(number, 1, 2, 6, _
24, 120, 720, 5040, 40320, _
362880, 3628800)
End Function

Назад к СОДЕРЖАНИЮ

18. GOSUBS РАБОТАЮТ МЕДЛЕННО В ОТКОМПИЛИРОВАННЫХ ПРОГРАММАХ

VB5
Level: Intermediate

Поскольку использование GoSubs относится к неструктурированному стилю программирования, то многие программисты стараются избегать его. Если Вы компилируете Вашу VB5 аппликуху в native code, у Вас появится еще одна причина избегать этот оператор, поскольку вызовы через GoSubs могут происходить в пять раз медленнее, чем вызовы обычной процедуры или функции.

Назад к СОДЕРЖАНИЮ

19. «ARRAY» — ОТНЫНЕ ЭТО ОШИБОЧНОЕ ИМЯ ДЛЯ ПЕРЕМЕННЫХ

VB5
Level: Intermediate

Если Вы, как и я, часто используете имя «array» для переменных, Вам придется пересмотреть Ваш код при переносе его под VB5. Это слово является теперь зарезервированным (reserved keyword) и не может быть использовано в качестве имени переменной. Вы можете легко переделать Ваш код при помощи команды Replace в IDE VB5, не забудьте при этом черкнуть «Find whole words only».

Назад к СОДЕРЖАНИЮ

20. ЗАПУСК AUTOMATION MANAGER КАК HIDDEN ЗАДАЧИ

VB4 16/32, VB5 Enterprise Edition
Level: Advanced

Если Вы мспользуете OLE Remote Automation, Вы должны заранее запустить Automation Manager на сервере до того как случится первая OLE remote communication. По умолчанию, это приложение visible, но Вы можете его спрятать, чтобы оно не мозолило глаза на таскбаре Чикаги. Для этого создайте ярлык для Automation Manager, который бы включал в командной строке переключатель /Hidden:
C:\Windows\System\AutMgr32.Exe /Hidden
С другой стороны, Вы можете поменять значение соответствующего ключа в регистре. Для более полной инфы, см. Статью Q138067 in the Microsoft Knowledge Base.

Илон Маск рекомендует:  Что такое код ctype_lower
Назад к СОДЕРЖАНИЮ

21. ПРОБЛЕМЫ СО ВСПЛЫВАЮЩИМИ МЕНЮ

VB4 16/32, VB5
Level: Advanced

Если Вы используете всплывающие меню (popup menus) в Ваших прогах, то опасайтесь бага, имеющегося в VB4 16/32 и VB5. Если у Вас есть две формы и одна из них вызывает вторую модальную через всплывающее меню, то из этой второй модальной Вы не сможете вызвать ни одного всплывающего меню, сколько бы их на ней ни было. Чтобы пофиксить это дело, используйте таймер на первой форме. Вместо показа фторой формы из всплывающего меню по событию Click, активизируйте таймер так, чтобы он показал эту вторую форму через несколько миллисекунд. Для более полной инфы, см. Статью Q167839 in the Microsoft Knowledge Base.

22. ИСПОЛЬЗОВАНИЕ КОЛЛЕКЦИИ ДЛЯ ОТФИЛЬТРОВЫВАНИЯ ДУБЛИРОВАННЫХ ЗНАЧЕНИЙ

VB4 16/32, VB5
Level: Intermediate
Этот код иллюстрирует, как использовать коллекции (Collection) для генерации уникального набора величин из набора, содержащего дубликаты. В этом примере, сканируется массив строк и сортируются все уникальные с использованием list-box контрола:

Sub Remove_Duplicates(arr() As String)
Dim i As Long
Dim RawData As String
Dim DataValues As New Collection

On Error Resume Next
‘ это вставлено для игнорирования ошибки 457 — Duplicate key
For i = LBound(arr) To UBound(arr)
RawData = arr(i)
DataValues.Add RawData, RawData
‘ Если Run-time error 457 случилась, то повторяющееся значение игнорируется
Next
On Error GoTo 0

‘ Сохранение в List Box
‘ (свойство Sorted выставлено True)
lstSortedData.Clear
For Each DataValue In DataValues
lstSortedData.AddItem DataValue
Next
End Sub

Назад к СОДЕРЖАНИЮ

23. СОЗДАНИЕ «УДАЛЕННО КОНТРОЛИРУЕМЫХ» ФОРМ

VB3
Level: Intermediate

Иногда мне требуется котролировать одну форму, когда фокус находится на другой. Например, когда я жму «ОК» на форме А, мне надо сделать resize на форме В. Итак, на каждой форме, которую мне надо «удаленно контролировать», я делаю невидимый text box, назовем его TextCommand, в событии Change которого находится следующий код:

Sub TextCommand_Change ()
Dim msg as string
msg = Trim$(Me.TextCommand.Text)
If Len(msg) = 0 Then Exit Sub

Select Case msg
Case «COMMAND_RESIZE»
Call MyFormResize
Case «COMMAND_REPAINT»
Call MyFormPaint
.
End Select
Me.TextCommand = «»
End Sub

Вы можете удаленно контролировать форму, засылая соответствующее значение в ее TextCommand:

Sub Command1_Click ()
formB.TextCommand = «COMMAND_RESIZE»
DoEvents
End Sub

Этот код можно использовать для отсылки мессагов из MDI формы к потомкам:

Dim f As Form
Set f = Me.ActiveForm
f.TextCommand = «COMMAND_RESIZE»

Если Вы сидите под VB4 или VB5, Вы можете также использовать Public-свойства и методы формы.

Назад к СОДЕРЖАНИЮ

24. ЗАПИСЬ ТЕКУЩЕЙ ПОЗИЦИИ И РАЗМЕРА ФОРМЫ ПРИ ПОМОЩИ SAVESETTING

VB4 16/32, VB5
Level: Intermediate
Функции SaveSetting и GetSetting облегчают написание сеттингов в аппликухах. Эти две функции восстанавливают и запоминают текущие позиции формы:

Public Sub FormPosition_Get(F As Form)
‘ Считывает позицию формы F из
‘ ini/reg файла и соответственно
‘ позиционирует форму
Dim buf As String
Dim l As Integer, t As Integer
Dim h As Integer, w As Integer
Dim pos As Integer

buf = GetSetting(app.EXEName, _
«FormPosition», F.Tag, «»)
If buf = «» Then
‘ defaults для центрирования фромы
F.Move (Screen.Width — F.Width) \ _
2, (Screen.Height — F.Height) \ 2
Else
‘ выделить l,t,w,h и выставить форму
pos = InStr(buf, «,»)
l = CInt(Left(buf, pos — 1))
buf = Mid(buf, pos + 1)
pos = InStr(buf, «,»)
t = CInt(Left(buf, pos — 1))
buf = Mid(buf, pos + 1)
pos = InStr(buf, «,»)
w = CInt(Left(buf, pos — 1))
h = CInt(Mid(buf, pos + 1))
F.Move l, t, w, h
End If
End Sub

Public Sub FormPosition_Put(F As Form)
‘ Пишет op,left,height и
‘ width позиции формы F в reg/ini файл аппликухи
Dim buf As String
buf = F.left & «,» & F.top & «,» & _
F.Width & «,» & F.Height
SaveSetting app.EXEName,_
«FormPosition», F.Tag, buf
End Sub

Вам следует поместить эти процедуры в модуль и вызывать их из событий Load и Unload форм. Вы должны написать имя формы в ее свойство Tag, чтобы эти процедуры работали корректно

Sub Form_Load()
FormPosition_Get Me
End Sub
Sub Form_Unload()
FormPosition_Put Me
End Sub

25. ЭФФЕКТИВНОЕ ИСПОЛЬЗОВАНИЕ ВНУТРЕННИХ VB КОНСТАНТ

VB4 16/32, VB5
Level: Beginning

Мне приходилось видеть некоторые советы по использованию числовых значений вместо соответствующих VB констант. Например, Вы можете вывести message box, используя числовые константы:

rc = MsgBox(msg, 4 + 32 + 256, «Confirm Delete»)

Но не легче ли прочесть следующее?

rc = MsgBox(msg, vbYesNo + vbQuestion _
+ vbDefaultButton2, _
«Confirm Delete»)

Вы можете использовать следующие константы для check box:

VbUnchecked =0
VbChecked =1
VbGrayed =2

Также полезно знать строковые константы вместо соответствующих chr$(символы ASCII):

vbTab instead of Chr$(9)
vbCr instead of Chr$(13)
vbLf instead of Chr$(10)
vbCrLf instead of Chr$(13)+Chr$(10)

26 ПРАВИЛЬНЫЙ ТЕСТ НА «FILE EXIST»

VB3, VB4 16/32, VB5
Level: Intermediate

Dir$ генерирует runtime error, если ему суют несуществующее имя диска. Например, Dir$ («d:\win\himems.sys») умирает , если драйв d: не существует. Для проверки существования файла, добавьте обработчик ошибки:

Function FileExist(filename As String) _
As Boolean
On Error Resume Next
FileExist = Dir$(filename) <> «»
If Err.Number <> 0 Then FileExist _
= False
On Error GoTo 0
End Function

Назад к СОДЕРЖАНИЮ

27. ПРОЦЕДУРЫ, РАБОТАЮЩИЕ С ГРУППАМИ КОНТРОЛОВ

VB4 16/32, VB5
Level: Intermediate

Вы можете использовать почти забытую возможность VB иметь процедуру или функцию, работающую с неограниченным числом аргументов, что может быть полезно при работе с множеством контролов. Например, Вы можете enable/disable группу контролов одним вызовом процедуры:

EnableAll True, Text1, Text2, _
Command1, Command2

Эта процедура проходит по всем контролам, передаваемым в качестве аргументов:

Sub EnableAll(Enabled As Boolean, _
ParamArray objs() As Variant)
Dim obj As Variant
For Each obj In objs
obj.Enabled = Enabled
Next obj
End Sub

Назад к СОДЕРЖАНИЮ

28 УЛУЧШЕНИЕ СКРОЛЛИНГА РИСУНКОВ

VB3, VB4 16/32, VB5
Level: Intermediate
Во-первых, сделайте, чтобы событие Scroll скроллбара картинки обновляло координаты картинки (как будто бы она движется) когда Вы возите мышой по картинке. Затем, объявите следующие переменные на уровне формы:

Dim StartX As Long, StartY As Long
Dim Moving As Boolean

Finally, declare these three events for PicPicture:
Наконец, объявите эти три события для PicPicture:

Private Sub PicPicture_MouseDown_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
StartX = x
StartY = y
Moving = True
End Sub

Private Sub PicPicture_MouseMove_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
If Moving Then
PicPicture.Move _
PicPicture.Left + x — StartX, PicPicture.Top + y — StartY
End If
End Sub

Private Sub PicPicture_MouseUp_
(Button As Integer, Shift As _
Integer, x As Single, y As Single)
Moving = False
End Sub

Теперь Вы можете скроллить картинку мышой. Не забудьте проверить границы картинки.

29. ЗАШИФРОВАННЫЕ ПАРОЛИ

VB3, VB4 16/32, VB5
Level: Intermediate

Следующие две функции легко и эффективно шифрут/дешифруют текстовый пароль. Функции имеют два аргумента: число от 1 до 10 чтобы сдвигать позицию символа ASCII в пароле, и собственно строка пароля. Функция EncryptPassword проходит через каждый символ строки DecryptedPassword, проверяет символ на четность/нечетность, и сдвигает его вверх/вниз согласно параметру Number. Эту делает зашифрованную строку нечитабельной. Зашифрованный пароль «укатывается» затем оператором XOR, который еще более запутывает строку. Я ограничил параметр Number числом 10, поскольку мне не надо делать проверку на «неправильные» символы ASCII. Функция DecryptPassword повторяет в обратном порядке процесс шифрования, применяя XOR, а затем сдвиг.

Function EncryptPassword(Number As _
Byte, DecryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer

Counter = 1
Do Until Counter = _
Len(DecryptedPassword) + 1
Temp = Asc(Mid(DecryptedPassword, _
Counter, 1))
If Counter Mod 2 = 0 Then
‘see if even
Temp = Temp — Number
Else
Temp = Temp + Number
End If
Temp = Temp Xor (10 — Number)
Password = Password & Chr$(Temp)
Counter = Counter + 1
Loop
EncryptPassword = Password
End Function

Function DecryptPassword(Number As _
Byte, EncryptedPassword As String)
Dim Password As String, Counter As Byte
Dim Temp As Integer

Counter = 1
Do Until Counter = _
Len(EncryptedPassword) + 1
Temp = Asc(Mid(EncryptedPassword, _
Counter, 1)) Xor (10 — Number)
If Counter Mod 2 = 0 Then ‘see if even
Temp = Temp + Number
Else
Temp = Temp — Number
End If
Password = Password & Chr$(Temp)
Counter = Counter + 1
Loop
DecryptPassword = Password
End Function

30. ПРОПИСНЫЕ-СТРОЧНЫЕ БУКВЫ — СОВЕТ ПО СЛЕЖЕНИЮ ЗА РЕГИСТРОМ БУКВ

VB4 16/32, VB5
Level: Intermediate
Если Вы используете левую стрелку на клаве, чтобы перейти к началу слова, а затем нажимаете букву, то в итоге Вы получаете две заглавных буквы (первая уже была, а вторую ввели Вы — я так понимаю??). Применив код, который использует преимущества встроенной в VB4/VB5 функции StrConv(), Вы получите автоматическое приведение букв в нужный регистр во время ввода:

Private Sub Text1_Change()
If Text1.Tag = «» Then
Text1.Tag = Text1.SelStart
Text1.Text = StrConv(Text1.Text, vbProperCase)
Text1.SelStart = Text1.Tag
Text1.Tag = «»
End If
End Sub

31. ОТСЛЕЖИВАНИЕ DOUBLE CLICK ДЛЯ КНОПОК НА ТУЛБАРЕ

VB4 32, VB5
Level: Intermediate
VB4 поддерживает встроенный в Win95 контрол Toolbar, позволяющий юзерам добавлять кнопки на Тулбар. У этих кнопок есть событие ButtonClick, но если Вы хотите отлавливать double-click, то стандартного события ButtonDoubleClick нет. Чтобы исправить это, объявите две переменные уровня формы:

Private mbSingleClicked As Boolean
Private mbDoubleClicked As Boolean

In the Toolbars ButtonClick event, add this code:
В событии ButtonClick Тулбара добавьте следующий код:

Private Sub Toolbar1_ButtonClick_
(ByVal Button As Button)
Dim t As Single
t = Timer
If mbSingleClicked = True Then
mbDoubleClicked = True
MsgBox «Double Clicked»
Else
mbSingleClicked = True
‘ позволить юзеру кликнуть еще раз, если он хочет дабл-кликнуть
Do While Timer — t Назад к СОДЕРЖАНИЮ

32. ОБЪЕМ КАТАЛОГА В БАЙТАХ

VB3, VB4 16/32, VB5
Level: Intermediate

Эта функция возвращает число байт, занятых файлами в каталоге:

Function DirUsedBytes(ByVal dirName As _
String) As Long
Dim FileName As String
Dim FileSize As Currency

‘ добавить \, если не было
If Right$(dirName, 1) <> «\» Then
dirName = dirName & «\»
Endif
FileSize = 0
FileName = Dir$(dirName & «*.*»)

Do While FileName <> «»
FileSize = FileSize + _
FileLen(dirName & FileName)
FileName = Dir$
Loop
DirUsedBytes = FileSize

Пример вызова такой функции:

Назад к СОДЕРЖАНИЮ

33. ПОЛЕЗНАЯ ДИСКОВАЯ ИНФОРМАЦИЯ

VB4 32, VB5
Level: Advanced

Эта функция возвращает количество свободного пространства на диске, общий объем диска, долю свободного пространства н адиске, и использванное пространство. Перед вызовом функции, присвойте первому полю структуры DISKSPACEINFO («RootPath») имя диска:

Dim dsi As DISKSPACEINFO
dsi.RootPath = «C:\»
GetDiskSpace dsi

Функция возвращает все результаты в других полях записи(структуры):

‘ *** Declaratiosn Section ******
Declare Function GetDiskFreeSpace Lib _
«kernel32» Alias _
«GetDiskFreeSpaceA» _
(ByVal lpRootPathName As String, _
lpSectorsPerCluster As Long, _
lpBytesPerSector As Long, _
lpNumberOfFreeClusters As Long, _
lpTotalNumberOfClusters As Long) _
As Long

Type DISKSPACEINFO
RootPath As String * 3
FreeBytes As Long
TotalBytes As Long
FreePcnt As Single
UsedPcnt As Single
End Type

‘ ****** МОДУЛЬ КОДА ******
Function GetDiskSpace(CurDisk As _
DISKSPACEINFO)
Dim X As Long
Dim SxC As Long, BxS As Long
Dim NOFC As Long, TNOC As Long

X& = GetDiskFreeSpace_
(CurDisk.RootPath, SxC, BxS, _
NOFC, TNOC)
GetDiskSpace = X&

If X& Then
CurDisk.FreeBytes = BxS * _
SxC * NOFC
CurDisk.TotalBytes = BxS * _
SxC * TNOC
CurDisk.FreePcnt = ((CurDisk._
TotalBytes CurDisk._
FreeBytes) / CurDisk._
TotalBytes) * 100
CurDisk.UsedPcnt = _
(CurDisk.FreeBytes / _
CurDisk.TotalBytes) * 100
Else
CurDisk.FreeBytes = 0
CurDisk.TotalBytes = 0
CurDisk.FreePcnt = 0
CurDisk.UsedPcnt = 0
End If
End Function

В таком виде, функция работает с драйвами размера где-то до 2Гб, для больших дисков надо использовать переменные типа Single.

Назад к СОДЕРЖАНИЮ

34. КАК СЫМИТИРОВАТЬ НАЖАТИЕ КЛАВИШИ CTRL ДЛЯ ВЫДЕЛЕНИЯ НЕСВЯЗАННЫХ КУСКОВ В LIST BOX

VB4 32, VB5
Level: Advanced

Когда свойство MultiSelect обычного listboxа установлено в 1 — Simple или в 2 — Extended, то юзеру надо жать Ctrl при кликании внутри этого listboxа, чтобы выделять несвязанные (идущие неподряд) элементы. Мой метод позволяет юзеру выбирать несколько элементов, не нажимая при этом Ctrl. Поместите нижеприведенный код в модуль.

Declare Function GetKeyboardState Lib _
«user32» (pbKeyState As Byte) _
As Long
Declare Function SetKeyboardState Lib _
«user32» (lppbKeyState As Byte) _
As Long
Public Const VK_CONTROL = &H11
Public KeyState(256) As Byte

Этот код засуньте в событие MouseDown Вашего listboxа (назовем его List1), у которого свойство MultiSelect установлено в Simple или Extended:

‘ «нажимает» Ctrl
GetKeyboardState KeyState(0)
KeyState(VK_CONTROL) = _
KeyState(VK_CONTROL) Or &H80
SetKeyboardState KeyState(0)

Этот код поместите в процедуру, в которой надо «отжать» Ctrl, например, List1_LostFocus:

‘ «отжимает» Ctrl
GetKeyboardState KeyState(0)
KeyState(VK_CONTROL) = _
KeyState(VK_CONTROL) And &H7F
SetKeyboardState KeyState(0)

35. ВЫБРАТЬ ВСЕ ФАЙЛЫ ПО МАСКЕ В ПОДДЕРЕВЕ КАТАЛОГОВ

VB3, VB4 16/32, VB5
Level: Intermediate

Поскольку этот код не использует API, Вы можете легко перенести его с 16- на 32-разрядную платформу и обратно. Процедура DirWalk позводит Вам просмотреть все поддерево, начиная с заданнного места:

ReDim sArray(0) As String
Call DirWalk(«OLE*.DLL», «C:\», sArray)

Эта процедура принимает * и ? в первом аргументе, который задает маску поиска. Вы можете задать несколько масок, разделяя их символом «;», например, «OLE*.DLL; *.TLB». Второй аргумент — место старта, третий аргумент — массив строк.
Эта процедура рекурсивно проходит по всем каталогам и кладет все файлы, удовлетворяющие условию, в массив sArray с указанием полного пути. Этот массив меняет свои размеры в зависимости от количества файлов, удовлетворяющих условиям поиска.
Для использовния DirWalk, пихните два контрола, FileListBox и DirListBox, на форму. Эта процедура подразумевает, что она работает с контролами на текущей форме: : FileListBox по имени File1, и DirListBox по имени Dir1. Для увеличения скорости работы сделайте эти контролы невидимыми. Использование этих контролов не требует приобретения дополнительных тулзов, так как они (контролы) содержатся в базовой библиотеке контролов VB.

Sub DirWalk(ByVal sPattern As String, _
ByVal CurrDir As String, sFound() _
As String)
Dim i As Integer
Dim sCurrPath As String
Dim sFile As String
Dim ii As Integer
Dim iFiles As Integer
Dim iLen As Integer

If Right$(CurrDir, 1) <> «\» Then
Dir1.Path = CurrDir & «\»
Else
Dir1.Path = CurrDir
End If
For i = 0 To Dir1.ListCount
If Dir1.List(i) <> «» Then
DoEvents
Call DirWalk(sPattern, _
Dir1.List(i), sFound())
Else
If Right$(Dir1.Path, 1) = «\» _
Then
sCurrPath = Left(Dir1.Path, _
Len(Dir1.Path) — 1)
Else
sCurrPath = Dir1.Path
End If
File1.Path = sCurrPath
File1.Pattern = sPattern
If File1.ListCount > 0 Then
‘ нужные файлы найдены в каталоге
For ii = 0 To File1._
ListCount — 1
ReDim Preserve _
sFound(UBound(sFound) _
+ 1)
sFound(UBound(sFound) — _
1) = sCurrPath & _
«\» & File1.List(ii)
Next ii
End If
iLen = Len(Dir1.Path)
Do While Mid(Dir1.Path, iLen, _
1) <> «\»
iLen = iLen — 1
Loop
Dir1.Path = Mid(Dir1.Path, 1, _
iLen)
End If
Next i
End Sub

36. ИМЯ ТЕКУЩЕГО КОМПЬЮТЕРА В WINDOWS 95/NT

VB4 32, VB5
Level: Advanced

Часто Вам надо знать имя текущего компа под WINDOWS 95/NT из Вашей VB проги. Используйте эту простенькую функцию API из kernel32.dll:

Private Declare Function GetComputerNameA Lib «kernel32″_
(ByVal lpBuffer As String, nSize _
As Long) As Long

Public Function GetMachineName() As _
String
Dim sBuffer As String * 255
If GetComputerNameA(sBuffer, 255&) _
<> 0 Then
GetMachineName = Left$(sBuffer, _
InStr(sBuffer, vbNullChar) _
— 1)
Else
GetMachineName = «(Not Known)»
End If
End Function

Назад к СОДЕРЖАНИЮ

37. КАК ПОКАЗАТЬ ШРИФТЫ, КОГДА ВЫ ВЫБИРАЕТЕ ИХ

VB3, VB4 16/32, VB5
Level: Intermediate
Чтобы юзер мог изменить имя шрифта, загрузите все шрифты в комбобокс:

Private Sub Form_Load()
‘ определить количество экранных шрифтов.
For I = 0 To Screen.FontCount — 1
‘ засунуть все шрифты в листбокс.
cboFont.AddItem Screen.Fonts(I)
Next I
End Sub

Украсьте процедуру, позволив юзеру сразу видеть результат своего выбора, без необходимости печатать «что-нибудь» в качестве теста:

Private Sub cboFont_Click()
‘ сделать выбранный FontName шрифтом combobox
cboFont.FontName = cboFont.Text
End Sub

Назад к СОДЕРЖАНИЮ

38. ПЕРЕХВАТ ПРАВЫХ КЛИКОВ НА УЗЛАХ TREEVIEW

VB4 32, VB5
Level: Intermediate

Контрол TreeView придает Вашей аппликухе законченный вид Windows 95. Однако, в учебниках по VB не сказано, как перехватывать правый мышиный клик на узле (node) дерева. Событие Treeview_MouseDown происходит до события NodeClick. Чтобы показать контекстное меню над узлом, используйте этот код и определите ключ (Key) для для каждого узла в виде буквы и идущим за ней числом.

+ Root (R01) ‘ the letter gives
|— Child 1 (C01) ‘ the indication to
|—+ Child 2 (C02) ‘ the context menu
| |— Child 2.1 (H01)
| |— Child 2.2 (H02)

Dim bRightMouseDown as Boolean

Private Sub Form_Load()
bRightMouseDown = False
End Sub

Private Sub treeview1_MouseDown_
(Button As Integer, Shift As _
Integer, X As Single, Y As Single)
If Button And vbRightButton Then
bRightMouseDown = True
Else
bRightMouseDown = False
End If
End Sub

Private Sub treeview1_MouseUp_
(Button As Integer, Shift As _
Integer, X As Single, Y As Single)
bRightMouseDown = False
End Sub

Private Sub treeview1_NodeClick_
(ByVal Node As Node)
Select Case Left(Node.Key, 1)
Case «R»
If Not bRightMouseDown Then
‘ do the normal node click,
‘ so you must here the code
‘ for the node code click
Else
‘ выбор узла
treeview1.Nodes(Node.Key).Selected = True
‘ показать контекстное меню
PopupMenu mnuContext1
End If

Case «C»
If Not bRightMouseDown Then
‘ do the normal node click,
‘ so you must here the code
‘ for the node code click
Else
‘ выбор узла
treeview1.Nodes(Node.Key).Selected = True
‘ показать контекстное меню
PopupMenu mnuContext2
End If

‘ то же с остальными узлами
‘ .
End Select
End Sub

39. ЗАПУСК VB ПРИ ПОМОЩИ МЕНЮ SENDTO

VB3, VB4 16/32, VB5
Level: Intermediate
Добавление ярлыка «Shortcut to VB.exe» и «Shortcut to VB32.exe» в меню «Send To» позволяет Вам right-clickом на любом VBP проекте открывать его в VB4 16/32 или в VB5 — на выбор.
Зайдите в Ваш VB каталог, right-clickните на VB32.exe, и выберите «Create shortcut.». Когда ярлык будет создан, переместите его в каталог C:\Windows\Sendto. Теперь при right-clickе на проекте Вы сможете выбрать, куда «переслать» Ваш проект. Вы можете добавить ярлыки для WordPad, Word, Excel или любой другой программы, допускающей использование входного файла в качестве параметра запуска.

40. НОВЫЕ “ГОРЯЧИЕ КНОПКИ” ДЛЯ VB

VB4 16/32, VB5
Level: Intermediate

1) В VB5, нажмите Ctrl-F3 когда курсор находится над каким-либо словом. При этом автоматически будет найдено следующее вхождение этого слова в тексте, минуя диалог поиска. Курсор должен стоять как минимум за первой буквой слова, чтобы эта фича работала правильно.

2) В VB4/5 нажатием Ctrl-Tab можно перемещаться между всеми открытыми окнами в IDE, это часто оказывается быстрее, чем идти в меню Window.

41. КАК ПОЛУЧИТЬ USERID ПОД WINDOWS 95/NT

VB4 32, VB5
Level: Intermediate

Часто Вам надо получить userID текущего юзера, работающего с Вашей программой. Используйте для этого модификацию одной из функций API:

Private Declare Function WNetGetUserA _
Lib «mpr» (ByVal lpName As String, _
ByVal lpUserName As String, _
lpnLength As Long) As Long

Function GetUser() As String
Dim sUserNameBuff As String * 255
sUserNameBuff = Space(255)
Call WNetGetUserA(vbNullString, _
sUserNameBuff, 255&)
GetUser = Left$(sUserNameBuff, _
InStr(sUserNameBuff, _
vbNullChar) — 1)
End Function

42 ВЫВОД ПЕСОЧНЫХ ЧАСОВ ВО ВРЕМЯ ОБРАБОТКИ ДАННЫХ

VB4 32, VB5
Level: Advanced

Нижеуказанная методика упрощает переключение MousePointerа, без добавления спец. кода в конце каждой процедуры/функции. Когда Вы созадете объект из какого-либо класса, генерируется событие Initialize. Затем исполняется код соответствующей процедуры. Это первый код, исполняемый для данного объекта, он исполняется до присвоения каких-либо свойств объекту и до выполнения методов объекта. Когда переменная выходит из области видимости, все ссылки на объект уничтожаются, и выполняется код для события Terminate.

Declare Sub Sleep Lib «kernel32» _
(ByVal dwMilliseconds As Long)

‘ пример процедуры, использующей класс CHourGlass
Private Sub ProcessData()
Dim MyHourGlass As CHourGlass
Set MyHourGlass = New CHourGlass
‘ здесь вставляется код обработки данных
Sleep 5000 ‘ Это моделирует обработку данных
‘ продолжение кода
End Sub

‘ создание класса CHourGlass:
Private Sub Class_Initialize()
‘ Показать HourGlass
Screen.MousePointer = vbHourglass
End Sub

Private Sub Class_Terminate()
‘ Восстановить MousePointer
Screen.MousePointer = vbDefault
End Sub

Назад к СОДЕРЖАНИЮ

43. ОЦЕНКА ПРОМЕЖУТКА ВРЕМЕНИ(в минутах) МЕЖДУ ДВУМЯ ДАТАМИ

VB4 16/32, VB5
Level: Beginning
Вам может понадобиться число прошедших минут между двумя событиями. Код:

lTotalMinutes = Minutes(Now) — _
Minutes(datStartTime)

Эта функция возвращает количество минут с 01/01/1900:

Public Function Minutes(d As Date) _
As Long
‘ Минуты, прошедшие с 1900
Dim lPreviousDays As Long
Dim lTotalMinutes As Long

lPreviousDays = d — #1/1/1900#
lTotalMinutes = _
(lPreviousDays * 24) * 60
lTotalMinutes = lTotalMinutes + _
Hour(d) * 60
lTotalMinutes = lTotalMinutes + _
Minute(d)

Minutes = lTotalMinutes
End Function

Назад к СОДЕРЖАНИЮ

44. ХВАТИТ ПЕЧАТАТЬ!

VB3, VB4 16/32, VB5
Level: Beginning

Иногда мне хочется распечатать данные из recordsetа, строка за строкой. Однако, довольно трудно пркратить этот процесс до того как весь recordset уйдет в очередь принтера. Используйте кнопку Cancel, которая устанавливает флаг. Кроме кнопки, посылающей задание на печать, создайте еще одну, под названием Cancel. Вы также можете присвоить ее свойству Cancel значение True, чтобы юзер мог остановить печать нажатием на Esc. Добавьте еще одну переменную в модуль:

Dim CancelNow As Integer

Put this code in the Click event of the Cancel button:
Добавьте этот код в событие Click кнопки Cancel:

Sub cCancel_Click ()
CancelNow = -1
DoEvents
End Sub

Вы можете даже обойтись без кнопки и ловить только нажатие на Escape. В этом случае, установите свойство KeyPreview формы в True и вставьте следующий код:

Sub Form_KeyPress (KeyAscii As Integer)
‘ если юзер жмет ESC
If KeyAscii = (27) Then
CancelNow = -1
DoEvents
End If
End sub

Наконец, вставьте проверку флага внутри цикла печати:

‘. какой-то код.
‘ печать recordset из database
Do While Not MyRecordSet.EOF
Printer.Print MyRecordSet!SomeRecord
MyRecordSet.MoveNext
DoEvents
‘ остановка, если был нажат Cancel
If CancelNow then Exit Do
Loop
Printer.EndDoc
‘. код далее.

45. ПОМЕНЯТЬ ЗНАЧЕНИЯ ДВУХ ПЕРЕМЕННЫХ

VB3, VB4 16/32, VB5
Level: Intermediate

Use this algorithm to swap two integer variables:
Собственно, вот:

a = a Xor b
b = a Xor b
a = a Xor b

46. БЫСТРЫЙ ОБСЧЕТ МНОГОЧЛЕНОВ

VB3, VB4 16/32, VB5
Level: Intermediate

Хорошо известная формула Горнера позволяет быстро считать полиномиальные выражения. Для того, чтобы посчитать
A*x^N + B*x^(N-1) + … + Y*x + Z ( ^ означает степень ), напишите :
(…((A*x + B)*x + C)*x + … +Y)*x + Z.

Назад к СОДЕРЖАНИЮ

47. ФОРМАТИРОВАНИЕ И КОПИРОВАНИЕ ДИСКЕТ ЧЕРЕЗ ФУНКЦИИ API

VB4 32, VB5
Level: Advanced

В Win32 API есть парочка функций, позволяющих форматировать и копировать дискеты из программы:

Private Declare Function SHFormatDrive _
Lib «shell32» (ByVal hwnd As Long, _
ByVal Drive As Long, _
ByVal fmtID As Long, _
ByVal options As Long) As Long
Private Declare Function GetDriveType _
Lib «kernel32» _
Alias «GetDriveTypeA» _
(ByVal nDrive As String) As Long

Добавьте две command buttons в форму, назовите их cmdDiskCopy и cmdFormatDrive, и засуньте в их события Click следующие фрагменты кода:

Private Sub cmdDiskCopy_Click()
‘ DiskCopyRunDll требует два параметра — From и To
Dim DriveLetter$, DriveNumber&, _
DriveType&
Dim RetVal&, RetFromMsg&
DriveLetter = UCase(Drive1.Drive)
DriveNumber = (Asc(DriveLetter) — _
65)
DriveType = GetDriveType_
(DriveLetter)
If DriveType = 2 Then ‘Floppies, _
etc
RetVal = Shell_
(«rundll32.exe » & _
«diskcopy.dll,» _
& «DiskCopyRunDll » & _
DriveNumber & «,» & _
DriveNumber, 1)
Else ‘ Just in case
RetFromMsg = MsgBox_
(«Only floppies can be » & _
«copied», 64, _
«DiskCopy Example»)
End If
End Sub

Private Sub cmdFormatDrive_Click()
Dim DriveLetter$, DriveNumber&, _
DriveType&
Dim RetVal&, RetFromMsg%
DriveLetter = UCase(Drive1.Drive)
DriveNumber = (Asc(DriveLetter) — _
65)
‘ Заменить букву на цифру: A=0
DriveType = GetDriveType_
(DriveLetter)
If DriveType = 2 Then _
‘ т.е. флоп
RetVal = SHFormatDrive(Me.hwnd, _
DriveNumber, 0&, 0&)
Else
RetFromMsg = MsgBox_
(«This drive is NOT a » & _
«removeable drive! » & _
«Format this drive?», _
276, «SHFormatDrive Example»)
If RetFromMsg = 6 Then
‘ Раскомментируйте и увидите.
‘RetVal = SHFormatDrive_
(Me.hwnd, _
‘ DriveNumber, 0&, 0&)
End If
End If
End Sub

Добавьте контрол DriveListBox под именем Drive1:

Private Sub Drive1_Change()
Dim DriveLetter$, DriveNumber&, _
DriveType&
DriveLetter = UCase(Drive1.Drive)
DriveNumber = (Asc(DriveLetter) — _
65)
DriveType = GetDriveType_
(DriveLetter)
If DriveType <> 2 Then _
‘Floppies, etc
cmdDiskCopy.Enabled = False
Else
cmdDiskCopy.Enabled = True
End If
End Sub

Будьте осторожны: так недолго и винт запороть.

Назад к СОДЕРЖАНИЮ

48. ПОСЛЕДОВАТЕЛЬНЫЕ НОМЕРА ВЕРСИЙ

VB4 16/32, VB5
Level: Intermediate

Для слежения за последовательностью версий, используйте эту процедуру, если Вы используете номер версии:

Public Function GetMyVersion() As String
‘ конвертирует номер версии в нечто вроде»1.02.0001″
Static strMyVer As String
If strMyVer = «» Then
strMyVer = Trim$(Str$(App.Major)) & «.» & _
Format$(App.Minor, «##00») _
& «.» Format$(App.Revision, «000»)
End If
GetMyVersion = strMyVer
End Function

49. ВЫРАВНИВАНИЕ КОНТРОЛОВ ПО ПРАВОМУ КРАЮ

VB3, VB4 16/32, VB5
Level: Beginning

При создании форм с нефиксированными размерами, я предпочитаю помещать все контролы в правый нижний и правый верхний углы. Например, на формах, где вводятся данные, я ставлю кнопки навигации по записям в левую нижнюю часть формы вместе с кнопками Add New Record, Delete Record, и Find Record. В нижнем правом углу я ставлю кнопки print preview и закрытия формы. Поместите эту процедуру в модуль или general declarations формы. Параметром Offset Вы можете изменять дистанцию от правого края формы, то есть Вы можете выравнивать по правому краю Ваши контролы.

Sub ButtonRight(X As Control, _
Frm As Form, Offset as Integer)
X.Left = Frm.ScaleWidth — _
X.Width — Offset
End Sub

Поместите два command buttonа на форму. В событии Form_Resize, добавьте примерно такой код:

Private Sub Form_Resize()
ButtonRight Command1, Me, 0
ButtonRight Command2, Me, _
Command1.Width
End Sub

50. VAL( ) НЕ РАБОТАЕТ НА ФОРМАТИРОВАННЫХ ЧИСЛАХ

VB3, VB4 16/32, VB5
Level: Intermediate

Осторожнее с функцией Val(). Она некорректно распознает форматированные числа. Используйте вместо этого CInt(), CDbl().

FormattedString = Format(1250, _
«General»)
‘ = «1,250.00»
Debug.Print Val(FormattedString)
‘ напечатает 1 !
Debug.Print cDbl(FormattedString)
‘ напечатает 1250

51. CМЫШЛЕНЫЙ ГЕНЕРАТОР ID

VB3, VB4 16/32, VB5
Level: Intermediate

Я написал генератор для создания уникальных номиров , типа номера акаунта, или ID в вашеи приложении. Я использую это вместе с фенкцией CheckForValid, например CheckForValid вернет True для номера «203931.» И вернет False для «209331.»

Function CheckForValid(Num As Long) _
As Boolean
‘ Check for valid number
Result = Num Mod 13
If Result <> 0 Then
CheckForVal > ‘ if false then the number is wrong
Else
CheckForVal > ‘if true the number is OK
End If
End Function

Function Generate(Num As Long) As Long
‘Generates the successor of a valid
‘number
If CheckForValid(Num) Then
Generate = Num + 13
‘if valid Generate
Else
Generate = -1
‘ Otherwise return -1
End If
End Function

52. ИЗМЕНЕНИЕ РАЗМЕРА ВЫПАДАЮЩЕЙ ОБЛАСТИ НА COMBOBOXE

VB4 32, VB5
Level: Advanced
В VB нет свойства ListRows, т.е. если Вам надо изобразить более чем 8 дефолтовых строк на выпадающем списке comboboxа, то используйте эту процедуру для увеличения размера окна comboboxа:

Type POINTAPI
x As Long
y As Long
End Type

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Declare Function MoveWindow Lib _
«user32» (ByVal hwnd As Long, _
ByVal x As Long, ByVal y As Long, _
ByVal nWidth As Long, _
ByVal nHeight As Long, _
ByVal bRepaint As Long) As Long
Declare Function GetWindowRect Lib _
«user32» (ByVal hwnd As Long, _
lpRect As RECT) As Long
Declare Function ScreenToClient Lib _
«user32» (ByVal hwnd As Long, _
lpPoint As POINTAPI) As Long

Public Sub Size_Combo(rForm As Form, _
rCbo As ComboBox)
Dim pt As POINTAPI
Dim rec As RECT
Dim iItemWidth As Integer
Dim iItemHeight As Integer
Dim iOldScaleMode As Integer

‘ Смена Scale Mode формы на Pixels
iOldScaleMode = rForm.ScaleMode
rForm.ScaleMode = 3
iItemW >

‘ Установка новой высоты comboboxа
iItemHeight = rForm.ScaleHeight — rCbo.Top — 5
rForm.ScaleMode = iOldScaleMode

‘ Получение координат по отношению к экрану
Call GetWindowRect(rCbo.hwnd, rec)
pt.x = rec.Left
pt.y = rec.Top

‘ затем координаты в форме
Call ScreenToClient(rForm.hwnd, pt)

‘ Изменение размера comboboxа
Call MoveWindow(rCbo.hwnd, pt.x, _
pt.y, iItemWidth, iItemHeight, 1)
End Sub

Назад к СОДЕРЖАНИЮ


53. КОЛИЧЕСТВО СВОБОДНОЙ ПАМЯТИ С ПОМОЩЬЮ WIN32

VB4 32, VB5
Level: Advanced

Если Вам надо показать юзерам, сколько свободной памяти доступно на машине, и Вы перешли с 16бит на 32 бит платформу, то Вы заметите, что функция API GetFreeSystemResources исяезла. Но это не беда. Вам надо всего лишь объявить API функцию и следующий тип в модуле:

Declare Sub GlobalMemoryStatus Lib _
«kernel32» (lpBuffer As _
MEMORYSTATUS)

Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type

Илон Маск рекомендует:  Противостояние яндекс или гугл

Занесите в поле dwlength размер типа MEMORYSTATUS. Переменная типа Long берет 4 байта, так что всего выйдет 4*8=32 байта:

Dim ms As MEMORYSTATUS

ms.dwLength = Len(ms)
GlobalMemoryStatus ms
MsgBox «Total physical memory:» & _
ms.dwTotalPhys & vbCr _
& «Available physical memory:» & _
ms.dwAvailPhys & vbCr & _
«Memory load:» & ms.dwMemoryLoad

Вы можете даже написать класс, в котором инкапсулировать все вышеизложенное.

Назад к СОДЕРЖАНИЮ

54. СКОЛЬКО ВАМ ЛЕТ?

VB5
Level: Intermediate

Эта функция возвращает разницу между двумя датами в годах, месяцах и днях:

Function GetAge(dtDOB As Date, _
Optional dtDateTo As Date = 0) _
As String
‘ dtDateto передана?
If dtDateTo = 0 Then
dtDateTo = Date
End If
GetAge = Format$(dtDateTo — _
dtDOB, «yy — mm — dd»)
End Function

55. УЗЕЛОК, О КОТОРОМ НЕВОЗМОЖНО ЗАБЫТЬ

VB3, VB4 16/32, VB5
Level: Intermediate

Я часто работаю над несколькими проектами одновременно. Прыгая с одного проекта на другой и обратно, иногда я теряю след, в какой программе в каком месте я остановился. Для решения этой проблемы, возьмите да и напечатайте какую-нибудь фразу без кавычек комментария.
В следующий раз, когда Вы запустите проект, выберите пункт «Start With Full Compile». Если эта фраза будет первой ошибкой в проекте, Вы сразу увидите ее подсвеченной и Ваша память освежится.

56. СОЗДАТЬ НА ЛЕТУ МАССИВ ПРИ ПОМОЩИ ФУНКЦИИ ARRAY

VB4 16/32, VB5
Level: Intermediate

Метод GetRows копирует строки Recordsetа (JET) или rdoResultsetа (RDO) в массив. Я часто использую эту фичу для передачи данных между OLE Serverом и клиентскими аппликухами. Этот метод использует переменную типа Variant в качестве параметра для хранения возвращаемых данных. Это двумерный массив (по внутреннему представлению VB)

Dim A As Variant
A = Array(10,2)

Назад к СОДЕРЖАНИЮ

57. НАЙТИ ВЫБРАННЫЙ КОНТРОЛ В МАССИВЕ OPTION BUTTONS

VB4 16/32, VB5
Level: Intermediate
Используйте этот код для нахождения индекса выбранного контрола из массива option buttons

Function WhichOption(Options As _
Object) As Integer

‘ Эта функция возвращает индекс Option Button, чье значение true.

Dim i
‘ Если Options — не тот объект, или не объект вообще
On Error GoTo WhichOptErr
‘ Default to failed
WhichOption = -1
‘ проверяет каждый OptionButton в массиве. Прошу отметить, что функция выдает
‘ неправильное значение, если индексы идут не подряд
For i = Options.lbound To _
Options.ubound
If Options(i) Then
‘ запомнить значение найденного индекса
WhichOption = i
‘ и выйти
Exit For
End If
Next
WhichOptErr:

Учтите, что iCurOptIndex имеет тип integer, а Option1 это имя массива контролов OptionButton.

Важно: параметр функции — объект. Она будет работать только с параметрами-объектами или типа variant.

Назад к СОДЕРЖАНИЮ

58. УПАКОВКА ЗНАЧЕНИЙ CHECK-BOX В ОДНУ ПЕРЕМЕННУЮ ТИПА INTEGER

VB4 16/32, VB5
Level: Intermediate

Используя следующий код, можно вывести двоичное представление зачеркнутых check boxов:

Function WhichCheck(ctrl As Object) As _
Integer
‘ Эта функция возвращает двоичное представление массива контролов,
‘ где каждый зачеркнутый чекбокс представляется двойкой в степени своего индекса в
‘ массиве, напр.элемент 0 : 2 ^ 0 = 1,
‘элементы 0 и 2 : 2^0 + 2^2 = 5

Dim i
Dim iHolder
‘ если некорректный параметр передан в процедуру
‘ возвращается 0
On Error GoTo WhichCheckErr

‘ двоичное представление
‘ массива чекбоксов
For i = ctrl.LBound To ctrl.UBound
If ctrl(i) = 1 Then
‘ если зачеркнут, добавить его двоичное представление
iHolder = iHolder Or 2 ^ i
End If
Next
WhichCheckErr:
WhichCheck = iHolder

Функция вызывается следующим образом:

Check1 — массив чекбоксов, iCurChecked — переменная integer. Ниже приведена «двойственная» процедура, устанавливающая все чекбоксы согласно переменной, в которой хранятся их двоичные представления.

Sub SetChecked(ctrl As Object, _
iCurCheck%)
‘ This sub sets the binary value of an
‘ array of controls where iCurChecked is
‘ 2 raised to the index of each checked
‘ control
Dim i
‘ in case ctrl is not a valid object
On Error GoTo SetCheckErr
‘ use the binary representation to
‘ set individual check box controls
For i = ctrl.LBound To ctrl.UBound
If iCurCheck And (2 ^ i) Then
‘ if it is checked add in its
‘ binary value
ctrl(i).Value = 1
Else
ctrl(i).Value = 0
End If
Next
SetCheckErr:

Эта процедура вызывается так:

Call SetChecked(Check1, iDesired)

Check1 — массив чекбоксов, iDesired- переменная, хранящая двоичное представление состояния чекбоксов.

59. УСЛОВНАЯ КОМПИЛЯЦИЯ КОДА

VB4 16/32, VB5
Level: Intermediate

Большинству разработчиков известна фича Conditional Compilation из VB4, когда Вы можете объявлять процедуры Windows API для 16- или 32-разрядных ОС:

#If Win#32 then
‘ если 32-разрядная ОС
Declare SomeApi.
#Else
‘ если запущена 16-разрядная ОС
Declare SomeApi
#End IF
Эта же фича может работать не только с функциями Windows API, но и с Вашими собственными функциями:

#If Win32 Then
Dim lRc&
lRc& = ReturnSomeNumber(35000)
#Else
Dim lRc%
lRc% = ReturnSomeNumber(30000)
#End If

#If Win32 Then
Private Function ReturnSomeNumber_
(lVar&) As Long
ReturnSomeNumber = 399999
#Else
Private Function ReturnSomeNumber_
(lVar%) As Integer
ReturnSomeNumber = 30000
#End If

60. УМЕНЬШИТЬ МЕРЦАНИЕ ВО ВРЕМЯ ЗАГРУЗКИ ФОРМЫ

VB4, VB5
Level: Intermediate

Во время загрузки формы, следующий код поможет уменьшить мерцание и мелькание GUI при помощи функций API:

‘Declarations Section
#If Win32 Then
Declare Function LockWindowUpdate _
Lib «user32» _
(ByVal hwndLock As Long) As Long
#Else
Declare Function LockWindowUpdate _
Lib «User» _
(ByVal hwndLock As Integer) _
As Integer
#End If

Public Sub LoadSomeForm()

‘ Во время загрузки формы запрещает обновление состояния окна
‘ чтобы избавиться от мерцания.
‘ запрещаетобновление GUI
LockWindowUpdate frmTest.hWnd
‘ показывает форму
frmTest.Show
‘ здесь код, относящийся к загрузка формы и т.п.

‘ Никогда не забывайте разрешить обратно обновление окна
LockWindowUpdate 0
End Sub

61. СПРЯТАТЬ УКАЗАТЕЛЬ НА ТЕКУЩУЮ ЗАПИСЬ в DBGride

VB4 16/32, VB5
Level: Advanced

Для того, чтобы указатель записи на DBGride не скакал при перемещении между записями (строками grida), используйте функцию API LockWindowUpdate(gridname.hwnd) перед началом движения по gridу, и LockWindowUpdate(0) после окончания перемещений:

‘Declarations Section
#If Win32 Then
Declare Function LockWindowUpdate _
Lib «user32» _
(ByVal hwndLock As Long) As Long
#Else
Declare Function LockWindowUpdate _
Lib «User» _
(ByVal hwndLock As Integer) _
As Integer
#End If

Private Sub cmdHideSelector_Click()
LockWindowUpdate DBGrid1.hWnd
End Sub

Private Sub cmdShowSelector_Click()
LockWindowUpdate 0
End Sub

62. USE POPUP MENUS IN WINDOWS WITHOUT TITLE BAR

VB4 16/32
Level: Intermediate

Когда Вы устанавливаете свойство ControlBox в False и BorderStyle в fixed window, то можете получить окно(форму) без titlebar (поля заголовка). Если же вы добавите меню на эту форму — титул-бар появится снова. Чтобы измежать этой проблемму вы можете разместить меню на другой форме.

Private Sub Command1_Click()
Dim frm As New frmMenu
Load frm
frm.PopupMenu frm.mnutest
‘select specific code
Unload frm
End Sub

Такое поведение исправлено в VB5

Назад к СОДЕРЖАНИЮ

63. КАК УЗНАТЬ РАЗДЕЛИТЕЛИ ДАТЫ И ВРЕМЕНИ БЕЗ ФУНКЦИЙ API

VB3, VB4 16/32, VB5
Level: Intermediate

Вот простой алгоритм как узнать разделители даты, времени и десятичной точки в Windows, не залезая в Locale Settings или функции API.

DateDelimiter = Mid$(Format(Date, _
«General Date»), 3, 1)
TimeDelimiter = Mid$(Format(0.5, _
«Long Time»), 3, 1)
DecimalDelimiter = Mid$(Format(1.1, _
«General Number»), 2, 1)

Назад к СОДЕРЖАНИЮ

64. ПРЕДОТВРАЩЕНИЕ ОШИБОК ПРИ ИСПОЛЬЗОВАНИИ GETSETTING

VB4 16/32, VB5
Level: Intermediate

Использование функции GetSetting может породить ошибки, особенно в некоторых ситуациях при 16-разрядной ОС при работе с INI файлами. Если искомого параметра нет в INI файле, то Вы можете увидеть сообщение об ошибке «Invalid procedure call.». Используйте нижеприведенную процедуру, которая подменяет обработчик ошибок:

Public Function GetRegSetting(AppName _
As Variant, Section As Variant, _
Key As Variant, Optional Default _
As Variant) As Variant

‘ дефолтовое значение не имеет не-объектный тип , иначе придется
‘ использовать слово Set
Dim tmpValue As Variant

‘ установка величины по умолчанию
‘ если величина передана не была,
‘ получаем пустую переменную типа Variant
If Not IsMissing(Default) Then _
tmpValue = Default

‘ это отлавливает возможные ошибки
On Error Resume Next

‘ теперь можно использовать функцию из VB
tmpValue = GetSetting(AppName, _
Section, Key, tmpValue)

‘ после возможных ошибок вызов повторяется здесь
‘ с уже определенным значением tmpValue
GetRegSetting = tmpValue

65. ДУБЛИРОВАНИЕ СТРОК КОДА БЕЗ СИНТАКСИЧЕСКИХ ОШИБОК

VB3, VB4 16/32, VB5
Level: Beginning
Часто мне приходится переписывать сходный по смыслу код с небольшими изменениями в каждой строке; для облегчения проблемы я делаю шаблон того, что надо копировать, быстро вставляю копию в нужное место, и делаю добавления. Однако часто шаблонный текст вызывает ошибки со стороны VB редактора. Одолеть эту проблему можно, закомментировав шаблон перед использованием. Когда Вы закончите редактирование вставленного фрагмента, раскомментируйте его и он готов. Это особенно просто под VB5, в котором есть команда Block Uncomment. Ниже приведен пример добавления члена в коллекцию.

While Not mRS.EOF
oObject.FName = mRS!FName
oObject.LName = mRS!LName
oObject.Phone = mRS!Phone
.
.
cCollection.Add oObject, oObject.FName
Wend

Если у Вашего объекта 20 или 30 свойств, быстрее будет создать шаблон:

Скопируйте его, вставьте 20 или 30 раз, вернитесь к началу и впечатайте имена свойств и полей, и уберите символ комментария. Символ комментария позволяет Вам свободно бегать по всему фрагменту, не заботясь о синтаксических ошибках.

66. ЯРЛЫК ДЛЯ ЗАГРУЗКИ ПОСЛЕДНЕГО РАБОЧЕГО ПРОЕКТА В VB

VB4 32
Level: Intermediate
Часто я старутю VB и возобновляю работу с последним проектом, но мне не хочется загромождать desktop иконками для текущих работ. В качестве решения я предлагаю мою прогу, которую нужно скомпилировать и запустить на Вашем desktopе. Эту прогу можно применить и к другим, использующим INI файлы.

Declare Function GetPrivateProfile_
String Lib «kernel32» _
Alias «GetPrivateProfileStringA» _
(ByVal lpApplicationName As _
String, ByVal lpKeyName As Any, _
ByVal lpDefault As String, _
ByVal lpReturnedString As _
String, ByVal nSize As Long, _
ByVal lpFileName As String) _
As Long

Public Sub Main()
Dim temp As String, rVal$, tmp _
As Long
rVal$ = String$(256, 0)
tmp = GetPrivateProfileString_
(«Visual Basic», _
«vb32location», «», rVal$, _
ByVal Len(rVal$) — 1, _
«c:\windows\vb.ini»)
temp = Left$(rVal$, tmp)
rVal$ = String$(256, 0)
tmp = GetPrivateProfileString_
(«Visual Basic», «RecentFile1», _
«», rVal$, ByVal Len(rVal$) _
— 1, «c:\windows\vb.ini»)
temp = temp & » «»» & Left$(rVal$, _
tmp) & «»»»
Shell temp, 1
End
End Sub

Назад к СОДЕРЖАНИЮ

67. КАК ВЫВЕСТИ СИМВОЛ «&» В LABEL

VB4 16/32, VB5
Level: Beginning

Если Вы хотите выывести символ «&» на экран, установите свойство «UseMnemonic» в False. Это свойство бывает полезно, когда, например, Labelы используются для вывода данных из баз данных. Также Вы можете вывести символ «&» в свойстве Caption, написав &&.

Назад к СОДЕРЖАНИЮ

68. СОЗДАНИЕ ВРЕМЕННЫХ ФАЙЛОВ

VB3, VB4 16/32, VB5
Level: Beginning

Я пишу прогу с базами данных, использующую много вспомогательных файлов в одно и то же время. При программировании баз данных можно создавать временные файлы для, например, вывода результата инструкции SQL или из временной базы данных, чтобы более эффективно работать с записями. Я написал функцию FileAux, возварщающую имя временного файла. Если мне надо создать несколько временных файлов одновременно, я сохраняю их имена в заранее определенных переменных:

Function FileAux(Ext As String) _
As String
Dim i As Long, X As String
If InStr(Ext, «.») = 0 Then
Ext = «.» + Ext
End If

‘ Ищем уже имеющиеся файлы на винте
i = 0
Do
X = «Aux» + Format$(i, «0000») _
+ Ext
If FileExists(X) Then
i = i + 1
Else
Exit Do
End If
Loop
FileAux = X
End Function

Эта функция обращается к функции FileExists:

Function FileExist(filename As String) _
As Boolean
FileExist = Dir$(filename) <> «»
End Function

А вот пример использования:

Sub Test()
Dim File1 As String, File2 As _
String, File3 As String
Dim DB1 As database, DB2 As DataBase
Dim FileNum As Integer
File1 = FileAux(«MDB»)
Set DB1 = CreateDataBase(File1)
File2 = FileAux(«MDB»)
Set DB2 = CreateDataBase(File2)
File3 = FileAux(«TXT»)
FileNum = FreeFile
Open File3 For OutPut As FileNum
‘ Ваш код
‘ .
Close FileNum
End Sub

File1, File2, и File3 должны быть «Aux0001.MDB,» «Aux0002.MDB,»
и «Aux0001.TXT,» соответственно.

69. МЫШИНЫЕ СОБЫТИЯ НЕ СЛУЧАЮТСЯ ЕСЛИ ENABLE УСТАНОВЛЕНО В FALSE

VB3, VB4 16/32, VB5
Level: Beginning
События MouseMove не происходят, если свойство Enabled контрола установлено в False. Мой метод лечит эту проблему и он может быть полезен, если Вы хотите вывести Tooltips или Notes на статусбаре, вне зависимости от того, enabled контрол или disabled.
Если свойство Enabled контрола установлено в False, то контрол, помещенный за данным, тем не менее быдет отзываться на движения мыши. Скопируйте код из Command1_MoseMove в Label1_MouseMove. Теперь Ваш МаусМув работает даже если Command1 недоступна.

Command1(0), Command1(1)-Command1 — массив контролов.
Label1(0), Label1(1)- массив лабелов за контролами.
SSPanel1-Работает статусбаром.

Private Sub Form_Load()
Dim i As Integer
For i = 0 To 1
Label1(i).Left = Command1(i).Left
Label1(i).Top = Command1(i).Top
Label1(i).W > Label1(i).Height = _
Command1(i).Height
Next i
Command1(0).enabled = false
Command1(0).Tag = «Button to Add»
Command1(1).Tag = «Button to Modify»
Command1(0).Caption = «&Add»
Command1(1).Caption = «&Modify»

Private Sub Label1_MouseMove(Index As _
Integer, Button As Integer, Shift _
As Integer, X As Single, Y As _
Single)
SSPanel1.Caption = Command1(Index).Tag
End Sub

Private Sub Command1_MouseMove(Index _
As Integer, Button As Integer, _
Shift As Integer, X As Single, Y _
As Single)
SSPanel1.Caption = Command!(Index).tag
End Sub

70. КАК ВЫВЕСТИ СВОЕ POPUP MENU НА TEXT BOXES

VB4 16/32, VB5
Level: Intermediate

Некоторые контролы в VB4 и VB5 как, например, TextBox имеют по дефолту контекстное меню, выползающее при правом клике на указанном контроле. Если Вы хотите, чтобы выезжало другое котекстное меню, то стандартных методов или пропертей для этого не существует. Выход состоит в отлавливании события Mouse_Down, код которого будет делать контрол недоступным. Затем высвечивайте Ваше контекстное меню, энаблите контрол обратно. Процедура PopContextMenu описывает указанный метод

Sub PopContextMenu(argoControl As _
Control, argoMenu As Control)
argoControl.Enabled = False
PopupMenu argoMenu
argoControl.Enabled = True
End Sub

Пример вызова в событии MouseDown для текстбтокса по имени Text1 и меню MyMenu:

Private Sub Text1_MouseDown(Button As _
Integer, Shift As Integer, X As _
Single, Y As Single)
If Button = vbRightButton Then
PopContextMenu Text1, MyMenu
End If
End Sub

71. ЦЕНТРИРОВАТЬ ФОРМУ С УЧЕТОМ ТАСКБАРА

VB3, VB4 16/32, VB5
Level: Intermediate
Для центрирования формы Вам надо лишь вызвать API процедуру, и завести две константы. Это решение основано на том факте, что GetSystemMetrics возвращает истинное значение параметров экрана, который может быть на самом деле занят таскбаром и Microsoft Office shortcut barом:

Public Const SM_CXFULLSCREEN = 16
Public Const SM_CYFULLSCREEN = 17

#If Win32 then
Declare Function GetSystemMetrics _
Lib «user32» _
(ByVal nIndex As Long) As Long
#Else
Declare Function GetSystemMetrics _
Lib «User» _
(ByVal nIndex As Integer) _
As Integer
#End If

Public Sub CenterForm(frm As Form)
frm.Left = Screen.TwipsPerPixelX * _
GetSystemMetrics_
(SM_CXFULLSCREEN) / 2 _
— frm.Width / 2
frm.Top = Screen.TwipsPerPixelY * _
GetSystemMetrics_
(SM_CYFULLSCREEN) / 2 _
— frm.Height / 2
End Sub

72. ОЧИСТКА СТРОКИ ОТ НЕНУЖНЫХ СИМВОЛОВ

VB3, VB4 16/32, VB5
Level: Beginning
Иногда бывает полезно иметь функцию, которая очищает строку от нежелательных символов. Эта маленькая функция принимает в качестве параметров строку для очистки и символ, от которого ее надо очистить:

Function StringCleaner(s As String, _
Search As String) As String
Dim i As Integer, res As String
res = s
Do While InStr(res, Search)
i = InStr(res, Search)
res = Left(res, i — 1) & _
Mid(res, i + 1)
Loop
StringCleaner = res
End Function

Назад к СОДЕРЖАНИЮ

73. ПРОВЕРКА ОБЪЕКТОВ ПРИ ПОМОЩИ TYPENAME

VB4 16/32, VB5
Level: Beginning

Вы можете определить класс, к которому принадлежит объект, при помощи функции TypeName вместо использования блока If TypeOf. Используйте выражение TypeOf для определения типа объекта:

If TypeOf myObject is myType then
. делаем то-то
End If

Вы можете сделать то же савмое при помощи следующего кода:

if TypeName(myObject) = «myType» Then
. делаем то-то.
End If

Выгода моего решения в том, что Вам вовсе не обязательно включать в Ваш проект все классы (или OCXs), с которыми Вы работаете. Это неплохой прием для написания общих процедур (универсальных, общего назначения) и , более того, Вы можете использовать TypeName в сложных проверках и блоках Select Case.

Назад к СОДЕРЖАНИЮ

74. ДОБАВЛЕНИЕ СТРОКИ В TEXT BOX

VB4 16/32, VB5
Level: Intermediate

Используйте данный код, чтобы заставить скроллер TextBoxа автоматически передвинуться, когда Вы добавляете новый текст:

‘ Переход к концу текста
MyTextBox.SelStart = Len(MyTextBox.Text)
‘ Новый текст будет стоять здесь
MyTextBox.SelText = NewText$

Назад к СОДЕРЖАНИЮ

75. ПРОВЕРКА АРГУМЕНТОВ В ФУНКЦИИ VAL

VB3, VB4 16/32, VB5
Level: Beginning

При использовании функции Val, VB капризничает, порождая ошибку несоответствия типов. Например, Val(«25%») правильно возвращает 25, тогда как Val(«2.5%») неправильно интерпретирует входной параметр и возвращает ошибку несоответствия типов. Это случается только тогда, когда в строке присутствует десятичная точка и символ «%» или «&». Чтобы исправить это, уберите эти символы из строки перед ее передачей в Val.

76. ЯРЛЫКИ ДЛЯ INTERNET

VB4 32, VB5
Level: Advanced

VB5 App Wizard умеет создавать Web Browser-форму, но она работает только с Microsoft Internet Explorer и Вам приходится таскать за собой SHDOCVW.DLL при распространении проги. Если Вы используете функцию ShellExecute для запуска файла Internet Shortcut, то Windows запускает дефолтный браузер и переходит на указанный URL. Этот метод работает как Microsoft так и с Netscape браузерами, если они правильно прописаны в регистре, и Вам не нужно перетаскивать никаких DLL при распространении проги.

Private Declare Function ShellExecute _
Lib «shell32.dll» Alias _
«ShellExecuteA» _
(ByVal hwnd As Long, _
ByVal lpOperation As String, _
ByVal lpFile As String, _
ByVal lpParameters As String, _
ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
Private Const SW_SHOWNORMAL = 1

‘ frm : ShellExecute использует обработчик окна.
‘ Вы можете использовать обработчик главного окна проги
‘ sUrl : это имя и путь к файлу .url (файл Internet shortcut)
‘ указывающий на Вашу страницу , напр.
‘ c:\MyWebPage.url использует Internet Explorer
‘ для создания файла ярлыка

Public Sub GoToMyWebPage(frm as Form, _
sUrl as string)
Dim lRet as Long
lRet = ShellExecute(frm.hwnd, _
«open», sUrl, vbNull, _
vbNullString, SW_SHOWNORMAL)
If lRet Назад к СОДЕРЖАНИЮ

77. ПРОСМОТР СОДЕРЖАНИЯ HELP-ФАЙЛА

VB4 32, VB5
Level: Intermediate

Многие программеры любят добавлять к свои приложениям и хелп-файлы. Как открыть содержание хелп-файла Windows из Вашей программы? Вот пример кода с использованием Win32 API функции.

‘ —- Объявление
Const HELP_CONTENTS = &H3&
‘ Функции Вывода содержимого
Declare Function WinHelp Lib «user32» _
Alias «WinHelpA» _
(ByVal hwnd As Long, _
ByVal lpHelpFile As String, _
ByVal wCommand As Long, _
ByVal dwData As Long) As Long

‘ — Код
Sub OpenHelpFile(HelpFileName As String)
‘ HelpFileName — путь к хелп-файлу.
WinHelp hwnd, HelpFileName, _
HELP_CONTENTS, 0
End Sub

Назад к СОДЕРЖАНИЮ

78. ЗАДАНИЕ ГРАНИЦ MDI ФОРМЫ ТОЧНО КАК В DESIGN-TIME

VB3, VB4 16/32, VB5
Level: Beginning

Поскольку MDI-формы ни имеют свойства border, юзер может раздвигать их границы и менять размер MDI-форм. Если юзер пытается изменить размеры формы, а я этого не хочу (пусть остается такой как была создана мной), то процедура для события MDIForm_Resize() спасет (кого — по вкусу):

Private Sub MDIForm_Resize()
‘ Запрет resizingа MDI-формы (растягивания границ и перемещения ее мышой).
‘ Годитсятолько для тех MDI форм, которые выводятся как Normal Window
If WindowState = 0 Then
‘ заданная высота MDI формы
Me.Height = 6900
‘ заданная ширина MDI формы
Me.W > ‘ заданный левый край MDI формы
Me.Left = 1020
‘ заданный правый край MDI формы
Me.Top = 1176
‘ С таким же успехом можно использовать метод Move, чтобы объединить
‘ восстановление координат формы в одной команде
End If
End Sub

79. БЫСТРЫЙ ПОИСК В БАЗЕ ДАННЫХ

VB3, VB4 16/32, VB5
Level: Beginning
В VB нет встроенной процедуры типа DLookUp из Аксесса. Вы можете использовать нижеприведенный код для получения Name объекта по его ID:

Public Function MyDLookUp(Column As _
String, TableName As String, _
Condition As String) As Variant
Dim Rec As Recordset
On Error GoTo MyDlookUp_Err

‘ gCurBase — глобальная переменая, указывающая на текущкю БД
Set Rec = gCurBase.OpenRecordset_
(«Select * From » & TableName)
Rec.FindFirst Condition
If Not Rec.NoMatch Then
‘ возвращает искомое поле, если найдено
MyDLookUp = Rec(Column)
Exit Function
End If

‘ возврат, если не найдено, или произошла другая ошибка
MyDlookUp_Err:
MyDLookUp = -1
End Function

80. ЛЕГКОЕ ОТСЛЕЖИВАНИЕ ПОЛОЖЕНИЯ ФОКУСА

VB3, VB4 16/32, VB5
Level: Intermediate

Lost_Focus and Got_Focus events Часто используются для проверки правильности ввода текста. Вы можете использовать нижеприведенный код для отслеживания фокуса на форме не программирую каждый контрол отдельно.
Прместите timer control на форму , установите Interval property = 100 и Enabled = True. Name the control tmrFocusTracking.
Timer event должен содердать следующий код:

Private Sub tmrFocusTracking_Timer()
Dim strControlName As String
Dim strActive As String
strControlName = _
Me.ActiveControl.Name

Do
strActive = Me.ActiveControl.Name
If strControlName <> strActive _
Then
Print strControlName & _
» — Lost Focus», _
strActive & » — Got Focus»
strControlName = strActive
End If
DoEvents
Loop
End Sub

To implement universal highlighting, replace the Print statement with this code:

Me.Controls(strActive).SelStart = 0
Me.Controls(strActive).SelLength = _
Len(Me.Controls(strActive))

Для проверки (validation) правильности текста вместо Print statement используйте вызов процедуры проверки.
Используйте strActive in a Select Case structure
К моменту , когда случается команда Print , strActive равен контролу, имеющему фокус, и strControlName содержит имя контрола, который потерял фокус.
Не размещайте эту процедуру где-либо кроме таймера.

81. НЕЗАКРЫВАЮЩАЯСЯ ФОРМА

VB3, VB4 16/32, VB5
Level: Beginning

Если выставить свойство ControlBox на форме в False, то кнопки Minimize и Maximize тоже исчезнут. Предположим, что Вы хотите тем не менее давать возможность юзеру использовать кнопки Minimize и Maximize, но при этом чтобы он не мог закрыть форму кнопкой с крестиком. Добавьте следующий код в событие Query_Unload:

‘ если у Вас VB3, раскомментируйте следующую строку
‘ Const vbFormControlMenu = 0
Private Sub Form_QueryUnload(Cancel As _
Integer, UnloadMode As Integer)
If UnloadMode = vbFormControl_
Menu Then
Cancel = True
End If
End Sub

Назад к СОДЕРЖАНИЮ

82. ПОМЕНЯТЬ СВОЙСТВО ЦЕЛОЙ ГРУППЕ КОНТРОЛОВ

VB3, VB4 16/32, VB5
Level: Beginning

Вы можете легко сделать видимой/невидимой целую группу контролов. В режиме разработки, выделите все контролы, с которыми Вы будете производить данную операцию при выполнении программы. Нажмите F4, и присвойте свойству Tag имя группы, например Group1. Теперь при совершении групповой операции Вам поможет следующий код:

For ind = 0 To Formname.Controls.Count _
— 1
If Formname.Controls(ind).Tag = _
«Group1» Then
Formname.Controls(ind).Visible _
= True
End If
Next

Назад к СОДЕРЖАНИЮ

83. КАК ПРОСТО ОТФОРМАТИРОВАТЬ И ОКРУГЛИТЬ ЧИСЛО

VB3, VB4 16/32, VB5
Level: Intermediate

Пример округления с заданной точностью.

n = 12.345
Format(n, «0.00\0»)
‘ возвращает «12.350»
Format(n, «0.\0\0»)
‘ возвращает «12.00»
Format(0.55, «#.0\0») ‘ возвращает «.60»

84. БУДЬТЕ ОСТОРОЖНЫ, ЗДЕСЬ ВАМ НЕ С!

VB3, VB4 16/32, VB5
Level: Intermediate

VB программеры, привыкшие к С, могут быть введены в заблуждение следующей особенностью VB. Рассмотрим код:

Dim x As Integer
Dim y As Integer
Dim z As Integer

x = 10
y = 20
z = 0

‘ пусть функция max возвращает большее из двух чисел
if (z = max(x, y)) > 0 then
Msgbox CStr(z)
Else
Msgbox «How Come?»
End if

Вы ожидаете, что высветится 20, как должно бы было произойти в С? Однако, VB сравнит z с RHS (right-hand side)-правой стороной, даже перед присвоением, независимо от скобок. Будьте внимательны.

8.5 ИСПОЛЬЗОВАТЬ BACKQUOTES ВМЕСТО АПОСТРОФОВ

VB3, VB4 16/32, VB5
Level: Intermediate
Часто при использовании Transact-SQL мне надо перехватывать комментарии юзера из текстбокса и пересылать их в базу данных. Однако, если юзер нажимает апостроф в текстбоксе, происходит ошибка времени выполнения, поскольку SQL Server использует апостроф как признак конца строки. Чтобы обойти эту проблему, перехватите ввод юзера в событии KeyPress и замените апостроф на вот такую кавычку «‘»(ASCII(145)):

Private Sub Text1_Keypress_
(KeyAscii as Integer)
If KeyAscii = 39 Then
KeyAscii = 145
End If
End Sub

Также можно заменить все одинарные кавычки на «‘» перед отсылкой в SQL Server.

86. РАСПРОСТРАНЕНИЕ НОВЫХ ВЕРСИЙ ПРОГРАММЫ ПО СЕТИ

VB4 16/32, VB5
Level: Intermediate

Я пишу VB проги для сети с примерно 300 юзерами. Довольно трудно своевременно уследить за распространением каждой новой версии проги на всех машинах, поэтому я использую такую фичу VB автоинкрементирующаяся нумерация версий для проверки, требуется ли апгрейд проги на конкретной машине. При компиляции проги установите автоинкремент версий в On. Сохраните Ваши setup/upgrade файлы на сетевом диске (настоятельно рекомендую использовать UNC-пути (\\имя_машины\имя_диска) нежели просто имена дисков), и положите INI-файл проги, в котором указан номер новейшей версии. Затем вставьте следующий код в прогу, событие Form_Load:

Open IniFile$ For Input As #1
Line Input #1, sUpgradeVersion$
Close #1

If sUpgradeVersion > (Format(App.Major, «00») & «.» & _
Format(App.Minor, «00») & «.» & _
Format(App.Revision, «0000»)) Then
‘ запуск апгрейда с сетевого диска
End
End If

Если версия в INI-файле выше, чем версия, записанная в .exe, то прога автоматом запустит программу апгрейда по сети и закончит свое выполнение, то есть все нужные файлы смогут быть заменены. Это особенно полезно, когда Вы только начинаете писать прогу, то есть апгрейды и фиксы появляются чуть ли не раз в несколько дней.

Назад к СОДЕРЖАНИЮ

87. ЗАКРЫТЬ ОКНО ПРОГРАММЫ, КАК ЭТО ДЕЛАЕТ WINDOWS 95

VB3, VB4 16/32, VB5
Level: Intermediate

Разместите этот код в declaration section модуля:

Public Sub Win95Shrivel(xForm As Form)
‘ минимизирует окно
xForm.WindowState = 1
End Sub

Вызывайте ее из процедуры Unload формы

Private Sub Form_Unload(Cancel As _
Integer)
Win95Shrivel Me
End Sub

Каждый раз при unloade формы она сначала быренько сворачивается к таскбару, а затем исчезает. Это работает и в Windows 3.1x тоже.

Лекция 1.Среды быстрого проектирования.Msvb6 иVba. Макросы. Интегрированная среда разработки ( >(С. Браун, Visual Basic 6; В. Г. Кузьменко, VBA 2000)

Microsoft Visual Basic

Язык BASIC(Beginner’sAllPurposeSymbolicInstructionCode) был модифицирован вGWBASIC(GraphicsWorkshop), который был доступен для первыхPC.

В конце 80-х годов разработан QuickBasic, который в 1992 году заменила среда визуального программированияVisual Basic for Windows.

В настоящее время разработана шестая версия графического языка Microsoft Visual BasicVB 6.VisualBasic6 предоставляет разнообразный спектр команд для создания программ и управления элементами программ вWindows.

Кроме MicrosoftVisualBasic, в настоящее время широко используются следующие среды визуального программирования, созданные на соответствующих базовых языках:

Pascal: Borland Delphi;

Макросы. Visual Basic для приложений пакета ms Office (Visual Basic for Applications)

Чтобы не повторять одни и те же рутинные операции при решении достаточно сложных задач, программисты стали, параллельно с выполнением операций, записыватьпоследовательность их выполненияи формировать, таким образом,макрокомандыилимакросы.

Макрокоманды записываются с помощью специальных программ (макрорекордеров).

Для создания макросов развиваются и улучшаются соответствующие макроязыки, используемые в приложенияхWindows, в частности, вWordиExcel.

Но эти макроязыки имеют значительные отличия для каждого из офисных приложений в виду специфичностиприложений.

Чтобы избежать необходимости изучения нового языка для каждого из продуктов Windows фирма Microsoft стала включать элементы наиболее распространенного универсального языка Visual Basicв качестве макроязыка своих программ.

В конце концов, была создана версия языка VisualBasic, названнаяVisual Basic for Applications (VBA), которая реализуется во всех приложенияхMicrosoftOffice2000 и 2003.

Visual Basic for Applicationsв основном является тем же, что иVisualBasicforWindowsи соответственноVisual Basic 6с некоторыми небольшими от-личиями.

Макропрограммы VBAсохраняются в файловом формате, используемом приложением, в котором записан макросVBA(host-приложением), а не вотдельных текстовыхфайлах, как это делается вVB6.

Например, макропрограммы VBA, созданные:

в Word сохраняются в шаблоне Normal;

в Excel, сохраняются в файле рабочей книги;

в Access – в файле данных Access.

Таким образом, для выполнения макропрограммы VBAсначала нужнозапустить host-приложение(Word,Excel,Access,PowerPointи т. п.), а затем уже запустить макрос VBA.

Однако невозможно, например, запустить макрос Excel VBAиз любого другого приложенияWindows, кромеExcel.

Несмотря на то, что основные возможностиVisualBasic остаются теми же и вVBA-приложениях, каждое приложение имеет и, соответственно, добавляет вVBA-программыспецифичные только для негокоманды и объекты.

Недостатком VBA-программ (или макросов) является то, что они лишены гибкости и не могут реагировать на изменяющиеся условия. Например, при записи повторяющихся действий необходимо многократно вручную запускать одну и ту же последовательность операций, т. е. невозможна автоматизация циклической обработки данных. Другой пример – невозможно осуществлять операции автоматического подбора параметров, например, автоматического подбора ширины столбцов в таблице по содержимому с помощью макрорекордера.

Поэтому для создания гибких, оптимально решающих разнообразные задачи программ в инструментах пакета MS Office включены дополнительно к макрорекордерам редакторы Visual Basic, инструменты которых аналогичны инструментам редактора MS Visual Basic 6.

Таким образом, для создания программ в любых Windows-приложениях следует изучить возможности программирования на универсальном языке MS Visual Basic 6.

Илон Маск рекомендует:  Что такое код localhandle

При этом программирование на Visual Basic for Applications (VBA), т. е. на языке, используемом в офисных программах Word, Excel, Access, PowerPoint, эффективно потому, что в нём используется макрорекордер, который в Visual Basic 6 отсутствует.

Альтернативная IDE для VB6 и VBA

Я был испорчен Visual studio 2008 и Eclipse и должен выполнить небольшую работу по поддержке приложения VB6.

Кто-нибудь знает альтернативную/обновленную IDE для VB6?

Переписать не вариант. Я просто исправляю пару ошибок, и это большая база кода.

Я никогда не слышал об альтернативной IDE для Vb6. Однако эти две (бесплатные) надстройки VB6 незаменимы и облегчат вашу жизнь, особенно если есть много кода. Они одинаково эффективны для VBA в Microsoft Office.

MZ-Tools: предоставляет превосходную коллекцию инструментов IDE — поиск неиспользуемых переменных, неиспользуемые методы, отличный «поиск всех», фрагменты кода. Написанный Карлосом Дж. Кинтеро, которому я теперь обязан часами и часами.

И SmartIndenter, который выполняет все автоматические отступы. Он делает одно, и все хорошо.

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

Alternative > Ask Question

Want to improve this question? Update the question so it’s on-topic for Stack Overflow.

Closed 4 years ago .

I’ve been spoiled by Visual studio 2008 and Eclipse and have to do a little maintainence work on a VB6 app.

Does anyone know of an alternative/ updated IDE for VB6?

A rewrite is not an option I’m just fixing a couple of bugs and it’s a big codebase.

8 Answers 8

I have never heard of an alternative IDE for Vb6. However, these two (free) VB6 add-ins are indispensable and will make your life easier — especially if there is a lot of code. They are equally effective for VBA in Microsoft Office.

MZ-Tools: provides a superb collection of IDE tools — finding unused variables, unused methods, a great «search all», code snippets. Written by Carlos J. Quintero, to whom I now owe hours and hours of time.

And SmartIndenter, which takes care of all the auto-indenting. It does one thing and it does it well.

Some time ago I did some research and nothing came up. I don’t believe you have have any real alternatives.

Как сохранить и восстановить все настройки vb6 ide?

2 quamrana [2010-01-13 14:20:00]

Я видел этот совет на DevX, который должен «учитывать большинство настроек среды Visual Basic».

Кто-нибудь, достаточно ли этого или есть ли дополнительные настройки там?

2 ответа

3 Решение jac [2010-01-13 17:50:00]

Он выглядит довольно полным, однако, если у вас есть пользовательские надстройки, это не получит их. Я быстро просмотрел свои надстройки, и я не вижу никакого общего способа их резервного копирования, поскольку у них есть свои собственные ключи реестра. HKEY_CURRENT_USER\Software\Microsoft\Visual Basic\6.0 имеет подкаталог Addins, поэтому, если у вас есть пользовательские надстройки, вы должны хотя бы получить сообщение, которое невозможно найти. В противном случае используйте Process Monitor и обратите внимание на ключи реестра и файлы, которые читаются при запуске Visual Basic.

Они хранятся в этих двух разделах реестра:

HKEY_CURRENT_USER\Software\Microsoft\VBA\Microsoft Visual Basic HKEY_CURRENT_USER\Программное обеспечение \Microsoft\Visual Basic\6.0

Пишем свою IDE со встроенным дизайнером интерфейсов на PHP и ExtJS

Как написать свою IDE со встроенным дизайнером интерфейсов, как сделать это быстро и с минимальными усилиями? Именно такой вопрос возник однажды в проекте, использующем связку ExtJS и PHP. Горящие сроки, растущая очередь задач. Список заданий ежедневно пополняется огромным количеством форм ввода, таблиц и отчетов, все это необходимо обрабатывать, фильтровать и отображать для пользователя.

Проект использовал ORM, что недвусмысленно намекало на возможность автоматической генерации схожих интерфейсов, но, имея много сходств, каждая форма и отчет были уникальными, что требовало возможности быстрого и легкого конфигурирования.

Беглый поиск выдал Ext Designer (Sencha Architect) — интересный и полезный инструмент (Ext MVC еще не существовало). Ext Designer так и не помог решить поставленные задачи, но обо всем поподробнее.

В то же время был замечен проект PHP-Ext — интересная обертка для ExtJS, написанная на PHP. Ее можно было бы использовать для генерации этого нескончаемого потока интерфейсов, но хотелось большего: cмеси Ext Designer и PHP-обертки над ExtJS, чтобы это еще можно было научить “подглядывать” в базу данных и на основе таблиц строить формы. А еще лучше на основе структуры объектов ORM, ведь там есть все названия полей их типы и валидаторы.

Поиск подобного инструмента не увенчался успехом.

1 Обертка

Под эту задачу придется писать собственную обертку для ExtJS, адаптированную под нужды задумки. Поскольку объем библиотеки достаточной большой, сэкономим время отделив наборы свойств компонент библиотеки от описания их поведения. Не все объекты ExtJs будут зеркально отражены в коде PHP. Опишем классы ограниченного количества объектов таких, как Grid, Store, Window и т.п. Все остальные объекты могут физически не существовать в коде, а создаваться на основе набора свойств описанных в иерархии.

Таким образом, за пару дней была воссоздана иерархия свойств компонент ExtJS, в то время еще версии 3 (несколько десятков классов). Далее можно было по мере необходимости описывать поведение нужных компонент, основные генерировали на уровне json-конфига.

Получаем иерархию следующего вида (кусок диаграммы, времена Zend_Framework 1):

Ext_Object и его наследники отвечают за поведение компонента;
Ext_Config отвечает за хранение, валидацию и сериализацию свойств;
Ext_Property и его наследники отвечают за описание характеристик конкретного компонента ExtJS (классы с публичными свойствами, в какой-то мере повторяющие иерархию библиотеки ExtJs).
Ext_Virtual — класс. Объекты этого класса создаются фабрикой в том случае, если нет прямого наследника Ext_Object, описывающего поведение компонента. Создается на основе описания свойств Ext_Property_xxx. Отличается тем, что принимает имя класса для эмуляции, используя имя представляется компонентам библиотеки.

Ext_Object реализует метод __toString, возвращающий ExtJS код компонента. При необходимости этот метод можно переопределить в наследниках. Если объекты вложены друг в друга, в момент приведения к строке корневого объекта вся цепочка с легкостью самораспакуется (превратится в строку Js-кода).

Как показала практика это решение позволило избежать головной боли.

2 Файл проекта

Интерфейс на ExtJS состоит из компонент, выстроенных в цепочку и расположенных в Layout.

Необходимо как-то хранить настройки связей компонент проекта. В качестве конфигурационного файла можно использовать XML или какой-то другой похожий формат.
В таком случае каждый раз при загрузке проекта придется анализировать конфигурацию и инициализировать объекты, что может занять продолжительное время. Нужен простой, быстрый и легкий формат.
Что если объявить класс Designer_Project, который бы представлял сам проект и имел простенький API по добавлению элементов, а сами элементы хранил в древовидной структуре (внутри лежал бы объект работающий с древовидной структурой).
На тот момент был уже написан класс Tree, который достаточно шустро работал с древовидными структурами, без труда справлялся с иерархией до 25 000 — 30 000 вложенных элементов менее чем за секунду.

Объект такого проекта можно сериализовать и сохранить на диск. Более того, от сериализованной строки можно взять хэш и пересобрать код интерфейса только при наличии изменений. Повторная инициализация интерфейса могла бы использовать файловый кэш, не прогружая проект для валидации.

Основная проблема Ext Designer на то время представлялась в том, что при каждом изменении кода нужно пересобрать приложение и публиковать скрипты.

Структура Designer_Project (файл проекта):
— системное описание контейнеров (какие классы можно перемещать, какие могут содержать вложенные элементы и т.д);
— настройки текущего проекта (название, неймспейсы, подключенные файлы и прочее);
— API (набор методов для работы с проектом);
— Tree (дерево элементов, структура проекта).

Примечательно, что классы компонент могут расширяться, а список свойств — увеличиваться. Все это в большинстве случаев не вызывает проблем совместимости со старым форматом.

Так появился файл проекта. Попутно написано несколько вспомогательных классов, например адаптер Designer_Storage (вдруг мы передумаем хранить проекты в файлах). Проведено несколько тестов на производительность, результаты были оптимистичными, задумка работала шустро. Важно отметить, что дерево проекта знает лишь о структуре вложенности элементов, но сами объекты фактически не находятся друг в друге. Designer/Project.php

3 Сборщик кода

Поскольку класс Designer_Project представляет собой контейнер с простым API и совершенно не знает, что делать со своим содержимым, потребуется вспомогательный механизм, который умеет правильно располагать код элементов в нужной последовательности — это класс Designer_Project_Code. Пожалуй самый сложный компонент по количеству различных условий и ветвлений. Получая на вход объект проекта должен вернуть JS-код для интерфейса. Рекурсивно проходя дерево проекта получает код компонент и располагает элементы в нужной последовательности. Важно отметить, что непосредственно код компонента выдает обертка для ExtJS, сам сборщик занимается расположением этого кода в нужной последовательности. Он должен определить, какие компоненты должны быть объявлены первыми, получить их код и вставить ссылки в зависимые компоненты.

Код получился достаточно сложный и запутанный, много раз рефакторился, с появлением новых возможностей становился еще более запутанным.

Со временем он приобрел терпимый вид и структуру. Designer/Project/Code.php

Для объектов JS, являющихся расширениями базовых компонент ExtJS, был использован трюк для упрощения расположения вложенных элементов. Было создано свойство childObjects, представляющее собой список всех вложенных элементов, таким образом к ним очень легко обращаться и линковать в items.

Принцип работы Designer_Project_Code в рекурсивном обходе структуры проекта, поиске связанных компонент и правильном расположении кода конечных элементов относительно друг друга.

Пол дела сделано. Создан упрощенный аналог обертки PHP-EXT, умеющий складываться в проект и работающий намного шустрее. Функционал ограничен, но никто не мешает его развивать.

4 Дизайнер

Пришло время для самого интересного — создания дизайнера интерфейсов. Концептуально он должен представлять собой:
— панель с тулбаром, в котором бы располагался список компонент, которые можно разместить в проекте (кнопки, формы, окна, панели);
— основную форму, которая бы отображала результаты рендеринга проекта;
— иерархию компонент (использован TreePanel);
— редактор свойств (Property Grid).

На текущий момент дизайнер имеет следующий вид (сильно отличается от первого):

1. панель настроек проекта (загрузка, сохранение, переключение режима дизайнер/редактор кода и прочее);
2. тулбар со списком компонент, которые можно добавить в проект;
3. панель, отображающая структуру проекта, поддерживает Drag & Drop перемещение элементов, при выборе элемента для него подгружается индивидуальная панель настройки свойств;
4. панель настройки свойств компонента (содержит дополнительные панели редактирования событий и методов).
5. центральная панель (отображает результат рендеринга проекта, на этом скриншоте — редактор локализаций). При загрузке проекта сервер сохраняет копию его объекта в сессию, все манипуляции производит с ней. Таким образом, если упал интерфейс можно перезагрузить окно, изменения не будут потеряны. Кнопка “Сохранить” сбрасывает проект на диск.

После внесения изменений интерфейс отправляет запрос на сервер, нужный контроллер принимает запрос, вносит изменения в объект Designer_Project. После успешного применения изменений дизайнер запрашивает перестроение JS.

Основная панель дизайнера, которая отвечает за расположение элементов в проекте представляет собой дерево с поддержкой drag & drop:

Дерево запрашивает список элементов у сервера, тот, в свою очередь, извлекает структуру из проекта при помощи API. Во время перетаскивания элемента отправляется запрос на сервер с инструкцией, какой компонент перемещаем. API Designer_Project содержит метод перемещения элементов по дереву. При клике по узлу дерева (выборе нужного объекта) инициируется событие itemSelected, отображается панель свойств этого компонента.

Взаимодействие компонент редактора происходит на уровне событий, отдельные части и компоненты за частую не имеют представления о том, что находится снаружи. У каждого элемента определен набор генерируемых событий, на которые обычно подписывается родительский компонент.

В качестве редактора свойств использован расширенный компонент Property Grid, дополненный методами общения с сервером (запрашивает список полей, отправляет изменение свойств, инициирует события).

В нашем случае этот компонент назывался designer.properties.Panel

Одной панелью свойств не обойтись, в некоторых случаях требуется возможность дополнительной настройки свойств, представляющих собой редакторы и окна. При необходимости расширения списка настроек для этого типа объектов назначается индивидуальный редактор, отнаследованный от designer.properties.Panel.

Первоначальными возможностями дизайнера не получилось решить все задачи, поэтому к проекту был привязан файл “actionJs” (файл с кодом JavaScript, используется для того, что нельзя сделать стандартными средствами, подключается после JS-проекта).

В качестве редактора кода используется codemirror.net.

Первые версии дизайнера могли просто и быстро построить интерфейс, все остальное ложилось на плечи разработчика. В более поздних версиях в дизайнере появились события, возможность расширения объектов, добавления методов и др.

Как отобразить результат? Можно рендерить проекты прямо в DOM открытой страницы, это очень быстро, лаги перестроения практически незаметны, после перекидывания элемента по дереву проходят доли секунды, прежде чем интерфейс перестроится. У этого решения есть одна серьезная проблема, если что-то идет не так в разрабатываемом проекте (неверно задано свойство или еще что), ошибки JS вызовут обрушение всего дизайнера. Разрабатываемый интерфейс лучше перенести в iframe это хоть и замедлит отклик, но обрушение кода проекта не приведет к глобальному краху. Сам iframe можно положить в центральную панель, при необходимости запрашивать обновление содержания.

Бы ло бы красиво, если элементы можно было бы кидать на форму и двигать/перемещать прямо внутри разрабатываемого проекта, как во всех “взрослых” дизайнерах, но по простому этот вопрос не решить. От этой затеи пришлось на время отказаться, сроки поджимали.
Позже появился механизм взаимодействия основного интерфейса дизайнера и самого создаваемого проекта. Можно двигать, растягивать колонки таблиц, менять размеры окон, все это сохраняется. Принцип работы достаточно прост — в разрабатываемый интерфейс во время режима разработки добавляются обработчики событий, которые формируют команду для дизайнера и помогают взаимодействовать с контроллерами дизайнера, внешний интерфейс дизайнера ожидает команды и при ее появлении реагирует. Например, при перемещении колонок таблицы отправляется запрос к serverside API и оповещается основной интерфейс дизайнера.

5 Плюшки в виде готовых компонент, автоматизации рутинных задач

5.1 Неочевидные особенности наследования в ExtJs для начинающих.

Прежде чем коснуться темы доработки компонент, хотелось бы обратить внимание на неочевидные для новичка особенности наследования.

Эти особенности важно помнить, т.к. это спасет вам много нервов. Это не единственный подводный камень, будьте внимательны.

5.2 Редакторы

Переопределим редакторы базовых свойств, например, редактор store заменяем с текстового поля на выпадающий список всех созданных в проекте хранилищ (запрашиваются у сервера, отдаются Designer_Project API), так же и с другими подобными свойствами (layout, align и многими др.).

5.3 Формирование url для Ajax-запросов за два клика

Url в системе динамические, например, адрес панели может измениться, контроллер переключиться. Для этого были придуманы токены, заменяющие реальный путь, обрабатываемые на этапе сборки кода.

Для упрощения назначения url-адресов (ajax-запросы, proxy url) написан компонент, который анализирует файловую и кодовую структуру. Reflection позволяет получать и анализировать список доступных действий для контроллеров, теперь их не нужно писать руками, просто ткнуть мышкой.

Принцип работы: сканируется файловая система, выбирается нужный класс, запрашивается список методов, комментарий к методу используется в качестве описания для интерфейса. Нужный url автоматически прописывается в свойстве в виде шаблона.

Подобный подход можно использовать и для назначения иконок.

5.4 Импорт структуры из базы данных, автоматическое создание форм

Как еще облегчить жизнь программисту? Конечно же импортом полей в формы, хранилища, таблицы исходя из структуры БД или ORM.

Выбираем таблицу / объект, из которого мы хотим импортировать поля. Исходя из его структуры и типов данных система автоматически подставляет нам нужные значения в ячейки и заполняет иерархию форм.

Например, для int подставляется Ext.form.field.Number, для varchar — Ext.form.field.Text и т.д.
Попутно добавляется fieldLabel, если это поле формы или формат даты, если это поле хранилища и др. свойства.

Теперь нудная процедура описания элементов занимает пару кликов.

5.5 Подключение внешних файлов и проектов

Почему бы не дать возможность подключать в проект внешние JS-файлы и другие проекты. Мы можем создать проект, в котором опишем специфический компонент — редактор, позже подключим его там, где он нужен. Главное — разделить пространства имен проектов так, чтобы генератор кода располагал каждый проект в своем namespace, это не представляет особой сложности.

Все что потребовалось — добавить в Designer_Project api поддержку добавления списка файлов и проектов, назначение неймспейсов. Designer_Project_Code за пару часов был обучен раскладывать код внутрь неймспейсов и рекурсивно рендерить проекты.

Постепенно дизайнер начал пополняться готовыми компонентами такими, как окна редактирования, фильтры, поля для ссылок на объекты, списков объектов и многое другое.

5.6 Локализация интерфейсов

Долгое время оставалась не решенной задача локализации интерфейса. Не было ясно, как подступиться к ее решению. Весь проект строился на простых решениях, не хотелось городить огород, да и времени на это особо не было. В один момент оно нашлось.
Сама платформа использовала файлы локализации, которые перегенерировались при изменении в интерфейсе управления локализациями. В итоге на странице существовал некий JS-объект вида:

Идея проста — разрешить разработчику вводить в качестве значений строковых свойств Js-код, для этого был выдуман токен “[js:]” (во время генерации кода свойства с таким токеном оформлялись как js-код).

С учетом того, что интерфейс управления локализациями был уже готов, работать с ним было одно удовольствие. Реализация решения заняла от силы 20 минут. Теперь можно локализовать проект не изменяя содержимое файла.

5.7 Редакторы событий и методов

Следующим прорывом стало добавление возможности расширения объектов, теперь можно добавлять методы и события. Реализация событий очень похожа на реализацию свойств. Похожим образом были реализованы и методы. В этот момент в системе появилось разделение на стандартные события, описанные в обертке Ext, и события, созданные пользователем (методы могли быть созданы только пользователем для “расширенных” (атрибут isExtended) объектов).

Дизайнер начал генерировать волне понятный, читаемый код.

После этого появляется очевидная проблема: события, методы и реакции разбросаны по элементам, сложно найти где их редактировать. Добавим в дизайнер отдельные вкладки со списками событий и методов, сгруппированные по объектам. Запрашиваем у Designer_Project список объектов, отображаем в виде Grid с группировкой.

6 Бэкенд

C точки зрения бэкенда все достаточно просто, можно использовать любой фреймворк. Нужен набор контроллеров и действий для манипуляций с проектом. Запускаем приложение, загружаем проект дизайнера, описываем список методов, которые обращаются к API Designer_Project и выполняют различные манипуляции с проектом. Из особенностей — понадобится контроллер, который может вывести собранный проект в интерфейс и подключить нужные JS-файлы.

В нашем случае в дополнение был создан action для сборки и минификации исходного кода самого дизайнера, это позволило ускорить загрузку редактора.

7 Генератор проектов

Генератор представляет собой шаблон с набором действий над файлом проекта.

В упрощенном виде:

Имея подобную структуру проекта написать генератор проектов на основе ORM не составило труда. За день было создано несколько шаблонов генерации стандартных интерфейсов, теперь на создание типового интерфейса уходило пара кликов, остальное время тратилось на нестандартное оформление и доработку.

На реализацию первой версии дизайнера ушло 3 недели отпуска — довольно короткий срок для такой глобальной цели.

Полученный профит:

— стандартные интерфейсы генерировались одним кликом, далее дорабатывались в дизайнере;
— значительно уменьшилось число ошибок в JS-коде;
— молодые разработчики легче вникали в ExtJS и разработку сложного проекта;
— дорабатывать интерфейс стало намного проще и интереснее, элементы передвигались одним движением мыши, без боязни забыть захватить кусок кода и упустить связанность с другим элементом;
— возросла скорость разработки продукта и прототипов;
— такие вещи, как поменять название кнопки или колонки, перестали вызывать батхерт во время поиска куска кода с инициализацией нужного элемента;
— получен интересный опыт в разработке собственной среды разработки “на коленке”.
— разработка на PHP приобрела совершенно новую удобную форму;
— удалось узнать много тонкостей ExtJS, c которыми не приходилось сталкиваться до этого момента.

Зачем это было все нужно?

За годы работы с ExtJS надоело писать одно и то же. Инициализировать компоненты, настраивать их, боясь пропустить запятую или что-то слинковать. Это задача, как оказалось, достаточно легко автоматизируется, в освободившееся время можно заняться более интересными вещами.

Настройка ide vb

33527 просмотра

6 ответа

417 Репутация автора

Одно раздражающее поведение редактора VB6 IDE, особенно при переключении на него с более поздних инструментов, таких как VS.NET, заключается в том, что он не распознает колесико мыши! Может быть, VB6 появился, когда у большинства мышей его не было, но есть ли способ исправить его, чтобы он распознал колесо мыши?

Ответы (6)

36 плюса

148498 Репутация автора

У Microsoft есть расширение, которое может обеспечить запрашиваемое поведение. Вы должны скачать его по ссылке ниже и зарегистрировать его с помощью предоставленных шагов, таких как использование regsvr32

Обновление: вот шаги

Загрузите файл VB6 Mouse Wheel.exe, содержащий библиотеку надстройки и код, используемый для создания библиотеки надстроек.

Извлеките файлы в место, к которому у вас есть доступ.

Откройте командную строку, запустите от имени администратора.

Перейдите в папку, в которую вы распаковали файлы.

введите regsvr32 VB6IDEMouseWheelAddin.dll и нажмите кнопку ОК. Начните

  • Visual Basic 6.0. Нажмите Надстройки, а затем щелкните Диспетчер надстроек.
  • В списке диспетчера надстроек щелкните MouseWheel Fix.
  • Нажмите, чтобы установить флажок Loaded / Unloaded, а затем нажмите, чтобы установить флажок Load on Startup.
  • Нажмите ОК.
  • Автор: Daniel A. White Размещён: 24.06.2009 05:06

    3 плюса

    11754 Репутация автора

    Чтобы установить VB6 IDE Mousewheel Addin:

    1. Скопируйте VB6IDEMouseWheelAddin.dll в локальный каталог System32 и зарегистрируйтесь.
    2. Откройте VB IDE.
    3. Перейдите в «Менеджер надстроек».
    4. Выберите «Исправление MouseWheel» в доступных надстройках.
    5. Проверьте «загружен / выгружен» и «загрузить при запуске».
    6. Нажмите кнопку «ОК».

    Теперь вы сможете использовать колесико мыши в окне кода.

    9 плюса

    791 Репутация автора

    Самым простым способом, который работал для меня, было просто загрузить и запустить двоичный файл с http://www.joebott.com/vb6scrollwheel.htm

    Использование:

    Просто запустите exe, и у ваших редакторов VB будет свиток.

    Информация от автора:

    Это небольшая программа, которая заставит ваше колесо мыши работать в различных старых программах, в основном в окне кода Visual Basic 6. Я заметил, что многие люди приходят на этот сайт из Google в поисках помощи с колесиком мыши. Итак, я решил это исправить.

    Многие программы можно поддерживать, настроив свой INI-файл. Включенный INI-файл включает в себя поддержку:

    • Кодовое окно VB6
    • Окно VB6 Resource Design
    • SourceSafe 6 Diff Viewer
    • Windiff VBA Editor

    4 плюса

    41 Репутация автора

    **** Простой способ для начинающих: ****

    1. Загрузка Загрузить файл VB6 Mouse Wheel.exe по ссылке: http://download.microsoft.com/download/e/f/b/efb39198-7c59-4ace-a5c4-8f0f88e00d34/vb6mousewheel.exe
    2. Запустите .exe, нажмите распаковать (у нас есть VB6IDEMouseWheelAddin.dll)
    3. Копирование VB6IDEMouseWheelAddin.dll в System32 (x32bit) или SysWOW64 (x64bit)

    Запустите Cmd от имени администратора 5.1 с x32bit:

    C: \ WINDOWS \ system32> regsvr32 VB6IDEMouseWheelAddin.dll (в Cdm)

      Откройте VB >Размещён: 18.01.2020 03:02

    плюса

    3172 Репутация автора

    Я столкнулся с другим методом ( который обсуждался на VBForums , за который выступали Диллетанте и Элрой).

    . используйте утилиту X-Mouse, чтобы исправить колесо прокрутки. . это единственный, который я когда-либо нашел, который правильно прокручивает, когда ваш код отображается как разделенное окно.

    Так как у меня были проблемы с надстройкой Microsoft, отмеченной в некоторых других ответах, я попробовал это, и она работает хорошо. Удобно также позволяет вам установить некоторые параметры для настройки поведения и скорости прокрутки.

    плюса

    3172 Репутация автора

    Ссылка для скачивания: Wheeler

    Wheeler — бесплатная программа, которая улучшает поведение вашего колеса мыши .

    Wheeler — настраиваемая программа. Вот некоторые основные моменты:

    Помимо прокрутки окна под курсором при вращении колесика мыши, можно переместить фокус клавиатуры в это окно . Благодаря концепции подвижности вы можете управлять обработкой сообщений колесика для каждого класса окна. Классы окон с областями видимости позволяют вам связывать имена классов окон с конкретными программами, которые их определяют, поэтому вам не нужно беспокоиться о влиянии на другие программы, которые могут невольно использовать те же имена классов окон. . Вы можете исключить целые программы из лечения Уилера.

    SATA Configuration

    Другие идентичные по значению опции: Onboard IDE Operate Mode, ATA/IDE Configuration.

    Среди опций BIOS, предназначенных для настройки параметров жестких дисков, можно порой встретить функцию SATA Configuration. Она предназначена для настройки параметров работы контроллера SATA/IDE в различных операционных системах. Обычными вариантами опции являются варианты Enhanced (Расширенный режим), Compatible (Совместимый режим) и Disabled (Выключено). Иногда вместо вариантов Enhanced и Compatible можно встретить варианты Normal (Нормальный) и Legacy (Совместимость с устаревшими операционными системами), однако по назначению они идентичны соответственно вариантам Enhanced и Compatible.

    Принцип работы

    SATA – это новая технология интерфейса внутренних накопителей персонального компьютера, пришедшая на смену технологии интерфейса ATA (Advanced Technology Attachment), часто также называемого интерфейсом IDE (Integrated Drive Electronics). Большинство материнских плат современных компьютеров оснащено именно интерфейсом SATA. Аббревиатура SATA образована добавлением к аббревиатуре ATA буквы S, которая обозначает Serial, то есть, «последовательный». Таким образом, SATA – это последовательный вариант интерфейса ATA.

    Из этого следует, что интерфейс SATA не отказывается от всех преимуществ интерфейса ATA, а лишь является его усовершенствованием. В частности, интерфейс SATA позволил значительно увеличить скорость передачи данных между материнской платой и жестким диском (до 6 Гб/c в версии SATA 3.0). Во многом это было достигнуто за счет преобразования интерфейса из параллельного в последовательный. Параллельный кабель IDE имеет 16 линий данных, не считая служебных линий данных, и всего в кабеле насчитывается 40 проводников (80 в кабеле для устройств, поддерживающих UDMA-66). В отличие от кабеля IDE, кабель SATA имеет всего две линии данных. Тем не менее, именно это обстоятельство, из-за низкой помехоустойчивости сигналов в кабеле IDE, накладывает ограничение на максимальную длину этого кабеля (которая может составлять не более полуметра), а также на скорость передачи данных по кабелю. Также существенным нововведением интерфейса SATA стала возможность «горячего» (без выключения компьютера) подключения устройств (при помощи технологии AHCI (Advanced Host Controller Interface)).

    Кроме того, что немаловажно, интерфейс SATA позволяет разместить на материнской плате больше разъемов для подключения жестких дисков или других накопителей. Большинство материнских плат, поддерживающих лишь интерфейс IDE, могло иметь всего лишь по два разъема IDE. К каждому из этих разъемов мог подключаться один кабель, а к каждому кабелю – не более двух жестких дисков (или прочих накопителей) IDE. Данные диски обозначаются как Master (Основной) и Slave (Ведомый). Однако в отличие от IDE интерфейс SATA поддерживает не больше одного устройства на разъем, что позволяет избежать потенциальных проблем, связанных с негативным взаимодействием между устройствами, расположенными на одном кабеле.

    Это ограничение на максимальное число накопителей, существовавшее во времена господства IDE, нашло отражение и в операционных системах того времени. Старые ОС линейки Windows, до Windows Millenium включительно, могли использовать не более 4 устройств IDE, расположенных на двух разъемах. С появлением интерфейса SATA стало возможным размещать на материнской плате большее число разъемов, и, как следствие, пользователь получил возможность установить большее количество жестких дисков. Но старые операционные системы линейки Windows не способны видеть эти диски.

    Опция SATA Configuration предназначена, прежде всего, для исправления данного недостатка старых ОС. Если пользователь выберет значение опции Compatible, то это позволит старым операционным системам видеть диски, установленные на разъемах SATA. В противном случае, если установить вариант Enhanced, в этих ОС возможна ошибка в определении количества жестких дисков.

    Кроме того, в опции есть вариант Disabled, который позволяет вообще отключить контроллер IDE/SATA.

    Какое значение выбрать?

    Ответ на этот вопрос зависит от того, какая операционная система установлена у вас на компьютере. Если это операционная система Windows Me, Windows 95/98 и более старая, то необходимо установить значение Compatible (Legacy). В противном случае ОС не сможет определить диски SATA или определит их неправильно.

    Если же у вас установлена современная операционная система линейки Windows, такая, как Windows 2000, Windows XP, Windows Vista, Windows 7 или Windows 8, то рекомендуется установить значение Enhanced (Native). В этом случае данные операционные системы смогут работать с любым количеством дисков SATA. В то же время включение значения Compatible (Legacy) приведет к тому, что в современных ОС будут видны только 2 канала IDE, и, как следствие, максимальное количество доступных дисков будет равно 4. Однако может случиться такая ситуация, когда у пользователя на одном компьютере, имеющим несколько дисков SATA, установлена ОС типа Windows 95/Windows Millenium и современная ОС Windows. В таком случае лучше всего установить значение Compatible, чтобы диски SATA были бы доступны в обеих операционных системах.

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL