11 сентября 2001 года - В раздел Примеры добавлен пример создания Floating Bar - плавающей формы.
Добавлен раздел Архив рассылки
Количество подписчиков рассылки перевалило за 2000!
10 сентября 2001 г. Представляю
немного новых примеров: работа с системным треем, как поместить иконку в меню,
работа с ImageComboBox, как изменить стандартный TitleBar, а также как изменить
иконку в нем с помощью API во время работы программы.
Исправлена ошибка и снижено количество переменных.
Public Function UpFolder(Folder As String) as String
Dim nn As Long
UpFolder = Folder
If Right$(UpFolder, 1) = "\" Then
UpFolder = Mid$(UpFolder, 1, Len(UpFolder) - 1)
End If
For nn = Len(UpFolder) To 1 Step -1
If Mid(UpFolder, nn, 1) = "\" Then
UpFolder = Left(UpFolder, nn)
Exit For
End If
Next nn
End Function
Недавно прочитал в рассылке о TextBox.Enable=False
Я предлагаю Вам другой способ сделать TextBox недоступным пользователю,
а в Вашем варианте есть один недостаток - Если в TextBox
вставлена полоса пркрутки то она становится недоступной
хотя текст отображается нормально.
По средствам ниже приведенного кода можно реализовать то же самое:
Privatr Sub Text1_GotFocus()
Command1.SetFocus
EndSub
При поподании тектового поля в фокус, фокус автоматически
передается кнопке для данного случая или другому эллементу
и в результате TextBox становится недоступным пользователю,
а все элементы отображаются нормально.
Сабклассинг - техника, позволяющая приложению перехватывать и
обрабатывать сообщения (messages), посылаемые или поставляемые
в очередь (posted) определенному окну перед тем, как само окно
будет иметь возможность их обработать.
В windows практически все, что мы видим - окна (формы, контролы
и т.д.). Каждое окно имеет свою "оконную процедуру" (window proc).
В обязанности оконной процедуры входит обработка "сообщений",
пришедших этому окну.
Передача сообщений - это способ, которым windows производит
манипуляции со всеми окнами. Hапример, когда юзер пытается
закрыть окно, система посылает этому окну сообщение
WM_CLOSE и оконная процедура должна должным образом
обработать это сообщение.
У каждого созданного в системе окна зарегистрированного класса
("editbox", "button" и т.д.) есть "оконная процедура по
умолчанию" (default window proc), которая и отвечает за обработку
сообщений, приходящих этому окну. Если мы напишем свою оконную
процедуру для какого-то окна и заменим ей процедуру по умолчанию,
то значит мы произвели subclass этого окна. Это и есть сабклассинг.
Сабклассинг производится вызовом следующих api функций:
GetWindowLong - для выяснения адреса default window proc (в принципе
не обязательна)
SetWindowLong - для указания адреса новой window proc (эта функция
возвращает указатель на предыдущую функцию окна)
CallWindowProc - для последующего вызова default window proc, если
надо (см. также DefWindowProc).
Сама оконная процедура должна иметь определенный вид:
Function WindowProc(ByVal hWnd As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As _
Long
где: hWnd - хендл (указатель) окна uMsg - сообщение wParam - дополнительная информация сообщения (значение
зависит от конкретного типа сообщения) lParam - дополнительная информация сообщения (значение
зависит от конкретного типа сообщения)
Ну и пример.
В модуль:
Private Declare Function CallWindowProc Lib "user32" Alias _
"CallWindowProcA" (ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias _
"SetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private lpPrevWndProc As Long ' тут будет указатель на default proc
Public Sub start_subclass(hwnd As Long)
'указываем новую оконную процедуру
'SetWindowLong при этом возвращает указатель
'на процедуру по умолчанию для указанного окна
'Этим самым мы и начинаем субклассинг
lpPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, _
AddressOf WindowProc)
End Sub
Public Sub stop_subclass(hwnd As Long)
'возвращаем окну его "родную" процедуру
SetWindowLong hwnd, GWL_WNDPROC, lpPrevWndProc
End Sub
Function WindowProc(ByVal hw As Long, ByVal uMsg As _
Long, ByVal wParam As Long, ByVal lParam As Long) As _
Long
'"обрабатываем" сообщение WM_MOVE
Select Case uMsg
Case WM_MOVE
Debug.Print "WM_MOVE"
End Select
'поскольку мы не написали "полноценной" оконной
'процедуры, вызовем "родную" для обработки всех
'сообщений. Этого можно и не делать, но тогда надо
'обрабатывать все сообщения и возвращать
'соответствующие значения.
WindowProc = CallWindowProc(lpPrevWndProc, hw, _
uMsg, wParam, lParam)
End Function
Теперь в форму:
Private Sub Form_Load()
start_subclass Me.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
stop_subclass Me.hwnd
End Sub
Ну и напоследок - несколько предостережений:
Пользоваться этим надо очень аккуратно.
Не забывать возращать на место дефолтную функцию.
Не задерживать обработку сообщений (они могут валится сотнями в
секунду), что чревато переполнением стека.
Public Declare Function fCreateShellLink Lib "STKIT432.DLL" _
(ByVal lpstrFolderName As String, _
ByVal lpstrLinkName As String, _
ByVal lpstrLinkPath As String, _
ByVal lpstrLinkArgs As String) As Long
Есть БД Access. Ия таблицы Tabl необходимо вытащить внешним модулем на VB5
проиявольную яапись с некоторым номером, для дальнейшей обработки.
Помогите, кто янает.
Как можно определить номер страницы в Верде (проблема яаключается в том, что иногда
нумерация начинается с нуля, например, а номер страницы в верхний/нижний колонтитул не вставлен
- обращаться некуда)?
Можно ли в ACCESS2000 сделать так, чтобы раяличные яаписи (строки)в форме
отображались раяным цветом,например,для выделения красным просроченных платежей.
Пробовала помечать bmp-ияображением, но это так долго_груяится. Записей много.
Как из-под Basic for MS Excel выдать через динамик звук определенной частоты
и длительности ( например, нота ЛЯ: 440 Гц, 1 секунда ) ?
А как это сделать через колонки ( наушники ) ?
Нужно вывести картинку запиханную в массив pic(width,height) as byte на экран,
используя палитру Pal(255,2). Причем с максимальной скоростью. Пробовал
преобразовывать в RGB картинку и выводить с помощью SetDIBitsToDevice,
но получается медленно. Преобразования тормозят вывод. Может кто
поможет?
Внедряю .xls в Access (использую OLE). Сразу открывается этот файл. Каким образом
заставить минимизироваться приложение Excel и как мне закрыть файл .xls или Excel. Перепробовала
все команды из help'а, но они игнорируются. Помогите!!!
Ответы:
Вопрос:
Как прочитать в реестре, все параметры данного раздела, с помощью API ?
Ответ:
На сайте VB Студия в разделе Статьи есть статьи о работе с реестром. Там про это написано.
Вопрос:
Создал OCX, в который входит ComboBox. Список ComboBox-а заполняется из текстового
файла (кодировка ANSI). Компонент предназначен для работы в системе визуализации WinCC (вряд ли
это что-то кому-то скажет, но чего в жизни не бывает...). Под NT всё работает корректно. Под
Windows_98 при вместо кирилицы отображаются иероглифы (буквы латинского алфавита с надбуквенными
символами). При работе с кодировкой OEM наблюдалась аналогичная картина. Вставлял компонент в
Internet Explorer - всё нормально отЗаранее спасибо всем принявшим участе в решении проблемы.
Однозначно, "глючит" шрифт, используемый в ComboBox, я бы попробовал
сделать свойство Font у этого OCX, и попытался его изменить, конкретнее
нужно поменять свойство CharSet у этого шрифта на 1251, короче говоря
поэксперементировать. Может случиться, что у используемого шрифта нет набора
1251, тогда выход один - использовать другой шрифт.
Вопрос:
Когда пользователь нажимает кнопку дверцы CD-ROM, нужно перехватить команду,
выполнить заданные операции и только тогда открыть дверцу. Кто подскажет, как это сделать?
Думаю, что это невозможно не только в VB, но и вообще, иначе бы
Windows использовали такую возможность. Начните копировать файл с CD-Rom и
откройте дверцу? Что? Подвисли?
Вопрос:
Я написал ActiveX DLL на VB 6 в одной из функций есть вызов внешнего exe файла (простая программа не выводит никаких
формб просто принимает пути к 2 файлам и пишет на диск третий)
Так вот, пока я работал в Debug моде все нормально, а в откомпилированном виде внешняя программа не отрабатывает,
ошибок не появляется, программа запускается, но видимо что-то не находит....
я пользуюсь функцией Shell("путь_к_программе")
Не могли бы вы пояснить в чем может быть проблема
Советую поставить Service Pack 4, а вообще-то может быть используется
On Error Resume Next? Уберите.
Вопрос:
Несколько раз спрашивал в ФИДО, но из ответов так и не понял, можно ли
в форме VB сделать выделение меток перед полями ввода пунктирными
линиями как в большинстве программ Windows (по клавише TAB). Можно ли
это сделать в VB?
Только эмуляция, с помощью Shape или (для продвинутых) используя API
функцию DrawFocusRect.
Вопрос:
Можно ли создать программу в VB такого рода:
переводчик промт переводит word(овский) файл с русского на французский например,и копирует его
обратно в word.
Как только путь до файла изображения получен - загоняем его в
image.picture и даем юзверю убедиться в том, что именно это но и
хотел. А сами тем временем убеждаемся что этот фай именно рисунок и
все необходимое для его просмотра у нас имеется (нет ошибки - все оБ).
Теперь нам осталось сохранить рисунок из image.PictureData в базу
данных. И дело в шляпе!!!
Есть только одно НО: PictureData имеет тип variant/byte(size), а это
значит, что брать рисунок из базы и пихать его в PictureData следует
ПРЯМО ИЗ Recordset'а!!! а не из запроса. Дело в том, что запрос
преобразует наш variant/byte в простой String со всеми вытекающими...
Вопрос:
Как написать код преобразования числа в текст типа: 23 456,23 руб. преобразуется в
"Двадцать три тысячи четыреста пятьдесят шесть рублей, 23 коп.
Ответ:
Я выложил на сайт код, который прислал мне Алексей Лукин. Посмотрите его.
Вопрос:
Как сделать панель как в MS Office или вроде виндоусной панели
задач(той что с ПУСКом), чтобы за неё не прятались значки с рабочего стола,
а отодвигались(как если переместить панель задач к другому краю).