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


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

Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом.



Рассылки Subscribe.Ru
VB.NET-World
Новости сайта IgorykSoft и советы по программированию
DanSoft о Visual Basic
Visual Basic.NET Уроки.

Ссылки:

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

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

       Если у Вас есть какие-нть коды, хитрости, примеры и вообще любая интересная информация по VB, просьба прислать мне! Так как материалы для рассылки практически иссякли!
    Читайте!


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




    Книги

    Переход на 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 можно найти здесь.

    наверх


    Контекстное меню. Практикум по созданию.

    Почти во всех приложениях Windows используется контекстное меню, вызываемое при нажатии правой клавиши мыши. Контекстное меню (или всплывающее) является обычным меню, но его положение на форме не закреплено.

    Контекстное меню вызывается с помощью метода PopupMenu. Что требуется для создания к.меню? Создайте обычное меню первого уровня (как на картинке 1), снимите галочку Visible. Затем создайте три подменю (картинка 2). Значения Visible оставьте как есть.

    Затем в события формы вставьте следующий код:

    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button And vbRightButton Then 'проверка, нажата ли правая клавиша мыши
    PopupMenu mnuPopup
    End If
    End Sub
    Private Sub mnuCopy_Click()
    MsgBox "Вы выбрали копировать"
    End Sub
    Private Sub mnuCut_Click()
    MsgBox "Вы выбрали вырезать"
    End Sub
    Private Sub mnuPaste_Click()
    MsgBox "Вы выбрали вставить"
    End Sub

    Пояснения: в событии MouseDown (более подробная справка по данному событию) необходимо проверить, нажата ли правая клавиша мыши, и только затем показать наше контекстное меню.

     

    Поясняющаая картинка 1

    (картинка 1)

    Поясняющаая картинка 2

    (картинка 2)

    Описание метода PopupMenu

    object.PopupMenu menuname, flags, x, y, boldcommand

    object     объект, к которому цепляем меню.
    menuname   имя меню, которое хоти прицепить
    flags      константа, описывающая место появление меню
    x          расположение меню по иксу
    y          расположение меню по игрику
    boldcommand  пункт меню, который должен быть выделен жирным (только один пункт!)

    Во-вторых, вот константы для flags:

    Константы Значение Описание
    vbPopupMenuLeftAlign  0 (по умолчанию) меню появляется слева под курсором.
    vbPopupMenuCenterAlign  4 меню появляется по центру под курсором.
    vbPopupMenuRightAlign  8 меню появляется справа под курсором.




    наверх


    Описание элементов VScrollBar/HScrollBar

    Элементы VScrollBar/HScrollBar устанавливают значение некоторой величины, перемещая ползунок между минимальным и максимальным значением. В некоторых ситуациях пользователь не знает заранее точного значения этой величины и элементы ScrollBar представляют ему гибкий механизм задания значения.

    Элемент ScrollBar - это полоса с бегунком, позволяющая выбрать значение между двумя концами элемента. Элемент ScrollBar располагается вертикально или горизонтально. Левый (нижний) конец элемента соответствует минимальному значению. Максимально значение находится на другом конце элемента. Поэтому основными свойствами элемента являются

    • Min (Минимум) - минимальное значение элемента
    • Max (Максимум) - максимальное значение элемента
    • Value (Значение) - текущее значение, определяемое положение бегунка.

    Свойства Min/Max - целые положительные значения в диапазоне от 0 до 32655. Например, для задания диапазона от 3,5 до 11,5 установите значение свойства Min в 35, а значение свойства Max - в 115, затем разделите на 10 значение свойства Value. Для диапазон чисел от -3,5 до 11,5 установите свойство Min в 0, значение Max - 150 (т.е. 35 + 115). Результат разделите на 10 и вычтите из него 3,5, чтобы отобразить нулевое значение элемента, равного -3,5.

    События элемента ScrollBar

    Значения элемента ScrollBar можно изменять тремя способами:

    • Щелкая на двух концевых стрелках. Значение элемента изменяется на величину, заданную свойством SmallChange.
    • Щелкая на области между бегунком и стрелками. Значение элемента изменяется на величину, заданную значением свойства LargeChange
    • Перемещая бегунок с помощью мыши.

    Изменения значения ScrollBar можно отслеживать из программного кода с помощью двух событий: Change и Scroll

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


    наверх


    Как изменить цвет фона при изменении значения элемента ScrollBar

    Создайте новый проект, добавьте на форму 2 элемента PictureBox и 3 элемента HScrollBar. Изменяя значения элементов HScrollBar (кликая на стрелочках, перемещая бегунок или кликая на полосе между бегунком и правой/левой стрелкой) вы можете наблюдать, как меняется цвет элементов PictureBox. Заметьте, событие Change применяется к элементу PictureBox1, а событие Scroll - к элементу PictureBox2. Таким образом видна разница между событиями. Более подробно о событиях элемента HScrollBar можно прочитать здесь. Описание функции RGB читайте здесь.

    Private Sub HScroll1_Change()
    Colors
    Picture2.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Private Sub HScroll1_Scroll()
    Colors
    Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Private Sub HScroll2_Change()
    Colors
    Picture2.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Private Sub HScroll2_Scroll()
    Colors
    Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Private Sub HScroll3_Change()
    Colors
    Picture2.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Private Sub HScroll3_Scroll()
    Colors
    Picture1.BackColor = RGB(HScroll1.Value, HScroll2.Value, HScroll3.Value)
    End Sub
    Public Sub Colors()
    Me.Caption = "Красный=" & HScroll1.Value & "; Зеленый=" & HScroll2.Value & "; Синий=" & HScroll3.Value
    End Sub

    наверх


    Перебор массива TextBox'ов

    Однажды мне задали вопрос: "Если у меня есть массив элементов TextBox, как мне последовательно обойти все элементы?". Данный пример годится не только для TextBox'ов.

    Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
    If KeyCode = 13 Then 'нажата клавиша ENTER
    NewIndex = Index + 1 'вычисляется следующий по индексу TextBox
    On Error Resume Next 'если достигнут последний индекс, это позволит избежать ошибки
    Text1(NewIndex).SetFocus 'операция получения ввода следующего ТекстБокса
    End If
    End Sub

    наверх


    Использование API при работе с TextBox'ом

    В данном примере вам понадобится дополнительный модуль, в который внесите следующий код:

    Option Explicit
    Public Const EM_EMPTYUNDOBUFFER = &HCD
    Public Const EM_CANUNDO = &HC6
    Public Const EM_GETMODIFY = &HB8
    Public Const EM_SETMODIFY = &HB9
    Public Const EM_UNDO = &HC7
    Public Const GWL_STYLE = (-16)
    Public Const ES_NUMBER = &H2000
    Public Const ES_UPPERCASE = &H8&
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

    А теперь вы можете использовать модуль для следующих действий над элементом TextBox

     

    Запрос: можно отменить последнее действие?

    SendMessage(Text1.hwnd, EM_CANUNDO, 0, 0)

    Запрос: изменился ли текст?

    SendMessage(Text1.hwnd, EM_GETMODIFY, 0, 0)

    Установить: изменился текст или нет

    Dim DirtyFlag As Long
    DirtyFlag = SendMessage(Text1.hWnd, EM_GETMODIFY, ByVal 0&, ByVal 0&)
    If DirtyFlag = 1 Then
    MsgBox "Содержимое Text Box изменилось"
    Else
    MsgBox "Содержимое Text Box не изменилось"
    End If
    End Sub

    Отменить последнее действие

    If SendMessage(Text1.hwnd, EM_CANUNDO, 0, 0) <> 0 Then SendMessage(Text1.hwnd, EM_UNDO, 0, 0)

    Позволить вводить в ТекстБокс только определенные символы

    Dim l As Long, Dim r As Long
    l = GetWindowLong(Text1.hwnd, GWL_STYLE)
    r = SetWindowLong(Text1.hwnd, GWL_STYLE, l Or ES_NUMBER) 'только цифры
    l = GetWindowLong(Text1.hwnd, GWL_STYLE)
    r = SetWindowLong(Text1.hwnd, GWL_STYLE, l Or ES_UPPERCASE) 'буквы в верхнем регистре и цифры
    l = GetWindowLong(Text1.hwnd, GWL_STYLE)
    r = SetWindowLong(Text1.hwnd, GWL_STYLE, l Or ES_LOWERCASE) 'буквы в нижнем регистре и цифры

    Очистить буфер отмены

    Call SendMessage(Text1.hwnd, EM_EMPTYUNDOBUFFER, 0, 0)
    Call SendMessage(Text1.hwnd, EM_SETMODIFY, False, 0)

    Перебор контролов на предмет изменения их содержимого

    Public Sub SaveData()
    Dim itextBoxCount As Integer
    For itextBoxCount = 0 To Controls.Count - 1
    If TypeOf Controls(itextBoxCount) Is TextBox Then
    If Changed(Controls(itextBoxCount)) Then
    'Place code to save data here
    End If
    End If
    Next
    End Sub

    Public Function Changed(ByVal ctlTextBox As TextBox) As Boolean
    Changed = SendMessage(ctlTextBox.hwnd, EM_GETMODIFY, 0, 0) <> 0
    End Function

    наверх


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

    BalloonMessage for MS Agent

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

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

    наверх


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

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

    Вопросы:


    Автор вопроса: Dmitriy S.

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

       Как в VBA (Excel) подключить таймер?
    Или есть другие способы работы со временем?


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

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

       У меня есть программка для MS Access где цифра записывается автоматически прописью. Мне надо вставить в текст нестандартные буквы (u,а,о с двумя точками наверху). как это сделать?


    Автор вопроса: Mind Engine

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

       Как программно получить уровень чернил в принтере (в данном случае с Epson C60)? Нужен пример работы с командами EscP Raster по битрониксу... МОжет есть контрол для такой беды?


    Автор вопроса: Игорь

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

       1. Если SQL-запрос, например, расчет суммы значений определенного поля по всем записям, выполнен в виде встроенной в БД процедуры, как осуществить отображение изменений этой суммы, например, при добавлении новой записи?

    2. Как правильно выполнить SQL-запрос к существующей таблице БД в коде отдельной процедуры?


    Автор вопроса: P@Ssword

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

       Я пишу реализацию несимметричного криптографического алгоритма RSA.
    Ядро практически готово. Приглашаю к соавторству программистов VB. Связь по
    е-мылу.


    Автор вопроса: I hate the fucking world

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

       Как привязать программу к ЭВМ. Только пожалуйста не надо писать всякую бурду про дату биоса т.к она одинакова на половине мам и в 2к эта фигня не работает SOS!!!!!!!


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

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

       Нужна помощь в написании программы программа должна открывать .html, .mdb файлы и искать e-mail'ы, программа нужна, чтобы вести базу данных пользователей. Базы есть но в html и mdb в ручную переволит очень долго,люди если кто нибудь может помочь хелпните.


    Автор вопроса: Роберт

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

       Mожно создать Rule (Rules Wizard) с notification.
    Как только вы получаете интересующее вас письмо, Outlook <выбрасывает> на экран сообщение об этом.
    Так вот вопрос - какое событие (event) и для какого объекта нужно <отловить>.
    И второе - созданный Rule - что это за объект и как <достучаться> до его свойств.


    Автор вопроса: Роман

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

       Есть несколько MaskEdBox'ов с различными масками.
    Как стереть из них введенную информацию.


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

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

       Как сохранять несколько картинок, в формате Gif.
    Но чтобы сохранялись не просто картинки, а анимация.
    А если точнее, то мне надо:
    У меня есть Пикчер, в котором с отпределенным периодом меняется картинка, как сохранить все картинки как анимацию???




    Ответы:


    Вопрос:

       У меня такой вопрос, а можно ли сделать пинговальщик (или что-то вроде этого) удалённого компьютера и чтобы он рботал без соединения с интернетом?

    Ответ:

    Автор ответа: Mind Engine

    Удаленный в смысле в другой комнате? :) Если комп к локалке подключен - пингуй его по имени и все дела! Тока TCP-IP настрой везде!


    Вопрос:

       Есть вопрос. Даже два.
    1. Для сжимания базы ранее использовал DAO :
         
         Set fs = CreateObject("Scripting.FileSystemObject") 'Создаем файловую систему
         tmpMDB = fs.GetTempName 'Получаем временный файл
         DBEngine.CompactDatabase Base, tmpMDB, dbLangCyrillic 'Сжимаем базу данных
         fs.CopyFile tmpMDB, Base, True 'Переписываем файл
         Kill tmpMDB 'Удаляем временный файл

         А как это же сделать в ADO ??? В справке ACCESS 2000 ничего не нашел.

      2. Для формы открыт один Recordset на MDB-файл. Мне его нужно сжать.
         Для того чтобы отсоединится от базы использую

             rstTEL.Close
             Set rstVED = Nothing

         Не помогает. Как же от нее отсоединится???

    Ответ:

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

    1.ADO не позволяет этого делать. Если хочешь уйти от DAO используй Access Object Model:

    Dim oAccessApp As Access.Application

    Set oAccessApp = New Access.Application
    oAccessApp.CompactRepair(, , LogFile)

    2.Для этого нужно также закрыть и текущее соединение:

    Dim oCon As ADODB.Connection
    ....
    'Полезная работа
    ....
    oCon.Close
    Set oCon = Nothing


    Вопрос:

       Как в WinXP скрыть мою прогу из списка Ctrl+Alt+Del или запретить завершать е? через нажатие кнопки "Cнять задачу"?

    Ответ:

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

    Даже если ты ее скроешь из списка задач, она останется в списке процессов. Для таких случаев есть простое, но мудрое решение - РАЗРЕШАТЬ закрывать экземпляр программы, но при закрытии запускать новый экземпляр.

    P.S.Нет такой чистой и светлой мысли, которую бы русский человек не смог бы выразить в грязной матерной форме.



    Ответ:

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

    В системах на базе NT такое вряд ли возможно.



    Ответ:

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

    А помоему от XP хрен че скроешь.
    Может я и ошибаюсь?



    Ответ:

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

    App.TaskVisible = False

    , кажется так или что-то похожее.


    Вопрос:

       Есть таблица DataBoundGrid и элемент Data. В коде пишу:

    Data.DatabaseName="МОЯ_БАЗА_ДАННЫХ"
    Data.RecordSource=sSQL 'SQL запрос
    Data.Refresh

    Во время исполнения последней строки выдается сообщение "Object doesn't support this property or method"(Объект не поддерживает это свойство или метод), но DBGrid заполняется нужными данными и далее все идет нормально. В чем причина ошибки? Как ее исправить?

    Ответ:

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

    Если бы еще знать источник данных(я так полагаю Access),строку подключения, версию DAO и т.д., то можно было сказать что-то определенное ...


    Вопрос:

       podskagyte please kak udalat podkatalogi ili vse fajly w papke , sreda - VB 6

    Ответ:

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

    Точно не скажу, но FileSystemObject предоставляет довольно обширные возможности для работы с дисками. Чтобы задействовать его подключи библиотеку Microsoft Scripting Runtime или что-то такое, потом создай образец класса FSO и работай.



    Ответ:

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

    Как один из вариантов - есть такая функция в VB для запуска внешних приложений под названием Shell (pathname[,windowstyle]). А в коммандном процесоре операционной системы (или это внешняя программа - не помню) для удаления директории и всего ее содержимого есть Deltree [/Y] [диск:]путь [[диск:]путь[...]] Попробуй использовать в своем коде нечто вроде

    shell "DelTree /Y c:\windows", vbHide

    Лично я такое не использовал, посему извиняюсь за возможные грабли.


    Вопрос:

       Как спустить мою прогу в трей?

    Ответ:

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

    Для начала добавь на форму Command1.
    У меня всё работает (на Win98 и WinXP)!

    Код формы:

    Dim NID As NOTIFYICONDATA
    Sub AddIcon()
    Dim IDLib As Long ' Указатель на библиотеку
    Dim IDIcon As Long ' Указатель на иконку
    Const IDMyIcon = 101 ' Идентификатор иконки внутри приложения
    Dim AddResult As Long ' Результат добавления иконки
    IDLib = GetModuleHandle("Project1.exe") ' Получаем hInstanse
    IDIcon = Me.Icon
    ' Заполняем структуру NID типа NOTIFYICONDATA
    NID.cbSize = Len(NID) ' Размер структуры
    NID.hwnd = Form1.hwnd ' Указатель на форму
    NID.uID = IDMyIcon ' Идентификатор иконки
    NID.uFlags = NIF_MESSAGE + NIF_ICON + NIF_TIP 'Указываем, что действующими являются поля uCallBackMessage, hIcon и szTip.
    NID.uCallbackMessage = WM_LBUTTONDOWN ' Указываем, что событием возвращаемым в форму является MouseDown с параметром Button = 2
    NID.hIcon = IDIcon ' Указатель на иконку в файле
    NID.szTip = Left$("MyIcon", 63) & Chr(0) ' Передаем всплывающую фразу "MyIcon", при этом обрезаем ее до 63 символов и добавляем 64-й символ с кодом ноль
    AddResult = Shell_NotifyIcon(NIM_ADD, NID) ' Вызываем функцию, через параметр dwMessage указываем, что следует добавить иконку, и передаем заполненный NID
    Me.Visible = False
    End Sub

    Sub DeleteIcon()
    Dim DeletResult As Long
    DeleteResult = Shell_NotifyIcon(NIM_DELETE, NID) ' Вызываем функцию, через dwMessage указываем, что следует удалить иконку, при этом, раз переменная NID описана на уровне модуля, не следует заполнять ее заново
    End Sub

    Private Sub Command1_Click()
    Call AddIcon
    End Sub

    Private Sub Form_Mousedown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If X = 7695 Then ' SysTray Icon Events
    Shell_NotifyIcon NIM_DELETE, NID
    Form1.Visible = True
    End If
    Me.Enabled = False
    Me.Enabled = True
    End Sub

    Код модуля:

    Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As dwMess, lpData As NOTIFYICONDATA) As Long
    Public Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long

    Public Enum dwMess
    NIM_ADD = &H0 ' Добавление иконки
    NIM_DELETE = &H2 ' Удаление иконки
    NIM_MODIFY = &H1 ' Изменение параметров иконки
    End Enum

    Type NOTIFYICONDATA
    cbSize As Long ' Размер переменной типа NOTIFYICONDATA
    hwnd As Long ' Указатель окна создающего иконку
    uID As Long ' Указатель на иконку в пределах приложения
    uFlags As uF ' Маска для следующих параметров
    uCallbackMessage As CallMess ' Возвращаемое событие
    hIcon As Long ' Указатель на изображение для иконки
    szTip As String * 64 ' Всплывающий над иконкой текст
    End Type

    Public Enum uF
    NIF_MESSAGE = &H1 ' Значение имеет uCallbackMessage
    NIF_ICON = &H2 ' Значение имеет hIcon
    NIF_TIP = &H4 ' Значение имеет szTip
    End Enum

    Public Enum CallMess
    WM_MOUSEMOVE = &H200
    WM_LBUTTONDOWN = &H201
    WM_LBUTTONUP = &H202
    WM_LBUTTONDBLCLK = &H203
    WM_RBUTTONDOWN = &H204
    WM_RBUTTONUP = &H205
    WM_RBUTTONDBLCLK = &H206
    WM_MBUTTONDOWN = &H207
    WM_MBUTTONUP = &H208
    WM_MBUTTONDBLCLK = &H209
    WM_SETFOCUS = &H7
    WM_KEYDOWN = &H100
    WM_KEYFIRST = &H100
    WM_KEYLAST = &H108
    WM_KEYUP = &H101
    End Enum



    Ответ:

    Автор ответа: Mind Engine

    Я пользуюсь MBTray.ocx, www.vb2themax.com, прикольный компонент, поддерживает анимацию дажо!


    Вопрос:

       Помогите пожалуйста выйти из затруднительной ситуации:

    1. Необходимо обойти ограничения методов Find для поиска определенной записи в БД Access (именно в динамическом наборе), т.к. Find ищет записи только при полном вхождении искомого выражения в поле.
    2. Как подсчитать и поместить в TextBoxы данные о том сколько всего записей в таблице и сколько отобрано по ранее созданному запросу.
    3. Возможно ли и каким образом подключить к проекту БД Access 2000 и XP не используя ODBC.
    Если не затруднит, то просьба ответы изложить поподробнее, т.к. в VB я еще полный USER.

    Ответ:

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

    1. Да там как раз и нет практически никаких ограничений, например,

    rs.FindFirst "FIO Like '*Сергей*'"

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

    2. rs.RecordCount возвратит кол-во записей, но если используется DAO, то только после полного заполнения рекордсета:

    rs.MoveLast
    rs.MoveFirst

    Открывают рекордсет без условий - всего записей в таблице, а потом с условием Where и получают разницу

    3. DAO 3.6 идет вместе с Access 2000 и XP и гораздо более мощное и удобное средство, чем ODBC для БД с небольшим числом пользователей в сети.



    Ответ:

    Автор ответа: Александр Горбылёв

    Олег, касательно ваших вопросов сообщаю следующее:

    1. Необходимо обойти ограничения методов Find для поиска определенной записи в БД Access (именно в динамическом наборе), т.к. Find ищет записи только при полном вхождении искомого выражения в поле. Ответ: в целом, не рекомендуется использовать Find-метод из-за невысокой скорости его выполнения, а замените его SQL-запросом. Например, так, как частичный фрагмент моей коммерческой программы (конечно, предварительно установив в проекте ссылку через "Project-References" на "Microsoft ActiveX Data Objects Library"):

    Option Explicit
    Dim rsHS As ADODB.Recordset ' таблица строк заказа
    ...
    Private Sub cmdSearch_Click() ' что искать, клиент вводит сюда
        Dim sSelect As String
        Dim sWhere As String
        Dim sLikeText As String

        Set dgdOutText.DataSource = Nothing ' dgdOutText - DataGrid с найденными строками
        sSelect = msHSselect ' часть SQL-select до WHERE
        sLikeText = Trim(txtSearch) ' что ищем

        If Len(sLikeText) > 0 Then
           sLikeText = " WHERE (TextOut LIKE '%" & sLikeText & "%')" ' TextOut - текст, который надо найти где-то в строке, неважно где!
        End If

        sSelect = sSelect & sLikeText

        With rsHS
           .Close
           .ActiveConnection = glADOconn ' здесь покоится строка подключения к БД
           .CursorLocation = adUseClient
           .LockType = adLockReadOnly
           .CursorType = adOpenStatic
           .Source = sSelect
           .Open Options:=adCmdText
        End With
        Set dgdOutText.DataSource = rsHS ' инициирование связи с DataGrid
        dgdOutText.Refresh ' лучше здесь оформить вызовом некой функции DataGridRefresh - переоформить таблицу,- где будет, в частности, вызов dgdOutText.Refresh
        Set txtString.DataSource = rsHS ' связать текст с таблицей
    End Sub

    Private Sub Form_Load()
        Set rsHS = New ADODB.Recordset
        With rsHS
           .ActiveConnection = glADOconn
           .CursorLocation = adUseClient
           .LockType = adLockReadOnly
           .CursorType = adOpenStatic
           .Source = msHSselect & msHSwhereAll ' вначале покажем все имеющиеся записи
           .Open Options:=adCmdText
        End With
        Set dgdOutText.DataSource = rsHS ' инициирование связи с DataGrid
        dgdOutText.Refresh ' лучше вызовом некоей DataGridRefresh, отвечающей за оформление таблицы
    End Sub

    2. Как подсчитать и поместить в TextBoxы данные о том сколько всего записей в таблице и сколько отобрано по ранее созданному запросу. Для нединамических (!) курсоров существует свойство в наборе "RecordCount", которое показывает количество записей, но для этого универсальнее сначала сделать прыжок в конец набора записей:

    rs.MoveLast
    nRecords = rs.RecordCount ' количество имеющихся записей

    3. Возможно ли и каким образом подключить к проекту БД Access 2000 и XP не используя ODBC. Кстати, и здесь ODBC тоже не рекомендуется. Лучше по-прямее и более функционально :-) Пример для MDB Access 2000, но элементарно переделывается для других СУБД. Access XP - провайдер просто должен присутствовать в системе. Его можно загрузить, например, из Microsoft или же он имеется, если установлен Office XP, хотя это не обязательно.


    Option Explicit
    Dim glADOconn As ADODB.Connection ' соединение, объявление которого можно поместить в отдельную процедуру отдельного модуля. Тогда будет
    Global glADOconn As ADODB.Connection ' Всё зависит от конткретной ситуации с соединением. Оно может быть даже модемным...
    ....
    Private Sub Form_Load()
        Dim MyDbString As String ' MDB-база умолчания
        Const StrProvider As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
        Dim cnn As ADODB.Connection

        ' Open a connection using a DSN and individual
        ' arguments instead of a connection string.
        'cnn.Open strConn, UserID, Psw[, Options]
        Set cnn = New ADODB.Connection
    ....
    MyDbString = "\\Сервер\Путь\МояБД.mdb" ' здесь как-то получаем полный путь к БД: в диалоге или через системный реестр и т.д.
    MyDbString = "D:\Путь\МояБД.mdb"
    ...

        If cnn.State = adStateClosed Then 'newly-created db may be open so
           cnn.CursorLocation = adUseClient 'create client side
           cnn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MyDbString ' check first before opening
        End If
        
        If cnn.State = adStateOpen Then
    .....
        End If

    End Sub



    Ответ:

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

    Пользуйся SQL.


    Вопрос:

       При испольяовании ADO не работает Bookmark, а именно:

    sVar = rs.Bookmark '-- сохранил текущую яапись в переменной
    ..................
    rs.Bookmark = sVar '-- вояврат на исходную яапись

    А вот последняя строка и не работает, - выдается ошибка 3001 и сообщение о несоответствии типов, превышении диапаяона яначений и еще чего-то. Посмотрел в текущие яначения rs.Bookmark, а оно - числовое. Заменил тип переменной с String на Long (Integer). Эффекта никакого, вылетает та же ошибка.

    Ответ:

    Автор ответа: Игорь Романов

    Закладка (Bookmark) должна быть Variant. Иначе не работает.




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

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

    наверх


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

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