Visual Basic: новости сайтов, советы, примеры кодов.
Выпуск 83.


VBNet VBMania
Голосование:

Ваш голос отсылается по E-mail владельцу сайта, после чего голоса анализируются и на отдельной странице выводятся результаты.

Нет тем.

Рассылки Subscribe.Ru
Мир программирования на Visual BASIC 5.0 и HTML.
Новости сайта IgorykSoft и советы по программированию
Visual Basic.NET Уроки.

Доска почёта:

Sergey Y. Tkachev
Кононенко Роман
Kirill

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoft
  • Господа!!! читайте MSDN!!!

    Несколько слов от автора:

       Новый выпуск!
    Читайте!


    Содержание выпуска




    Книги

    Переход на VB .NET. Стратегии, концепции, код (цена ~ 158 руб.)

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

    Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.


    Программирование на VB.NET. Учебный курс (цена ~ 119 руб.)

    Эта книга является вводным курсом по изучению языка программирования Visual Basic .NET. Даны основные принципы объектно-ориентированного программирования в контексте языка VB .NET, поскольку без хорошей подготовки в этой области невозможно в полной мере пользоваться всеми преимуществами VB .NET.
    Изложены азы всех аспектов языка, которыми должен владеть любой профессиональный разработчик VB .NET

    Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.


    VB.NET для разработчиков (цена ~ 125 руб.)

    Основная задача книги - быстро ознакомить разработчиков Visual Basic с изменениями в .NET Framework. Программисты, использующие Java, C++, Delphi или другие инструменты разработки приложений и интересующиеся Visual Basic или технологией .NET Framework, также найдут эту книгу полезной. Хотя книга посвящена Visual Basic.NET, ее основная цель - продемонстрировать взаимодействие Visual Basic и ...

    Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.




    Остальные книги о VB можно найти
    здесь.

    наверх


    Как сэмулировать нажатия определенных клавиш

    Для имитации нажатия на клавишу мыши служит API-функция mouse_event

    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

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

    Пример использования функции: неоходимо переместить курсор из текущей точки нахождения курсора в точку с координатами (851,143) и в этой точке имитировать нажатие левой клавиши мыши

    Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Type POINTAPI
    x As Long
    y As Long
    End Type
    Dim z As POINTAPI
    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Const MOUSEEVENTF_ABSOLUTE = &H8000
    Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP = &H4
    Const MOUSEEVENTF_MIDDLEDOWN = &H20
    Const MOUSEEVENTF_MIDDLEUP = &H40
    Const MOUSEEVENTF_MOVE = &H1
    Const MOUSEEVENTF_RIGHTDOWN = &H8
    Const MOUSEEVENTF_RIGHTUP = &H10
    Private Sub Form_Load()
    GetCursorPos z 'получить текущее значение местоположения курсора
    zx = (851 - z.x) / 2 'необходимо разделить полученное значение на 2.  С чем это связано, я не знаю.
    А вы?
    zy = (143 - z.y) / 2
    mouse_event MOUSEEVENTF_MOVE, zx, zy, 0&, 0& 'перемещение курсора
    mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0& 'нажатие на левую клавишу мыши
    mouse_event MOUSEEVENTF_LEFTUP, 0&, 0&, 0&, 0& 'отпускание левой клавиши мыши
    End Sub

    'Примеры использования

    Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
    Const MOUSEEVENTF_ABSOLUTE = &H8000
    Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP = &H4
    Const MOUSEEVENTF_MIDDLEDOWN = &H20
    Const MOUSEEVENTF_MIDDLEUP = &H40
    Const MOUSEEVENTF_MOVE = &H1
    Const MOUSEEVENTF_RIGHTDOWN = &H8
    Const MOUSEEVENTF_RIGHTUP = &H10

    'Имитация клика:
    mouse_event MOUSEEVENTF_LEFTDOWN, lpPoint.x, lpPoint.y, 0&, 0&
    mouse_event MOUSEEVENTF_LEFTUP, lpPoint.x, lpPoint.y, 0&, 0&

    наверх


    Подсчет нажатий на кнопки мыши

    Данный пример покажет, как можно установить глобальный хук на мышь, и ваша программа будет считать количество нажатий на клавиши мыши и на колесо прокрутки. Также ваша программа будет реагировать на нажатие любой клавиши клавиатуры.

    Также данный пример в окне DEBUG располагает информацию о местоположении курсора.

    Добавьте модуль в вашу программу и также расположите на форме 5 элементов TextBox.

    'КОД ФОРМЫ

    Private Sub Form_Load()
    Text1 = "0"
    Text2 = "0"
    Text3 = "0"
    Text4 = "0"
    Text5 = "0"
    hHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf HookProc, 0, 0)
    End Sub

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call UnhookWindowsHookEx(hHook)
    End Sub

    'КОД МОДУЛЯ


    Option Explicit
    Public Type POINTAPI
    x As Long
    y As Long
    End Type
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)

    Private Const WM_MOUSEMOVE = &H200
    Private Const WM_LBUTTONDOWN = &H201
    Private Const WM_LBUTTONUP = &H202
    Private Const WM_LBUTTONDBLCLK = &H203
    Private Const WM_RBUTTONDOWN = &H204
    Private Const WM_RBUTTONUP = &H205
    Private Const WM_RBUTTONDBLCLK = &H206
    Private Const WM_MBUTTONDOWN = &H207
    Private Const WM_MBUTTONUP = &H208
    Private Const WM_MBUTTONDBLCLK = &H209
    Private Const WM_MOUSEWHEEL = &H20A
    Private Const WM_KEYDOWN = &H100
    Private Const WM_KEYUP = &H101

    Public Const WH_JOURNALRECORD = 0

    Type CBTACTIVATESTRUCT
    fMouse As Long
    hWndActive As Long
    End Type
    Dim CBT As CBTACTIVATESTRUCT
    Public hHook As Long

    Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    CopyMemory CBT, ByVal lParam, Len(CBT)

    Select Case CBT.fMouse
    Case WM_MOUSEMOVE
    Dim CurPos As POINTAPI
    GetCursorPos CurPos
    Debug.Print "Move at pos ", CurPos.x, CurPos.y

    Case WM_KEYDOWN
    Form1.Text5 = Form1.Text5 + 1
    Case WM_KEYUP
    Debug.Print "KeyUp"

    Case WM_MOUSEWHEEL
    Form1.Text4 = Form1.Text4 + 1

    Case WM_LBUTTONDOWN
    Form1.Text1 = Form1.Text1 + 1

    Case WM_LBUTTONUP
    Debug.Print "LeftUp"

    Case WM_RBUTTONDOWN
    Form1.Text3 = Form1.Text3 + 1

    Case WM_RBUTTONUP
    Debug.Print "RightUp"

    Case WM_MBUTTONDOWN
    Form1.Text2 = Form1.Text2 + 1

    Case WM_MBUTTONUP
    Debug.Print "MiddleUp"
    End Select
    HookProc = CallNextHookEx(hHook, nCode, wParam, lParam)
    End Function

    наверх


    Тип клавиатуры

    Данный пример определит тип клавиатуры

    Private Declare Function GetKeyboardType Lib "user32" (ByVal nTypeFlag As Long) As Long
    Private Sub Form_Load()
    Dim t As String
    Dim k As Long
    k = GetKeyboardType(0)
    If k = 1 Then t = "PC or compatible 83-key keyboard"
    If k = 2 Then t = "Olivetti 102-key keyboard"
    If k = 3 Then t = "AT or compatible 84-key keyboard"
    If k = 4 Then t = "Enhanced(IBM) 101-102-key keyboard"
    If k = 5 Then t = "Nokia 1050 keyboard"
    If k = 6 Then t = "Nokia 9140 keyboard"
    If k = 7 Then t = "Japanese keyboard"
    MsgBox "Type of keyboard : " & t
    End Sub

    наверх


    Переключение раскладки клавиатуры (Ru-En)

    Расположите на форме элемент CommandButton.

    Private Declare Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As Long, ByVal flags As Long) As Long
    Private Sub Command1_Click()
    ActivateKeyboardLayout 0, 0
    End Sub

    наверх


    Какая раскладка клавиатуры включена в данный момент

    Private Declare Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long

    Private Sub Form_Load()
    Dim KeybLayoutName As String
    KeybLayoutName = String(9, 0)
    GetKeyboardLayoutName KeybLayoutName
    'Номер 409 - английская, 419 - русская
    MsgBox "Текущая раскладка номер " & CStr(CLng(Left$(KeybLayoutName, _
    InStr(1, KeybLayoutName, Chr(0)) - 1)))
    End Sub

    наверх


    Состояние функциональных клавиш

    Данный пример покажет вам состояние функциональных клавши: Ctrl Shift Alt CapsLock ScrollLock NumLock Insert Key

    Option Explicit

    Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Private Declare Function GetKeyboardState Lib "user32" (pbKeyState As Byte) As Long
    Private Declare Function SetKeyboardState Lib "user32" (lppbKeyState As Byte) As Long

    ' Возвращает True если клавиша Ctrl нажата
    Function CtrlKey() As Boolean
    CtrlKey = (GetAsyncKeyState(vbKeyControl) And &H8000)
    End Function

    ' Возвращает True если клавиша Shift нажата
    Function ShiftKey() As Boolean
    ShiftKey = (GetAsyncKeyState(vbKeyShift) And &H8000)
    End Function

    ' Возвращает True если клавиша Alt нажата
    Function AltKey() As Boolean
    AltKey = (GetAsyncKeyState(vbKeyMenu) And &H8000)
    End Function

    ' Возвращает True если нажаты запрашиваемые клавиши
    'MsgBox KeysPressed(vbKeyRButton) - нажата ли правая клавиша мыши?
    Function KeysPressed(ByVal KeyCode1 As KeyCodeConstants, Optional ByVal KeyCode2 As KeyCodeConstants, Optional ByVal KeyCode3 As KeyCodeConstants) As Boolean
    If GetAsyncKeyState(KeyCode1) >= 0 Then Exit Function
    If KeyCode2 = 0 Then KeysPressed = True: Exit Function
    If GetAsyncKeyState(KeyCode2) >= 0 Then Exit Function
    If KeyCode3 = 0 Then KeysPressed = True: Exit Function
    If GetAsyncKeyState(KeyCode3) >= 0 Then Exit Function
    KeysPressed = True
    End Function

    ' узнать состояние CapsLock.
    'MsgBox GetCapsLock. Если True - то включена, если False - выключена
    Function GetCapsLock() As Boolean
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    GetCapsLock = (keystat(vbKeyCapital) And 1)
    End Function

    ' Изменение состояния CapsLock:
    ' SetCapsLock True - включено
    ' SetCapsLock False - выключено
    Sub SetCapsLock(ByVal newValue As Boolean)
    ' get current state of all 256 virtual keys
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    ' modify bit 0 of the relevant item, and store back
    keystat(vbKeyCapital) = (keystat(vbKeyCapital) And &HFE) Or (newValue And 1)
    SetKeyboardState keystat(0)
    End Sub

    ' узнать состояние ScrollLock.
    'MsgBox GetScrollLock. Если True - то включена, если False - выключена
    Function GetScrollLock() As Boolean
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    GetScrollLock = (keystat(vbKeyScrollLock) And 1)
    End Function

    ' Изменение состояния ScrollLock.
    ' SetScrollLock True - включено
    ' SetScrollLock False - выключено
    Sub SetScrollLock(ByVal newValue As Boolean)
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    keystat(vbKeyScrollLock) = (keystat(vbKeyScrollLock) And &HFE) Or (newValue And 1)
    SetKeyboardState keystat(0)
    End Sub

    ' узнать состояние NumLock.
    'MsgBox GetNumLock. Если True - то включена, если False - выключена
    Function GetNumLock() As Boolean
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    GetNumLock = (keystat(vbKeyNumlock) And 1)
    End Function

    ' Изменение состояния NumLock
    ' SetNumLock True - включено
    ' SetNumLock False - выключено
    Sub SetNumLock(ByVal newValue As Boolean)
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    keystat(vbKeyNumlock) = (keystat(vbKeyNumlock) And &HFE) Or (newValue And 1)
    SetKeyboardState keystat(0)
    End Sub

    ' узнать состояние Insert Key.
    'MsgBox GetInsertKey. Если True - то включена, если False - выключена
    Function GetInsertKey() As Boolean
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    GetInsertKey = (keystat(vbKeyInsert) And 1)
    End Function

    ' Изменение состояния Insert Key
    ' SetInsertKey True - включено
    ' SetInsertKey False - выключено
    Sub SetInsertKey(ByVal newValue As Boolean)
    Dim keystat(0 To 255) As Byte
    GetKeyboardState keystat(0)
    keystat(vbKeyInsert) = (keystat(vbKeyInsert) And &HFE) Or (newValue And 1)
    SetKeyboardState keystat(0)
    End Sub

    наверх


    Мои программы

    BalloonMessage for MS Agent

       BalloonMessage for Microsoft Agent реализует диалог программы с пользователем, используя при этом технологию Microsoft Agent. OCX реализует три типа диалоговых окон: InputBox, MsgBox и MsgLabels.

    Автор: Шатрыкин Иван. Соавтор: Павел Сурменок.

    наверх


    Вопрос/Ответ

    Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы.

    Вопросы:


    Автор вопроса:
    Pasha

    Ответ ожидается по этому адресу

       Как изменить порядок отображения полей в DbGrid. DbGrid связан с Data, Data связан через ODBC или Jet с таблицей FoxPro


    Автор вопроса: ]CBK[CRaSH

    Ответ ожидается по этому адресу

       Люди как организавать прослушку компов в сети(как в quake or CS) когда жмеш REFRESH он проверяет не все IP а только, те которые находятся в сети. И как сделать с winsock.ocx чтобы к серверу могли подконектится несколько человек


    Автор вопроса: Rafis

    Ответ ожидается по этому адресу

       Как с помощью ВБ текст ия ЮНИКОДа перевести в обычный, например на русский.


    Автор вопроса: Pavel I.Forkin

    Ответ ожидается по этому адресу

       При создании текстового редактора с использованием RichTextBox необходимо сделать 4 кнопки.
    1. По левому краю
    2. По центру
    3. По правому краю
    4. По ширине
    Первые три я делаю без проблем.
    Не подскажите как сделать четвертую.


    Автор вопроса: Евгений

    Ответ ожидается по этому адресу

       Как можно управлять Active Directory в Win2K программным пут?м, т.е.: соядать польяователя, удалить польяователя, сменить ему пароль, ияменить данные и настройки также, как в Active Directory.


    Автор вопроса: Винокуров К

    Ответ ожидается по этому адресу

       Как соядатьпрограмму-терминалку (BBS)?


    Автор вопроса: Михаил

    Ответ ожидается по этому адресу

       Как с помощьб inet1 соедениться с ftp серевером и яадать login и password. Если есть другие варианты для ftp?




    Ответы:


    Вопрос:

       

    Ответ:

    Автор ответа: Nechaev Sergey

    Как можно программно установить фоновый рисунок на папку в Проводнике. Если вручную, то это Вид=>Настроить вид папки...=>Выбрать фоновый рисунок. При этом в папке создается файл Desktop.ini в котором есть ссылка на файл фона. Если просто взять этот файл, положить его в другую папку и исправить путь к файлу изображения, ничего не происходит.
    Где я ошибся? Что и куда надо записать чтобы работало? Может это можно сделать через API?


    Вопрос:

       Как можно управлять Active Directory в Win2K программным пут?м, т.е.: соядать польяователя, удалить польяователя, сменить ему пароль, ияменить данные и настройки также, как в Active Directory.

    Ответ:

    Автор ответа: Евгений

    Как можно управлять Active Directory в Win2K программным пут?м, т.е.: соядать польяователя, удалить польяователя, сменить ему пароль, ияменить данные и настройки также, как в Active Directory.


    Вопрос:

       Помню был выпуск с примером кода для выключения/переяагруяки компа. Если у кого этот код остался, то вышлите ПЛЫЗ на мыло.

    Ответ:

    Автор ответа: Елизаров Пётр

    Как перезагрузить 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
         'Так можно сделать Выключить
        s = ExitWindowsEx(EWX_SHUTDOWN, 0&)
         'Так можно сделать Перезагрузить
        s = ExitWindowsEx(EWX_LOGOFF, 0&)
         'А так Войти от др. пользователя
        s = ExitWindowsEx(EWX_REBOOT, 0&)


    Вопрос:

       Помню был выпуск с примером кода для выключения/переяагруяки компа. Если у кого этот код остался, то вышлите ПЛЫЗ на мыло.

    Ответ:

    Автор ответа: Анастасия Кулакова

    В модуле:

         Public Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, _
           ByVal dwReserved As Long) As Long

         Public Const EWX_SHUTDOWN = 1
         Public Const EWX_REBOOT = 2
         Public Const EWX_FORCE = 4

    Код формы

         Dim s As Long

          s = ExitWindowsEx(EWX_SHUTDOWN, 0&)

         'Перезагрузка
         s = ExitWindowsEx(EWX_REBOOT, 0&


    Вопрос:

       Помню был выпуск с примером кода для выключения/переяагруяки компа. Если у кого этот код остался, то вышлите ПЛЫЗ на мыло.

    Ответ:

    Автор ответа: Савельев Роман

    Примеры кода для выключения/перезагрузки компа.
      
    P.S. Всё опробировано на VB6 и Win98. На VB.Net ущё не перешёл, извиняйте :-)
      
    1. Даёт всем открытым приложениям команду на завершение работы и перезагружает Windows.
      
    Option Explicit
      
    Private Declare Function ExitWindowsEx _
    Lib "user32" ( _
         ByVal uFlags As Long, _
         ByVal dwReserved As Long _
    ) As Long
      
    Private Sub cmdReboot_Click()
         ExitWindowsEx &H43, 0
    End Sub

    2. Вызывает системное окно "Завершение работы Windows"

    Option Explicit
      
    'Для VB6 (Win98) нужно добавить ссылку на библиотеку.
    'Project->References->
    ' Microsoft Shell controls And Automation
    ' Location c:\windows\system\shdoc401.dll
    '
    'Для VB.Net - эксперименируйте сами ;-)
    Dim shl As New Shell32.Shell
      
    Private Sub cmdReboot_Click()
         shl.ShutdownWindows
    End Sub


    Вопрос:

       В Exele есть список примерно строк в 70. Объясните почему такой цикл:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Row = Row + 1
    Count = Count - 1
    Loop

    заканчивается, когда доходит до конца списка, а такой:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Row = Row + 1
    Count = Count - 1
    Loop

    , когда Count доходит до нуля?

    Ответ:

    Автор ответа: Andrey

    потому что в булевой алгебре (a OR b) = Not (Not(a) AND Not(b))

       т.е. применительно к данной ситуации:


      Until ((Cells(Row, 1).Value = "") OR (Count < 1))

      равнозначно

      While ((Cells(Row, 1).Value <> "") AND (Count > 0))
       
      /ключевой смысл в слове AND/

      т.е. в любом условии меняй OR на AND и они будут работать одинаково.


    Вопрос:

       В Exele есть список примерно строк в 70. Объясните почему такой цикл:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Row = Row + 1
    Count = Count - 1
    Loop

    заканчивается, когда доходит до конца списка, а такой:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Row = Row + 1
    Count = Count - 1
    Loop

    , когда Count доходит до нуля?

    Ответ:

    Автор ответа: Роксолан

    Вот что получается с твоими программами. Как известно, конструкция UNTIL /выражение/ - LOOP "крутится" до тех пор, пока /выражение/ ЛОЖНО. Таким образом, Do Until Cells(Row, 1).Value = "" Or Count < 1 ... LOOP завершит свою работу тогда, когда ОДНО из утверждений станет истинным. Поскольку, начальное значение COUNT больше, чем длина списка, то первым превратится в истину Cells(Row, 1).Value = "". С вытекающими последствиями. Во втором случае цикл крутится, пока утверждение ИСТИНО. И даже в том случае, когда Cells.Value="", приведенное в тексте выражение Cells(Row, 1).Value <> "" Or Count > 0 остается истинным до тех пор, пока Count>0. А он у тебя остается положительным еще тридцать строк после окончания таблицы...


    Вопрос:

       В Exele есть список примерно строк в 70. Объясните почему такой цикл:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Row = Row + 1
    Count = Count - 1
    Loop

    заканчивается, когда доходит до конца списка, а такой:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Row = Row + 1
    Count = Count - 1
    Loop

    , когда Count доходит до нуля?

    Ответ:

    Автор ответа: Maestro Ramires

    Ключевое слово While в цикле типа Do указывает проге, что данный цикл нужно выполнять до тех пор, пока следующее за ним условие истинно, аналогично - ключевое слово Until указывает, что цикл будет выполняться, пока условие ложно. Стало быть, в первом примере цикл будет выполняться пока в одной из ячеек не появиться какое-то значение или переменная Count не достигнет значения 0 (не дописано до конца). Во втором примере, цикл будет выполняться пока не появиться пустая строка или Count будет больше 0 (фактически тоже условие, что и в первом примере, только задано по-другому).


    Вопрос:

       В Exele есть список примерно строк в 70. Объясните почему такой цикл:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Row = Row + 1
    Count = Count - 1
    Loop

    заканчивается, когда доходит до конца списка, а такой:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Row = Row + 1
    Count = Count - 1
    Loop

    , когда Count доходит до нуля?

    Ответ:

    Автор ответа: Савельев Роман

    Ребята! Проверяйте логику!

    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Выполнять_пока_НЕ (ячейка пуста) или (Count < 1)

    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Выполнять_пока (ячейка НЕ пуста) или (Count > 0)

    Но ведь (A или B)=истина, если А=истина ИЛИ В=истина.
    Т.е. Do While Cells(Row, 1).Value <> "" Or Count > 0 будет выполняться даже при пустой ячейке, пока Count > 0.
    100 раз


    Вопрос:

       В Exele есть список примерно строк в 70. Объясните почему такой цикл:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do Until Cells(Row, 1).Value = "" Or Count < 1
    Row = Row + 1
    Count = Count - 1
    Loop

    заканчивается, когда доходит до конца списка, а такой:
      
    Dim Row, Count As Integer
    Row = 1
    Count = 100
    Do While Cells(Row, 1).Value <> "" Or Count > 0
    Row = Row + 1
    Count = Count - 1
    Loop

    , когда Count доходит до нуля?

    Ответ:

    Автор ответа: P@Ssword

    Объясняю: противоположностью условия

             (Условие1) ИЛИ (Условие2)

    является условие

             (НЕ Условие1) И (НЕ Условие2)

    (вроде ничего не напутал).

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

    While Cells(Row, 1).Value <> "" Or Count > 0

    пиши

    While Cells(Row, 1).Value <> "" And Count > 0


    Вопрос:

       Здравствуйте, посоветуйте, значение S лежит в ключе реестра: [HKEY_CURRENT_USER\Control Panel\Mouse] - "DoubleClickSpeed" , а как этот ключ запустить, найти?

    Private Declare Function GetDoubleClickTime Lib "user32" () As Long
    Private Sub Form_Load()
    S = GetDoubleClickTime
    MsgBox S
    End Sub

    Подскажите, что это за запись, где ее искать

    Ответ:

    Автор ответа: P@Ssword

    Совсем девушке мозги запудрили.

    Значение-то ЭС лежит в ключе реестра [censored], а возвращается оно функцией GetDoubleClickTime.
    Так что никакую запись искать не надо, просто пишем

    Крутая_Переменная = GetDoubleClickTime


    Вопрос:

       Есть два TextBox. В каждом яаписывается какое-либо время. Например:
    TextBox1.text = "01:30:25"
    TextBox2.text = "02:01:30"
    Как вычислить TextBox2.text - TextBox1.text
    Может кто сталкивался с таким, подкиньте код пожалуйста. Бывает ли переменная типа Time (не timer) и каким обраяом проияводятся вычисления со временем?

    Ответ:

    Автор ответа: Игорь

    Время и дата хранится в переменной числового типа. Целая часть числа отображает дату, дробная - время. получить текущее время можно оператором time
      
    Ну а дальше вычитай сколько хочешь.
      
    А если у тебя уже есть время в текстовом виде, то его преобразовать в число можно при помощи функции TimeValue
      
    Вот что про нее пишет подсказка :
      
    TimeValue Function Example
    This example uses the TimeValue function to convert a string to a time. You can also use date literals to directly assign a time to a Variant or Date variable, for example, MyTime = #4:35:17 PM#.
    Dim MyTime
    MyTime = TimeValue("4:35:17 PM")


    Можете заполнить эту форму, либо отослать вопрос СЮДА

    Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.
    Текст сообщения:
    Ваше имя
    E-mail для ответа

    наверх


    Выпуск подготовили:

    Сурменок Павел