Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


Информационный Канал Subscribe.Ru

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


VBNet VBMania
Ссылки:

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

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

       Я взялся заа изучение технологии XSLT. Очень удобная штука! Хорошо структурированные и удобочитаемые данные в формате XML с помощью XSLT бсытро превращаются в красивый HTML! Уже подумываю о том, чтобы написать формат данной рассылки в XML и XSLT для преобразования в HTML, а для создания XML припрячь .NET, тем самым максимально автоматизировав создание рассылки, которая сейчас делается почти полностью вручную.
    Читайте!


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




    Как делать DropDown Button в Васике?

    Вопрос:

    Как делать DropDown Button в Васике? (Это такая выпадающая кнопка, типа Back в IE)

    Ответ:

    Делаешь в ToolBar кнопку, задаешь ей стиль 5 - tbrDropdown.
    Для анализа выбора обрабатывай Toolbar1_ButtonMenuClick
    Можно динамически добавлять и удалять пункты:

    Toolbar1.Buttons(1).ButtonMenus.Add
    Toolbar1.Buttons(1).ButtonMenus.Remove

        Дмитрий Данелия

    наверх


    Как работать с FindWindow, EnumWindow?

    Вопрос:

    Поясните как работать с функцией API:
    FindWindow, EnumWindow.
    Мне нужно найти идентификатор окна.

    Ответ:

    Функция может искать хендл окна либо по заголовку, либо по имени класса, в зависимости от того, что известно. Ну и, естественно, хендл надо получить:

    Dim lMyHandle As Long
    lMyHandle = FindWindow(vbNullString, "Калькулятор")
         ' если знаем заголовок
    lMyHandle = FindWindow("ExploreWClass", vbNullString)
         ' найдешь окно Проводника

    А EnumWindows используется для того, чтобы перебрать все окна, существующие в данный момент.

    Private Sub Form_Load()
         Me.AutoRedraw = True
         'call the Enumwindows-function
         EnumWindows AddressOf EnumWindowsProc, ByVal 0&
    End Sub

    'Это помещаешь в модуль
    Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal
    lParam As Long) As Boolean
    Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal
    hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Declare Function GetWindowTextLength Lib "user32" Alias
    "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

    Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As
    Boolean
         Dim sSave As String, Ret As Long
         Ret = GetWindowTextLength(hwnd)
         sSave = Space(Ret)
         GetWindowText hwnd, sSave, Ret + 1
         Form1.Print Str$(hwnd) + " " + sSave
         EnumWindowsProc = True ' продолжение перебора
    End Function

        Дмитрий Данелия

    наверх


    Где можно скачать описание API функций по-русски?

    Вопрос:

    Где можно скачать описание API функций по-русски?

    Ответ:

    http://subscribe.ru/catalog/comp.soft.prog.winapi19743

        ∙Creator∙

    http://www.bcbdev.ru/winapi.htm

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

    наверх


    Как в VB.NET динамически создавать текстбоксы?

    Вопрос:

    VB .Net

    Есть панель Panel1, на ней два текстбокса. Как сделать так, чтобы при появлении текста во втором текстбоксе, снизу создавался третий. Не делался visible, а появлялся, создавался.

    Ответ:

    'Вверху там где объявления переменных уровня класса

    Friend WithEvents txtNumber As System.Windows.Forms.TextBox

    'В процедуре, в которой создаёшь текстбокс
    txtNumber=New System.Windows.Forms.TextBox
    txtNumber.Visible=true
    'Устанавливаем положение и размеры
    txtNumber.Left=...
    txtNumber.top=...
    txtnumber.width=...
    txtnumber.height=...

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

    Можно унаследовать предыдущий и делать все это с массивом.

    redim pres...
    txtNumber(index)=New txtNumber(index-1)
    txtNumber(index).top=txtNumber(index-1).top + сколько надо
    а чтоб появился надо добавить его в соответствующую коллекцию
    Controls
    и еще не забыть обработчик навесить, чтоб под ним тоже могло появляться.

        Алексей Вишневский

    наверх


    Как создать меню ( Файл, Правка ...)?

    Вопрос:

    Как создать меню ( Файл, Правка ...)?

    Ответ:

    Щелкни правой кнопкой мышки по форме: выбери пункт Menu Editor
    В Caption вводишь названия пунктов своего меню, в Name - имя-идентификатор для каждого пункта, например:
    Caption = Файл
    Name = mnuOpen
    Для создания каждого последующего пункта щелкай на Next
    Если в пункте меню должны быть еще раскрывающиеся подпункты щелкай на стрелочку вправо (появится ....)
    Для создания разделителя в Caption вводи - (знак минус)
    Вот и все твое меню готово. Жми ОК!
    Если меню должно быть всплывающим в твоей программе (скажем,появляться по нажатию правой кнопки мыши на форме) тогда первым пунктом добавь что-то типа Name = mnuPopUp, и сними флажок Visible, а все остальные пункты сделай подчиненными данному пункту (вложенными) и вызывай следующим образом


    Sub Form_MouseDown(Button As Integer,Shift As Integer, _
         X As Single,Y As Single)
         if button =2 then
            popupmenu mnuPopup
         end if
    End Sub

    Все события при щелчке на пунктах меню обрабатываются в MenuName_Click

        Сергей Л.



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

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

    Вопросы:


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

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

       Создаю рекордсет, пытаюсь добавить запись - ошибка "Выбранная последовательность сортировки не поддерживается
    операционной системой".

    Cnn_dbf.Provider = "Microsoft.Jet.OLEDB.4.0;Data Source=" & "d:\1" & "; Mode=ReadWrite;Extended Properties=DBase III;Persist Security Info=False"


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

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

       В Excel есть табличка-справочник (поля User, Resurs, ...). И таблица основная, в которой указываются разные юзеры. Надо, чтобы в соседнюю колонку вытаскивался Resurs из справочной таблицы для этого юзера. Какое сочетание встроенных функций использовать?


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

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

       Как послать программе в качастве параметра строку длиннее 300 символов? Например, надо загрузить в WinGroove музыкальный список длиной около 40 песен. Напрямую это сделать не получается - система выдает ошибку из-за слушком большой длины строки.




    Ответы:


    Вопрос:

       Как найти все названия компьютеров в локальной сети?

    Ответ:

    Автор ответа: Хатламаджиян

    Нашел исходник, кажется то, что надо

    Option Explicit
    Declare Function NetMessageBufferSend Lib "netapi32.dll" (ByVal ServerName As String, ByVal MsgName As String, ByVal
    FromName As String, Buf As Any, BufLen As Long) As Long
    Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    Private Type NETRESOURCE
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    lpLocalName As Long
    lpRemoteName As Long
    lpComment As Long
    lpProvider As Long
    End Type
    '------------------------------------------
    Private Type NETRESOURCE_STRING
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    lpLocalName As String
    lpRemoteName As String
    lpComment As String
    lpProvider As String
    End Type
    '------------------------------------------
    Type NetInfo
    dwScope As Long
    dwType As Long
    dwDisplayType As Long
    dwUsage As Long
    LocalName As String
    RemoteName As String
    Comment As String
    Provider As String
    End Type
    '------------------------------------------
    Private Declare Function WNetOpenEnum Lib "mpr.dll" Alias "WNetOpenEnumA" (ByVal dwScope As Long, ByVal dwType As Long,
    ByVal dwUsage As Long, lpNetResource As Any, lphEnum As Long) As Long
    Private Declare Function WNetEnumResource Lib "mpr.dll" Alias "WNetEnumResourceA" (ByVal hEnum As Long, lpcCount As Long,
    ByVal lpBuffer As Long, lpBufferSize As Long) As Long
    Private Declare Function WNetCloseEnum Lib "mpr.dll" (ByVal hEnum As Long) As Long
    '------------------------------------------
    Const RESOURCE_CONTEXT = &H5
    '------------------------------------------
    Private Const RESOURCETYPE_ANY = &H0
    Private Const RESOURCEUSAGE_CONTAINER = &H2
    '------------------------------------------
    Private Const GMEM_FIXED = &H0
    Private Const GMEM_ZEROINIT = &H40
    Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)
    '------------------------------------------
    Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
    Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
    '------------------------------------------
    Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As
    Long)
    Private Declare Function CopyPointer2String Lib "kernel32" Alias "lstrcpyA" (ByVal NewString As String, ByVal OldString
    As Long) As Long
    '------------------------------------------
    Public NI() As NetInfo
    Private NRS As NETRESOURCE_STRING
    Private NR As NETRESOURCE
    '------------------------------------------
    Private Sub FillNRS(Index As Long)
    NRS.dwDisplayType = NI(Index).dwDisplayType
    NRS.dwScope = NI(Index).dwScope
    NRS.dwType = NI(Index).dwType
    NRS.dwUsage = NI(Index).dwUsage
    NRS.lpComment = NI(Index).Comment & Chr$(0)
    NRS.lpLocalName = NI(Index).LocalName & Chr$(0)
    NRS.lpProvider = NI(Index).Provider & Chr$(0)
    NRS.lpRemoteName = NI(Index).RemoteName & Chr$(0)
    End Sub
    '------------------------------------------
    'очистить список компьютеров
    Private Sub ClearNr()
    NR.dwDisplayType = 0&
    NR.dwScope = 0&
    NR.dwType = 0&
    NR.dwUsage = 0&
    NR.lpComment = 0&
    NR.lpLocalName = 0&
    NR.lpProvider = 0&
    NR.lpRemoteName = 0&
    End Sub
    '------------------------------------------
    Private Sub FillInfo(Index As Long)
    NI(Index).dwScope = NR.dwScope
    NI(Index).dwDisplayType = NR.dwDisplayType
    NI(Index).dwType = NR.dwType
    NI(Index).dwUsage = NR.dwUsage
    NI(Index).RemoteName = PointerToString(NR.lpRemoteName)
    NI(Index).LocalName = PointerToString(NR.lpLocalName)
    NI(Index).Comment = PointerToString(NR.lpComment)
    NI(Index).Provider = PointerToString(NR.lpProvider)
    End Sub
    '------------------------------------------
    'обновить список компьютеров
    Sub GetCompName()
    '------------------------------------------------------
    Form1.MousePointer = vbHourglass
    '-------------------------------------------------
    NetEnumLocal
    FillLVNet
    '------------------------------------------------------
    Form1.MousePointer = vbDefault
    '-------------------------------------------------
    End Sub
    '------------------------------------------
    Private Sub NetEnumLocal()
    Dim hEnum As Long, lpBuff As Long
    Dim cbBuff As Long, cCount As Long
    Dim p As Long, res As Long, I As Long
    On Error GoTo ErrorHandler
    ClearNr
    cbBuff = 16384
    cCount = &HFFFFFFFF
    res = WNetOpenEnum(RESOURCE_CONTEXT, RESOURCETYPE_ANY, RESOURCEUSAGE_CONTAINER, NR, hEnum)
    If res = 0 Then
    lpBuff = GlobalAlloc(GPTR, cbBuff)
    res = WNetEnumResource(hEnum, cCount, lpBuff, cbBuff)
    If res = 0 Then
    ReDim NI(cCount)
    p = lpBuff
    For I = 1 To cCount
    CopyMemory NR, ByVal p, LenB(NR)
    FillInfo I
    p = p + LenB(NR)
    Next I
    End If
    ErrorHandler:
    On Error Resume Next
    If lpBuff <> 0 Then GlobalFree (lpBuff)
    WNetCloseEnum (hEnum)
    End If
    End Sub
    '------------------------------------------
    'показать компьютеры
    Private Sub FillLVNet()
    Dim I As Integer
    Dim NetName As String
    Form1.List1.Clear
    On Error GoTo A
    For I = 1 To UBound(NI)
    NetName = StripSlash(NI(I).RemoteName)
    If NetName <> "" Then
    Form1.List1.AddItem NetName
    End If
    Next I
    A:
    End Sub
    '------------------------------------------
    'убираем "\\" перед названием компьютера
    Private Function StripSlash(sName As String) As String
    Dim A As Integer, b As Integer
    Do
    b = A
    A = InStr(A + 1, sName, "\", vbTextCompare)
    Loop While A <> 0
    StripSlash = Mid$(sName, b + 1)
    End Function
    '------------------------------------------
    Private Function PointerToString(p As Long) As String
        Dim s As String
        s = String(255, Chr$(0))
        CopyPointer2String s, p
        PointerToString = Left(s, InStr(s, Chr$(0)) - 1)
    End Function
    '------------------------------------------


    Вопрос:

       Как VB занести машинный код?

    Ответ:

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

    Поищи, на форуме есть ссылка на LASM - вставка ассемблера в VB.
    По сути там вводится строковая константа которая и представляет собой "машинный код".


    Вопрос:

       У кого есть контрол чтобы сделать горячие клавиши вышлите пожалуйста. Или как сделать горячие клавиши без контрола?

    Ответ:

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

    Попробуй API GetAsyncKeyState.


    Вопрос:

       Как сделать чтобы, при нажатии кнопки cmd выполнялись такие действия :
    1. Создание файла Excel с именем Name.
    2. Занесение в ячейку А2 значение переменной тхт1.
    3. Занесение в ячейку А3 значение переменной тхт2.

    Ответ:

    Автор ответа: C...R...a...S...H

    Подключи объект MS Excel 10 или 11.

    Public Sub CreateExcel(xx As Object)
    On Error Resume Next
    Set xx = GetObject(, "Excel.Application")
    If xx Is Nothing Then
    Set xx = CreateObject("Excel.Application")
    End If
    End Sub

    sub XXX()
    Dim ss As Object 'New Excel.Application
    Dim xx As Application
    Dim zz As Workbook
    Call CreateExcel(ss) 'Тут либо создаетсчя новый эксель, либо используется уже открытый
    Set xx = ss.Application
    Set zz = ss.Workbooks.Open("МегаФайл.xls")
    xx.Cells(1, 1) = txt1
    xx.Cells(2, 1) = txt2
    end sub


    Вопрос:

       В чем моя ошибка?

    Private Sub Запись()
    Open App.Path & "\файл" For Append As #1
      With Сервер 'Тип обозначен ранее
       .Имя = txtName.Text
       .Адрес = txtAdress.Text
       .Порт = txtPort.Text
        Write #1, .Имя; .Адрес; .Порт
      End With
    Close #1
    End Sub
      
    Вот, эта функция успешно записывает все данные в файл. Теперь мне надо прочесть данные из файла и разместить это в ListView'е. Делаю я это так:

    Private Sub Чтение()
    Dim i As Long
    Dim DAS As ListItem
    Open App.Path & "\файл" For Input As #2
    i = 1
    Do While Not EOF(2)
      With Сервер
         Set DAS = ListView1.ListItem.Add (.Имя)
         DAS.SubItem(1) = .Адрес
         DAS.SubItem(2) = .Порт
      End With
    i = i + 1
    Loop
    Close #2
    End Sub

    Так вот, проблема заключается в незаполнении ListView. Я не пойму, почему. Может кто-то подскажет

    Ответ:

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

    Private Sub Чтение()
    Dim i As Long
    Dim DAS As ListItem
    Open App.Path & "\файл" For Input As #2
    i = 1
    Do While Not EOF(2)
       With Сервер
          Set DAS = ListView1.ListItem.Add (.Имя)
          DAS.SubItem(1) = .Адрес
          DAS.SubItem(2) = .Порт
       End With
    i = i + 1
    Loop
    Close #2
    End Sub

    Я чего-то оператора

    Input #1, .Имя; .Адрес; .Порт

    не нашел. Где сам процесс считывания? :)



    Ответ:

    Автор ответа: Хатламаджиян

    Private Sub Запись()
    Open App.Path & "\файл" For Append As #1
       With Сервер 'Тип обозначен ранее
        .Имя = txtName.Text
        .Адрес = txtAdress.Text
        .Порт = txtPort.Text

    '-----------------------------------
         Write #1, .Имя; .Адрес; .Порт
    '-----------------------------------
    'если тип Сервер имеет только три поля и в файл записываются только
    'они, то есть другой способ записи данных типа в файл.
    '-----------------------------------
         Put #1, 1, Сервер
    '-----------------------------------
       End With
    Close #1
    End Sub

    Private Sub Чтение()
    Dim i As Long
    Dim DAS As ListItem
    Open App.Path & "\файл" For Input As #2
    i = 1
    Do While Not EOF(2)
    'прежде, чем заносить в ListView, необходимо считать данные из файла
    '--------------------------------
       Get #2, 1, Сервер
    '--------------------------------
       With Сервер
          Set DAS = ListView1.ListItem.Add (.Имя)
          DAS.SubItem(1) = .Адрес
          DAS.SubItem(2) = .Порт
       End With
    i = i + 1
    Loop
    Close #2
    End Sub



    Ответ:

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

    'Ошибки:
    'Во-первых не считал данные из файла
    'Во-вторых при чтении открывал файл как Append, а надо Input.
      
    'Не используй русские имена,VB начинает глючить.
    'Не забудь добавить ListBox1
      
    Private Type Server
         sName As String
         sAdress As String
         sPort As Long
    End Type
    Private Server As Server

    Private Sub Save()
         Open "c:\fff.txt" For Append As #1
         With Server
             .sAdress = "ServerAdress"
             .sName = "ServerName"
             .sPort = 50
             Write #1, .sAdress; .sName; .sPort
         End With
         Close #1
    End Sub

    Private Sub Load()
         Dim i As Long
         Open "c:\fff.txt" For Input As #1
         Do While Not EOF(1)
             With Server
                 Input #1, .sAdress
                 Input #1, .sName
                 Input #1, .sPort
                 ListBox1.AddItem "Adress=" & .sAdress & " Name=" & .sName & " Port=" & .sPort, i
             End With
             i = i + 1
         Loop
         Close #1
    End Sub
      
    Private Sub Form_Load()
         Save
         Load
    End Sub



    Ответ:

    Автор ответа: C...R...a...S...H

    Dim aa As ListItem
    Set aa = ListView1.ListItems.Add
    Dim bb As ListSubItem
    aa.Text = "ads"
    Set bb = aa.ListSubItems.Add
    bb.Text = "adsasd"
    Set bb = aa.ListSubItems.Add
    bb.Text = "ad"



    Ответ:

    Автор ответа: Хатламаджиян

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

    Open <имя_файла> For Random As #<номер> Len = Len(Сервер)

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




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

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

    наверх


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

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

    http://subscribe.ru/
    http://subscribe.ru/feedback/
    Адрес подписки
    Отписаться

    В избранное