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


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 .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-переброс данных из массива в элемент ListBox

    Как вы знаете, у элементов ListBox или ComboBox существует метод AddItem, который просто-напросто добавляет в выбранный контрол некие значения, определяемые пользователем. Но с использованием API функций можно ускорить процесс занесения данных в указанные выше элементы. Как я это определил? В данном примере вам понадобятся 4 элемента CommandButton, а также элемент ListBox (или ComboBox). При нажатии на кнопку 3, вы получите время загрузки 1000 элементов в ЛистБокс с использованием метода AddItem, при нажатии на кнопку 4 - при использовании API-функций. Заметили разницу? Ну а первые две кнопки всего лишь показывают работу функции ArrayToListBox.

    Что еще может функция ArrayToListBox? Как вы видите, в параметрах функции 5 элементов. Два обязательных (контрол и массив данных), третий параметр при значении True очищает список элементов, а четвертый и пятый параметры всего лишь определяют, с какого элемента из массива данных (по порядковому номеру) начинать заносить в элемент ListBox и каким элементом (по порядковому номеру) заканчивать.

    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 LockWindowUpdate Lib "user32" (ByVal hwndLock As Long) As Long
    Private Const LB_ADDSTRING = &H180
    Private Const LB_RESETCONTENT = &H184
    Private Const CB_ADDSTRING = &H143
    Private Const CB_RESETCONTENT = &H14B
    Private Declare Function GetTickCount Lib "kernel32" () As Long
    Dim adr()

    Sub ArrayToListBox(ctrl As Object, arr As Variant, Optional clearIt As Boolean, Optional ByVal First As Variant, Optional ByVal Last As Variant)
    Dim msgReset As Long
    Dim msgAdd As Long
    Dim hWnd As Long
    Dim index As Long
    If TypeOf ctrl Is ListBox Then
    msgReset = LB_RESETCONTENT
    msgAdd = LB_ADDSTRING
    ElseIf TypeOf ctrl Is ComboBox Then
    msgReset = CB_RESETCONTENT
    msgAdd = CB_ADDSTRING
    Else
    ' none of the above, exit
    Exit Sub
    End If
    If IsMissing(First) Then First = LBound(arr)
    If IsMissing(Last) Then Last = UBound(arr)
    ' disable redrawing
    hWnd = ctrl.hWnd
    LockWindowUpdate hWnd
    ' clear control if requested
    If clearIt Then
    SendMessage hWnd, msgReset, 0, 0
    End If
    ' add all items in the array
    For index = First To Last
    SendMessage hWnd, msgAdd, 0, ByVal CStr(arr(index))
    Next
    ' re-enable redrawing
    LockWindowUpdate 0
    End Sub

    Private Sub Command1_Click()
    Call ArrayToListBox(List1, adr, False, 2, 9)
    End Sub
    Private Sub Command2_Click()
    Call ArrayToListBox(List1, adr, True, 11, 18)
    End Sub

    Private Sub Command3_Click()
    t1 = GetTickCount
    List1.Clear
    For i = 1 To 1000
    List1.AddItem adr(i)
    Next
    t2 = GetTickCount
    MsgBox t2 - t1
    End Sub

    Private Sub Command4_Click()
    t1 = GetTickCount
    Call ArrayToListBox(List1, adr, True)
    t2 = GetTickCount
    MsgBox t2 - t1
    End Sub

    Private Sub Form_Load()
    ReDim adr(1000)
    For i = 1 To 1000
    adr(i) = Str(i)
    Next i
    List1.AddItem "--"
    List1.AddItem "--"
    List1.AddItem "--"
    End Sub

    наверх


    Drag&Drop в элементе ListBox

    Данный пример покажет, как можно воспользоваться Drag&Drop при переносе элементов из одного ListBox в другой. Расположите на форме 2 элемента ListBox. Установите свойства элементов  OLEDragMode = 1 'Automatic и OLEDropMode = 1 'Manual. Попробуйте после запуска программы перетащить элемент из 1-го ListBox'а в другой.

    Private Sub Form_Load()
    List1.AddItem "11"
    List1.AddItem "22"
    List1.AddItem "33"
    List1.AddItem "44"
    List1.AddItem "55"
    End Sub

    Private Sub List1_OLEStartDrag(Data As DataObject, AllowedEffects As Long)
    Dim i As Integer
    Dim strdata As String

    For i = 0 To List1.ListCount - 1
    If List1.Selected(i) = True Then
    strdata = strdata & List1.List(i) & vbCrLf
    End If
    Next i
    Data.SetData strdata
    End Sub

    Private Sub List2_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim intin As Integer
    Dim intstart As Integer

    intstart = 1
    intin = InStr(Data.GetData(1), vbCrLf)
    Do
    On Error Resume Next
    List2.AddItem Replace(Mid(Data.GetData(1), intstart, (InStr(intstart + 1, Data.GetData(1), vbCrLf) - intstart) + 1), vbCr, "")
    If Err = 5 Then
    List2.AddItem Replace(Mid(Data.GetData(1), intstart + 1), vbCrLf, "")
    Exit Do
    End If
    intstart = intin + 2
    intin = InStr(intstart, Data.GetData(1), vbCrLf)
    Loop Until intin = 0
    End Sub

    наверх


    Сортировка массива данных по порядку

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

    Option Base 1
    Dim ard() As String

    Sub BubbleSort(pstrArray() As String)
    plngMaxItem = UBound(pstrArray)
    Dim i As Long
    Dim fSwitched As Boolean
    Dim strTemp As String
    Do
    fSwitched = False
    For i = 1 To plngMaxItem - 1
    If pstrArray(i) > pstrArray(i + 1) Then 'сортируем по возрастанию
    ' If pstrArray(i) < pstrArray(i + 1) Then 'сортируем по убыванию
    fSwitched = True
    strTemp = pstrArray(i)
    pstrArray(i) = pstrArray(i + 1)
    pstrArray(i + 1) = strTemp
    End If
    Next
    Loop While fSwitched
    End Sub

    Private Sub Command1_Click()
    Call BubbleSort(ard())
    For i = 1 To UBound(ard())
    MsgBox ard(i), , i
    Next
    End Sub

    Private Sub Form_Load()
    ReDim ard(6)
    ard(1) = "http://aa4"
    ard(2) = "http://aa3"
    ard(3) = "http://bb2"
    ard(4) = "http://aa1"
    ard(5) = "http://aa2"
    ard(6) = "http://bb1"
    End Sub

    наверх


    Сохранение/загрузка массива данных в ListBox

    Данный пример позволяет вам сохранить данные из элемента ListBox в файл на диске, а также загрузить данные из файла в ListBox.

    Вам понадобятся 2 элемента CommandButton.

    Sub saveitems(lstin As ListBox)
    Dim i As Integer
    Open App.Path & "\" & lstin.Name & ".txt" For Output As #1
    For i = 0 To lstin.ListCount - 1
    Print #1, lstin.List(i)
    Next i
    Close #1
    End Sub

    Sub LoadItems(lstin As ListBox)
    Dim i As Integer
    Dim str As String
    If Len(Dir(App.Path & "\" & lstin.Name & ".txt")) Then
    Open App.Path & "\" & lstin.Name & ".txt" For Input As #1
    Do While Not EOF(1)
    Line Input #1, str
    List1.AddItem str
    Loop
    Close #1
    End If
    End Sub

    Private Sub Command1_Click()
    Call saveitems(List1)
    List1.Clear
    End Sub

    Private Sub Command2_Click()
    Call LoadItems(List1)
    End Sub

    Private Sub Form_Load()
    List1.AddItem "http://aa4"
    List1.AddItem "http://aa3"
    List1.AddItem "http://bb2"
    List1.AddItem "http://aa1"
    List1.AddItem "http://aa2"
    List1.AddItem "http://bb1"
    End Sub

    наверх


    Автозагрузка вашей программы со стартом Windows

    А также удаление программы из автозагрузки.

    Еще один полезный совет, как можно загружать вашу программу вместе с загрузкой Windows. Все просто: вы должны указать "Имя твоей проги" и "Путь к твоей проге", то есть имя вашей программы для загрузки, а также ПОЛНЫЙ путь к ней на жестком диске, если она не лежит в директории Windows.

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

    Private Sub Command1_Click() 'Запись в реестр
    Set Reg = CreateObject("WScript.Shell")
    Reg.RegWrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Имя твоей проги", "Путь к твоей проге"
    End Sub

    Private Sub Command2_Click() 'Удаление из реестра
    Set Reg = CreateObject("WScript.Shell")
    Reg.RegDelete "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\Имя твоей проги"
    End Sub

    наверх


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

    BalloonMessage for MS Agent

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

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

    наверх


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

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

    Вопросы:


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

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

       Суть проблемы:
    Создается файл *.mdb, в котором создается таблица (например на 5 полей), в которую затем пишутся real-time данные.
       Проблема в том, что из-за св-ва Required=true прога требует обязательного заполнения данными всех полей. А данные (иногда бывает) могут отсутствовать в некоторых полях.
       Каким образом и где в коде установить св-во Required в false?
       Или есть другой выход из положения?


    Автор вопроса: JSC Shuyskaya Vodka

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

       Как в скрипте на VBSripts запустить команду ДОС с правами адмнистратора, зная пароль и логин админа ??


    Автор вопроса: Славик

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

       Как перехватить сообщения Windows (все подряд MsgBox).
    А еще лучше определить строку, которая находится под мышкой, в любом приложении Win.
    Это вобще возможно?

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

    На самом деле мне нужна не лупа, а нечто другое, поэтому не пишите как увеличить картинку. Мне нужен только текст.


    Автор вопроса: Носарь Александр

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

       Простейшая ситуация, но не знаю как ее решить. Есть два ListBox, в первом и во втором содержится взаимосвязанная информация. Возникает ситуация когда количество строк в ListBox1 не вмещаются на экран, и для просмотра, тех что не "влезли" на экран приходится пользоваться полосой прокрутки. Можно ли сделать так что бы при использовании полосы прокрутки в ListBox1, информация в ListBox2, также поднималась (или опускалась) синхронно с информацией в ListBox1 ?


    Автор вопроса: KAS (c)

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

       У меня такой вопрос: Как отправить письмо средствами VB?
    Побывал:

    Private Sub Command1_Click()
      Set myOlApp = CreateObject("Outlook.Application")
      Set myItem = myOlApp.CreateItem(olMailItem)
      Set myRecipient = myItem.Recipients.Add("k.a.s@dts.ru")
      myItem.Subject = "тема"
      myItem.Body = "сообщение"
      Set myAttachments = myItem.Attachments
      myAttachments.Add "C:\1.xls" ' вложенный файл
      myItem.Display
      myItem.send
    End Sub

    Выдаёт ошибку: не могу создать объект ActiveX


    Автор вопроса: Тоша

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

       Может ли приложение написанное на Visual Basic 6.0, испольяуюещее, например, WindowsCommunControls, под Windows 98 заработать на Windows 95, Windows 2000 & XP?
    После переноса приложения на другой компьютер (бея VB) все не работает. Что сделать?


    Автор вопроса: KAS (c)

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

       Подскажите как пользоваться API функциями:
    FindWindow и EnumWindow


    Автор вопроса: Дима

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

       Можно ли подцепить CrystalReport к контролу Adodc (без использования DataEnvironment со своими command)? То есть при измении SQL-запросов для Adodc соответсвенно изменяется и отчет, выводимый на печать. DataReport1.DataSource = Adodc1 - не проходит. Может я забываю что-то объявить/прописать?


    Автор вопроса: KAS (c)

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

       Подскажите как работать с API функцией: SetWindowText


    Автор вопроса: Егоров

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

       Как открыть папку с помщью апи или без него?


    Автор вопроса: 108vadim

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

       Как правильно обновить рекордсет в DataEnvironment?
    Все обновляется один раз :

    private sub Obnovit()
        DataEnvironment.rsMyTable.update
        DataEnvironment.rsMyTable.requery
        'потом обновляю все Контролы (раньше не понимал почему данные не
        'обновляются в контролах вот пример:)
        set text1.DataSource=DataEnvironment
        set DataGrid1.DataSource=DataEnvironment
    end sub

    Если я второй раз вызываю sub Obnovit то ругается на update и requery, я нашел выход при котором хоть сколько раз вызывай Obnovit все обновляется : просто надо закрыть и заново открыть DataEnvironment после обновления:

    DataEnvironment.rsMyTable.close
    DataEnvironment.rsMyTable.open

    Все работает, но думаю что закрывать и открывать это неправильно, есть ли способы этого не делать чтобы правильно обновлять рекордсеты в DataEnvironment???? Вобщем как правильно обновить рекордсет в DataEnvironment ??


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

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

       1) Как програмно изменить цвет рабочего стола?
    2) На форме лежит SSTab, между его закругленными закладками виднеется сама форма. Как эти фидимые куски формы вырезать? Знаю, что с Path, но нужен пример.


    Автор вопроса: Владимир

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

       Как создать АктивХ для игры в морской бой? То есть поле игры! Кто знает просьба ответить или дать ссылочку на документацию! Исходники брать не хочу! Хочу писать сам.


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

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

       Как можно задействовать бланк написаный на Access в VB?


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

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

       Вот какие вопросы:
    1. Какие есть способы для закрашивания половины (части) буквы, например половина буквы "А" зеленая, другая - красная?
    2. И второй вопрос, как сделать так, чтобы буквы в слове были разноцветными?




    Ответы:


    Вопрос:

       Можно ли на Visual Basice написать программу каторая бы уменьшала скорость CD если можно то как ?

    Ответ:

    Автор ответа: ]CBK[CRaSH

    Конечно можно для этого тебе необходимо использовать функцию DivaceIOcontrol и все


    Вопрос:

       Есть запрос на ACCESS который работает с переменой как передать эту переменую через VB

    Ответ:

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

    Не совсем понял отношения Access и VB:

    1. Если из-под ВБ открывается запрос, то
         Set db = DBEngine.OpenDatabase("полный путь к файлу")
         Set qry = db.QueryDefs("запрос с параметром")
         qry.Parameters(индекс параметра) = значение
         Set rs = qry.OpenRecordSet

    2. Если ВБ-прога должна установить значение, а запрос в Access его прочитать, то в Access-е можно создать скрытую форму, запускаемую при открытии базы данных, которую можно использовать как контейнер для хранения переменных. Параметр запроса настроить на соответствующее свойство формы. Или использовать специальную таблицу для хранения переменных. Этот способ универсальней, т.к. не зависит от порядка запуска ВБ и Акцесс.


    Вопрос:

       Можно ли в Access программно открыть запрос, основанный на SQL-операторе SELECT (строка с SQL-инструкцией может изменяться)?
    Метод DoCmd.OpenQuery работает только для сохраненных запросов, а метод DoCmd.RunSQL не работает с SELECT.

    Ответ:

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

    Да DoCmd.OpenQuery открывает только сохраненный запрос, а кто мешет его сохранить, а потом удалить, напр. так:

        Dim sSQL As String
        Dim sQTemp As String
        sQTemp = "qdfTemp"
        
        sSQL = "SELECT * FROM Заказы WHERE [Код работника]=2;"
        
        CurrentDb.CreateQueryDef sQTemp, sSQL ' создание запроса

        DoCmd.OpenQuery sQTemp, acViewNormal ' открытие
        
        CurrentDb.QueryDefs.Delete sQTemp ' удаление

    Или можно создать ленточную форму и в событии Form_Open формировать свойство Me.RecordSource


    Вопрос:

       Подскажите пож-та, у меня БД на Access-97, как выбрав на форме перекл-ль или лучше из поля со списком (VB должен определять и выводить имена принтеров, установленных в данный момент на компе) и делать его "по умолчанию". Т.е. то печатаем отчет на HP-1000, то отправляем на принтер/факс VentaFax.

    Ответ:

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

    Воспользуйся свойством формы или отчета PrtDevNames.


    Вопрос:

       Есть ComboBox, в нём значения из таблицы (методом ADD). Таблица подключается с помощью DAO 3.51 и имеет 2 колонки. В ComboBox выбрали значение из 1-ой колонки. Как узнать соответствующее ему значение из 2-ой колонки.

    Ответ:

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

    ComboBox.Column(1) - индекс от 0 до ColumnCount-1


    Вопрос:

       Если у кого-нибудь есть небольшая документация по VBScript, огромная просьба прислать ее на ilya_001@mail.ru. Век не забуду доброго человека!

    Ответ:

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

    Здесь было: http://ssz.by.ru/programming/vbs.htm


    Вопрос:

       Осваиваю ужасные дебри вбнэт.
    Начинаю с простого:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    Единственное что я здесь понимаю - это "Private Sub Button1_Click", а для чего остальные параметры???
    И еще я понял, что такой полезной штуки как index больше нет, но может, есть аналог(просто другое название), или есть какой-то более сложный способ???
    А также нужна помощь с hdc - в vbnet такова нет, но уверен, что также есть аналог.

    Ответ:

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

    Index в VB.NET нет есть только отголосок от VB6.0 если сделаеш прогу на VB6.0 с Index и переделаеш на VB.NET стандартным конвертатоом то увидиш ее. Hdc можеш посмотреть в справке там много чего есть в том числе и функции которые вымерли или переделали в другой вид.




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

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

    наверх


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

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