[Домой][Мой город][Интересное][Анекдоты][Халява][Веб мастеру][MP3][Справки][Visual Basic][Ссылки][ЧАТ][Гостевая][Конференция]
VB Хитрости


 
  • Как избавится от Null при получении оного из базы данных 

  • text1 = rs!Phone & "" 
    Так, и не нужно лишних проверок, если телефон не введен
  • Как получить значения поля "автономер" поcле апдейта записи

  • при использовании ADO
    Просто - после rs.Update в ADO указатель текущей записи 
    остается на обновленной записи.
    Достаточно просто получить ее значение: rs!UserId
  • Как синхронизировать скролинг в двух листбоксах

  • Вы будете смеяться, достаточно воспользоваться свойствами TopIndex ,
    синхронизируя их при изменении.
  • Наиболее простой способ открыть файл, связанный с каким либо 

  • приложением Windows (например *doc - вордом)
    Под Windos NT:
    Shell "cmd /X /C start c:\mydoc\example.doc"
    Под Windos 9x:
    Shell "start c:\mydoc\example.doc"
    Поиск в DBCombo по первым введенным буквам.
    Постепенно вводя буквы находишь нужную запись.
     Private Sub DBCombo1_KeyUp(KeyCode As Integer, Shift As Integer) 

        Dim n% 

        Select Case KeyCode 

        Case Is >= 48 

             DBCombo1.SelStart = Len(DBCombo1.Text) - DBCombo1.SelLength + 1

             n = DBCombo1.SelStart 

             Data1.Recordset.FindFirst "[Название поля] LIKE '" & DBCombo1.Text & "*'" 

             If Data1.Recordset.NoMatch = False Then 

                  DBCombo1.Text = Data1.Recordset.Fields("Название поля").Value 

             End If 

             DBCombo1.SelStart = n 

             DBCombo1.SelLength = Len(DBCombo1.Text) - n 

          End Select

     End Sub 



  • Очень часто спрашивают - как поместить форму поверх других форм

  • - отвечаю Очень Просто:
    'Поместите в модуль

    Public Declare Function SetWindowPos Lib "user32" _ 

       (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _

        ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _

        ByVal cy As Long, ByVal wFlags As Long) As Long

    Public Const HWND_NOTOPMOST = -2

    Public Const HWND_TOPMOST = -1

    Public Const SWP_NOACTIVATE = &H10

    Public Const SWP_NOMOVE = &H2

    Public Const SWP_NOSIZE = &H1



    Public Sub SetFormPosition(frmHandl As Long, TopPosition As Boolean) 

          If TopPosition Then 

               SetWindowPos frmHandl, HWND_TOPMOST, 0, 0, 0, 0, _ 

                            SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE 

           Else 

               SetWindowPos frmHandl, HWND_NOTOPMOST, 0, 0, 0, 0, _

                            SWP_NOSIZE Or SWP_NOMOVE 

           End If 

    End Sub
 

    'Поместите на форму в любой процедуре

     call SetFormPosition(Me.hwnd, True) 



  • Как ловить нажатия на клавиши вне вашей программы
        1. Положите на форму таймер, поставьте интервал в 50



        2. Добавьте в модуль:





   Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer

   

   Public Const VK_TAB = &H9 ' Константа для TAB key.   

                             ' константы для других кнопок посмотрите в API вьювере

   ' Поместите в событие Timer:   

   If GetAsyncKeyState(VK_TAB) And KEY_SHIFT = True Then

        msgboх "Кто то трогает ТАБ", vbinformation

   End If
  • Как перезагрузить Windows

  •  
    Разместите в модуле:
    
       Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
    
         ByVal dwReserved As Long) As Long
    
    
    
       Public Const EWX_LOGOFF = 0
    
       Public Const EWX_SHUTDOWN = 1
    
       Public Const EWX_REBOOT = 2
    
       Public Const EWX_FORCE = 4
    
    А это в коде:
    
       Dim s As Long
    
    
    
       'Так можно сделать Shut down
    
        s = ExitWindowsEx(EWX_SHUTDOWN, 0&)
    
    
    
       'Так можно сделать Log off
       s = ExitWindowsEx(EWX_LOGOFF, 0&)
    
    
    
       'А так Reboot 
       s = ExitWindowsEx(EWX_REBOOT, 0&
  • Работаю с Аксессовской базой (*.mdb) 

  • Сортировка по русским словам работает неверно. Что делать?

    Необходимо выставить Sort Order для поддержки Кирилицы

    При создании - dbcreate(cNewName, dbLang Cyrillic, rnVersion) 

    При упаковке - dbEngine.CompactDatabase sOldName, sNewName, dbLangcyrillic ..

    Sergey Sysoev

     
  • А вот как таскать форму не за заголовок, а за любое место? 

  •  

     

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

    Const WM_NCLBUTTONDOWN = &HA1
    
    Const HTCAPTION = 2
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    
     (ByVal hWnd As Long, ByVal wMsg As Long, _
    
      ByVal wParam As Long, lParam As Any) As Long
    
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    
    
    
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
        Call ReleaseCapture
    
        Call SendMessage(Me.hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    
    End Sub
    
    
  • Как выбрать n - ый элемент не перебирая все n-1 
  • Мало кто использует встроенную функциб Бэйсика
    
    Choose. А зря. 
    Все очень просто 
    
    Choose(5, "A", "B", "C", "D", "F")
    
    Вернет вам F , очень удобно для работы с днями недели,
    
    месяцами, или просто для выбора 
  • Выбор элемента листбокса в момент прохода над ним мышки. 
  • На пустую форму положите листбокс и текстбокс. Ну и этот код, конечно
    
    
    Option Explicit
    
    
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    
    (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam _
    
    As Long, lParam As Any) As Long
    
    Private Const LB_ITEMFROMPOINT = &H1A9
    
    
    
    Private Sub Form_Load()
    
    With List1
    
        .AddItem "Hello World"
    
        .AddItem "Hello Again"
    
        .AddItem "Just Example "
    
    End With
    
    End Sub
    
    
    
    Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    
    
    
    Dim xPosition As Long
    
    Dim yPosition As Long
    
    Dim i As Long
    
    If Button = 0 Then ' если никакие кнопки не нажаты
    
        xPosition = CLng(X / Screen.TwipsPerPixelX)
    
        yPosition = CLng(Y / Screen.TwipsPerPixelY)
    
        With List1
    
            ' взять выбранный элемент из листа
    
            i = SendMessage(.hwnd, _
    
            LB_ITEMFROMPOINT, 0, ByVal _
    
            ((yPosition * 65536) + xPosition))
    
            'подсветить подсказку к элементу
    
            If (i >= 0) And _
    
            (i <= .ListCount) Then
    
                .ToolTipText = .List(i)
    
                Text1.Text = .List(i)
    
            Else
    
                .ToolTipText = ""
    
            End If
    
        End With
    
    End If
    
    End Sub
    
    
    
    
  • Замена системных цветов на свои собственные. 
  • На пустую форму положите этот код
    
    
    Option Explicit
    
    Private Declare Function SetSysColors Lib "user32" _
    
    (ByVal nChanges As Long, lpSysColor As _
    
    Long, lpColorValues As Long) As Long
    
    
    
    Private Declare Function GetSysColor& Lib "user32" (ByVal nIndex As Long)
    
    
    
    
    
    'Можно использовать следующие константы
    
    
    
    Private Const COLOR_SCROLLBAR = 0 'The Scrollbar colour
    
    Private Const COLOR_BACKGROUND = 1 'Colour of the background with no wallpaper
    
    Private Const COLOR_ACTIVECAPTION = 2 'Caption of Active Window
    
    Private Const COLOR_INACTIVECAPTION = 3 'Caption of Inactive window
    
    Private Const COLOR_MENU = 4 'Menu
    
    Private Const COLOR_WINDOW = 5 'Windows background
    
    Private Const COLOR_WINDOWFRAME = 6 'Window frame
    
    Private Const COLOR_MENUTEXT = 7 'Window Text
    
    Private Const COLOR_WINDOWTEXT = 8 '3D dark shadow (Win95)
    
    Private Const COLOR_CAPTIONTEXT = 9 'Text in window caption
    
    Private Const COLOR_ACTIVEBORDER = 10 'Border of active window
    
    Private Const COLOR_INACTIVEBORDER = 11 'Border of inactive window
    
    Private Const COLOR_APPWORKSPACE = 12 'Background of MDI desktop
    
    Private Const COLOR_HIGHLIGHT = 13 'Selected item background
    
    Private Const COLOR_HIGHLIGHTTEXT = 14 'Selected menu item
    
    Private Const COLOR_BTNFACE = 15 'Button
    
    Private Const COLOR_BTNSHADOW = 16 '3D shading of button
    
    Private Const COLOR_GRAYTEXT = 17 'Grey text, of zero if dithering is used.
    
    Private Const COLOR_BTNTEXT = 18 'Button text
    
    Private Const COLOR_INACTIVECAPTIONTEXT = 19 'Text of inactive window
    
    Private Const COLOR_BTNHIGHLIGHT = 20 '3D highlight of button
    
    
    
    Dim OldColor As Long
    
    
    
    Private Sub Form_Load()
    
        'Эапоминаем текущий цвет
    
        OldColor = GetSysColor(COLOR_ACTIVECAPTION)
    
        
    
        SetSysColors 1, COLOR_ACTIVECAPTION, RGB(255, 0, 0)
    
    End Sub
    
    
    
    Private Sub Form_Unload(Cancel As Integer)
    
        'Восстанавливаем текущий цвет
    
        SetSysColors 1, COLOR_ACTIVECAPTION, OldColor
    
    End Sub
    
    
Приложения Microsoft Office по разному хранят созданные пользователем вручную или с помощью VBA панели инструментов - Word - в шаблонах (dot) или в документах (doc), Excel - где-то в общей настройке, независящей от XLS-фалов, Power Point - еще как-то (разобраться со всем этим можно самостоятельно, ничего сложного нет; подробности исключены так как "хитрость" не совсем об этом).
Независимо от приложения и того, как оно хранит пользовательские панели, в VBA-программах нельзя выполнять следующие действия (попытка приводит к ошибке приложения) :
- Удалить панель, которая в этот момент не существует
- Создать новую панель, причем ее имя совпадает с именем уже существующей панели 
(очень распространенная ошибка начинающих VBA-программистов - перед началом работы приложения создается панель - но ведь она уже есть, та же самая; в Excel, например, она была создана при самом первом запуске приложения, да так и болтается, если не была удалена вручную через диалоговое окно "Вид - Панели - инструментов - Настройка")
- Любым образом обратиться к элементам или свойствам несуществующей панели.

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

Public Function CommandBarIsReady(CommandBarName As String)

        Dim CommandBarIsReady As Boolean

        CommandBarIsReady = False

        

        Dim Cycle As Byte

        Cycle = 1

        

        For Each Cycle In CommandBars

          'цикл по элементам коллекции

         If Cycle.Name = CommandBarName Then

          CommandBarIsReady = True

                  Exit For

           'панель с указанным именем обнаружена, 

           '  цикл не нужен

         End If

        Next

End Function



А вот пример ее использования - в данном случае до описания панели проверяем - может быть она уже есть, тогда делаем ее видимой, если нет, описываем панель (наиболее актуален такой подход для Excel) 
Public Sub ИнициализацияПанели()

        If CommandBarIsReady("Моя панель") = True Then

         Application.CommandBars("Моя панель").Visible = True

         'такая панель есть, делаем ее видимой так как считаем, _

           что это именно нужная нам панель

        Else

          ' если панели нет, то описываем ее и затем ее элементы

         With Application.CommandBars.Add("Моя панель", Temporary:=True)

          .Visible = True

          .Position = msoBarFloating

          With .Controls

           With .Add(msoControlButton)

            .Caption = "Первая кнопка"

            .Style = msoButtonCaption

            .TooltipText = "Описание первой кнопки"

            .OnAction = "Процедура1"

           End With

           With .Add(msoControlButton)

            .Caption = "Вторая кнопка"

            .Style = msoButtonCaption

            .TooltipText = "Описание второй кнопки"

            .OnAction = "Процедура2"

           End With

          End With

         End With

        End If

End Sub





 


Если у вас есть хитрости, которыми хочется поделиться с товарищами по ремеслу - пишите, они обязательно будут опубликованы.


На главную страницу

Hosted by uCoz