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

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


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

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


VBNet VBMania
Ссылки:

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

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

       Это новый выпуск.
    Читайте!


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




    Aslof рекомендует

       Ищешь фильм?
    http://subscribe.ru/catalog/rest.cinema.filmforyou
    Сайт рассылки - http://aslof.balzer.ru/


    Как в VB организовать передачу данных по сети?

    Вопрос:

    Как в VB организовать передачу данных по сети (например, по протоколу TCP/IP)?

    Ответ:

    Воспользуйтесь Microsoft Winsock Control. Как это делать - описывать не буду, потому что информации об этом полно и в MSDN, и в сети. Просто приведу статью из MSDN.

    To create a TCP server

    Create a new Standard EXE project.
    Change the name of the default form to frmServer.
    Change the caption of the form to "TCP Server."
    Draw a Winsock control on the form and change its name to tcpServer.
    Add two TextBox controls to the form. Name the first txtSendData, and the second txtOutput.

    Add the code below to the form.

    Private Sub Form_Load()
    ' Set the LocalPort property to an integer.
    ' Then invoke the Listen method.
    tcpServer.LocalPort = 1001
    tcpServer.Listen
    frmClient.Show ' Show the client form.
    End Sub

    Private Sub tcpServer_ConnectionRequest _
    (ByVal requestID As Long)
    ' Check if the control's State is closed. If not,
    ' close the connection before accepting the new
    ' connection.
    If tcpServer.State <> sckClosed Then _
    tcpServer.Close
    ' Accept the request with the requestID
    ' parameter.
    tcpServer.Accept requestID
    End Sub

    Private Sub txtSendData_Change()
    ' The TextBox control named txtSendData
    ' contains the data to be sent. Whenever the user
    ' types into the textbox, the string is sent
    ' using the SendData method.
    tcpServer.SendData txtSendData.Text
    End Sub

    Private Sub tcpServer_DataArrival _
    (ByVal bytesTotal As Long)
    ' Declare a variable for the incoming data.
    ' Invoke the GetData method and set the Text
    ' property of a TextBox named txtOutput to
    ' the data.
    Dim strData As String
    tcpServer.GetData strData
    txtOutput.Text = strData
    End Sub

    The procedures above create a simple server application. However, to complete the scenario, you must also create a client application.

    To create a TCP client

    Add a new form to the project, and name it frmClient.
    Change the caption of the form to TCP Client.
    Add a Winsock control to the form and name it tcpClient.
    Add two TextBox controls to frmClient. Name the first txtSend, and the second txtOutput.
    Draw a CommandButton control on the form and name it cmdConnect.
    Change the caption of the CommandButton control to Connect.

    Add the code below to the form.
    Important Be sure to change the value of the RemoteHost property to the friendly name of your computer.

    Private Sub Form_Load()
    ' The name of the Winsock control is tcpClient.
    ' Note: to specify a remote host, you can use
    ' either the IP address (ex: "121.111.1.1") or
    ' the computer's "friendly" name, as shown here.
    tcpClient.RemoteHost = "RemoteComputerName"
    tcpClient.RemotePort = 1001
    End Sub

    Private Sub cmdConnect_Click()
    ' Invoke the Connect method to initiate a
    ' connection.
    tcpClient.Connect
    End Sub

    Private Sub txtSendData_Change()
    tcpClient.SendData txtSend.Text
    End Sub

    Private Sub tcpClient_DataArrival _
    (ByVal bytesTotal As Long)
    Dim strData As String
    tcpClient.GetData strData
    txtOutput.Text = strData
    End Sub

    The code above creates a simple client-server application. To try the two together, run the project, and click Connect. Then type text into the txtSendData TextBox on either form, and the same text will appear in the txtOutput TextBox on the other form.

    Sergey Y. Tkachev

    наверх


    Как копировать каталоги и архивированть данные в VB?

    Вопрос:

    Как научить VB копировать каталоги и работать с архиватором.
    Я только начинаю работать с VB и хотел написать программу резервного копирования.

    Ответ:

    Работать с каталогами в VB не просто, а очень просто. Для этого достаточно подключить к проекту библиотеку Microsoft Scripting Runtime (если в списке библиотек, который выпадает при нажатии в меню "Project" пункта "References..." такого названия нет, но надо нажать там же кнопку "Browse" и вручную найти файл c:\windows\system\scrrun.dll).
    После подключения библиотеки в программе можно оперировать переменными типа Folder, File и т.п. Самое главное -- для доступа ко всем этим объектам сначала надо создать объект FileSystemObject :

    '...
    Dim fso As FileSystemObject
    Dim iFolder As Folder
    '...
    Set fso = New FileSystemObject
    Set iFolder = fso.GetFolder("полное_имя_каталога")
    iFolder.Copy "путь_для_резервной_копии"
    '...
    Set iFolder = Nothing
    Set fso = Nothing
    '...

    Вобщем крайне полезная библиотека для работы с объектами файловой системы. Вот с архивированием дело обстоит сложнее. Можно пользоваться предположим консольным архиватором, запуская его с помощью команды Shell из VB или используя API-функции (что в принципе надежнее, но для начала сложновато):

    '...
    Dim filesToArc As String
    '...
    filesToArc = "какой-то_путь" & "*.doc"
    Shell "arj a " & filesToArc & " полное_имя_архива.arj", vbHide
    Параметр vbHide нужен, чтобы не показывать юзеру окно архиватора.

    Есть еще вариант с объявлением внешней функции из dll установленного архиватора, например, WinZip'а, в библиотеке WZ32.DLL которого имеются следующие функции:

    DragAppendFile
    DragCreateFiles
    WZ56
    uncompress
    uncompress_init
    unzip
    unzip_init
    zip
    zip_init
    ziplabelDiskette
    zipmemcompress
    zipsplit
    zipwipeDiskette

    Я так думаю, что функции zip и unzip -- это то, что нужно, но с какими параметрами их запускать, а следовательно и как объявлять их в модуле, я к сожалению не знаю. И еще можно предложить самому написать код для архивирования по известному алгоритму (думаю в И-нете можно довольно просто найти кучу таких алгоритмов с примерами кода)

    Kirill

    наверх


    Как обработать событие от мыши на компоненте, который эти события не поддерживает?

    Вопрос:

    Необходимо обработать событие от мыши, на компоненте, который эти события не поддерживает.
    Например, MaskEdit не имеет события dblClick...
    Как это сделать с использованием API? Или без?

    Ответ:

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

    Самохин Владимир

    наверх


    Как использовать БД Access 2000 в Visual Basic?

    Вопрос:

    Как использовать БД Access 2000 в Visual Basic?

    Ответ:

    Я делаю так: в меню Project|References выбираешь Microsoft DAO 3.6 Object Library. Создаешь в проекте модуль и в нем пишешь следующее:

    Public strSQL As String 'Переменная создания запроса
    Public rs As Recordset 'Переменная результата запроса
    Public DB As Database 'Переменная ссылки на базу данных
    Public ws As Workspace 'Переменная ссылки на рабочую область

    Sub DB_Open() 'Открытие базы данных
    Set ws = DBEngine.Workspaces(0)
    Set DB = ws.OpenDatabase("имя_базы.mdb")
    ws.Databases.Refresh
    End Sub

    Sub DB_Close() 'Закрытие базы данных
    ws.Databases.Refresh
    DB.Close
    ws.Close
    End Sub

    Sub RS_Load() 'Зпрос на чтение
    Set rs = DB.OpenRecordset(strSQL)
    End Sub
    Sub DB_Update() 'Зпрос на добавление, изменение.
    DB.Execute (strSQL)
    End Sub

    Используется так:

    ...
    DB_Open 'произходит открытие и подключение к базе данных
    strSQL="Строка запроса на чтение чего либо из базы"
    RS_Load 'после этого переменная rs будет содержать результат запроса.
    ...
    strSQL="Строка изменения данных или их добавление в базу"
    RS_Update
    ...
    DB_Close 'произходит закрытие и отключение от базы данных
    ...

    Кононенко Роман

    наверх


    Как округлить число в Visual Basic?

    Вопрос:

    Как округлить число в Visual Basic?

    Ответ:

    ROUND (<число>,<кол-в знаков после зпт>)

    DarkAngel

    наверх


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

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

    Вопросы:


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

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

       Пожалуйста, подскажите, как сделать так, чтобы при наложении 5-ти фреймов друг на друга можно было выбрать 1-ый фрейм из окна выбора объектов и наложить на него кнопки, списки и другие элементы управления, не при выполнении самой программы, а в ходе разработки проекта. У меня никак не получается это сделать, поэтому приходится удалять все вышележащие фреймы.


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

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

       Подскажите пожалуйста, почему у меня не открывает и не закрывает CD-ROM? Вроде код программы написан правильно:

    Option Explicit
    Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand _
    As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) _
    As Long
    Dim retval As Long ' возвращаемое значение
    Dim returnstring As Long

    Private Sub Комманда1_Click()
    ' Открываем или закрываем CD-ROM .
    retval = mciSendString("set CDAudio door open", _
    returnstring, 127, 0)
    End Sub

    Private Sub Комманда2_Click()
    'Eсли закрыть,то используем
    retval = mciSendString("set CDAudio door closed", _
    returnstring, 127, 0)
    End Sub


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

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

       Как в VB 6.0 сделать у PictureBox и у контрола AniPicture прозрачным фон?


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

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

       Поправочка к вопросу "Как с помощью VB сфотографировать экран (как PrintScreen)? " в выпуске 227.
      
    1. Private Declare Function GetDestktopWindow Lib "user32" () as Long

        надо исправить на

        Private Declare Function GetDesktopWindow Lib "user32" () as Long

    2. вместо hSrcDC = GetDC(hwndSrc)

         надо написать что-нибудь типа

         hwndSrc = GetDesktopWindow(): hSrcDC = GetDC(hwndSrc)
         или
        hSrcDC = GetDC(GetDesktopWindow())

    3. И уж ежели очень надо "пихать" описания API функций в модуль, то их надо писать как Public, а не Private (я, по крайней мере, получил эти ошибки, при попытке скопировать и запустить код из вашего выпуска).


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

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

       Как ловить нажатия клавы вне программы?


    Автор вопроса: Учебный центр

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

       Есть таблица в Excel (много строк с информацией фамилия, имя отчество, серия и номер паспорта, дата рождения). Эту информацию необходимо вводить в форму (совсем другой программы). Как это реализовать на VB 60?


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

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

       Как с помощью VB сделать OSD дисплей, если можно примерчик. И как можно прочитать свойства ярлыка с помощью VB


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

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

       Подскажите пожалуйста как при использовании DbGrid получить ширину столбца равную ширине текста. данные я получаю так:

      Do While Not Data1.Recordset.EOF
         If CurentProdCode = Data1.Recordset.Fields(0) Then
          Data1.Recordset.Edit
         ' Data1.Recordset.Fields(0) = Mid(Trim(a), 1, 8)'
          Data1.Recordset.Fields(1) = Mid(Trim(Combo1.Text), 1, 200) '
          Data1.Recordset.Fields(2) = Mid(Trim(Text1(0).Text), 1, 255) '
          Data1.Recordset.Fields(3) = Mid(Trim(Text1(1).Text), 1, 255) '
          Data1.Recordset.Fields(4) = Mid(Trim(Text1(2).Text), 1, 255) '
          Data1.Recordset.Fields(5) = Mid(Trim(Text1(3).Text), 1, 255) '
          Data1.Recordset.Fields(6) = Mid(Trim(Text1(4).Text), 1, 200) '
          Data1.Recordset.Fields(7) = Mid(Trim(Text1(5).Text), 1, 200) '
          Data1.Recordset.Fields(8) = Mid(Trim(Text1(6).Text), 1, 200) '
          Data1.Recordset.Fields(9) = Mid(Trim(Text1(7).Text), 1, 200) '
          Data1.Recordset.Fields(10) = Mid(Trim(Text1(8).Text), 1, 200) '
      
          Data1.Recordset.Update
      Exit Do
         End If
         Data1.Recordset.MoveNext
       Loop

    А дальше не знаю?


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

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

       Подскажите кто что может.
    Функция FindWindow находит все окна, которые даже не видны в диспетчере задач.
    А есть ли такая функция (комбинация функций), которая бы реагировала только на те окна, которые видны в диспетчере задач.


    Автор вопроса: Катерина

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

       Где я могу найти объектно-ориентированную модель программы Сапёр распечатанную в Rational Rose?


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

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

       Как отправить файл через инет с помощью WinSock, зная IP?


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

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

       Подскажите, почему когда я вешаю на элементы TreeView иконки, с помощью ImageList, они не отображаются у меня в ходе выполнения.




    Ответы:


    Вопрос:

       Что такое и как использовать файлы *.dll в VB?

    Ответ:

    Автор ответа: Артем Кривокрисенко

    DLL - это, если не изменяет память, сокращенно от Dinamic Link Library
    - библиотека динамического связывания.

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

    Например, есть такая библиотека gdi32.dll, которая входит в состав
    _любых_ виндов. В ней находятся огромное количество функций, которые
    служат для работы с GDI (Graphic Device Interface - Графический
    интерфейс устройств), то есть, для работы с графикой - рисования
    линий, точек, кривых, прямоугольников, многоугольников и других фигур.
    Ты, например, нажимаешь кнопку Пуск - а винда вызывает десятки и сотни
    таких функций, чтоб это красивое меню нарисовать.

    Таких библиотек в Windows огромное количество. Вызывать их может не
    только операционная система, но и сами программы.

    Библиотеки типа gdi32.dll являются статитическими - вызывать их
    функции можно, предварительно их объявив, например, так:

    Public Declare Function FillRect Lib "user32" Alias "FillRect" _
    (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long

    Теперь эта функция доступна в твоей программе. Найти огромное
    количество объявлений можно в программе Api Text Viewer - она
    поставляется вместе с VB6.

    Есть еще динамические библиотеки - они работают на технологии COM - их
    нужно подключать к программе. Для этого выбери Project - Reference и
    отметь галочкой нужную библиотеку.

    Можно самому создавать ActiveX библиотеки - в окне New Project выбери
    соответствующий тип.

    Еще есть .NET библиотеки - они несовместимы COM, но могут работать
    через Com Interrop

    Рекомендую почитать MSDN - там ты сможешь найти ответы на все вопросы,
    или спрашивай.


    Вопрос:

       У меня с помощью команды Shell не открывается файл на сервере в папке с именем из двух слов (Слово1 Слово2). Выдается 2 сообщения: "Не могу найти файл G:/Слово1" и "Не могу найти файл Слово2/Мой_Файл.exe". Папку переименовать нельзя. Посоветуйте, как справиться с этой проблемой.

    Ответ:

    Автор ответа: Артем Кривокрисенко

    Подозреваю, что надо заключить сам путь в кавычки, например:

    Shell """C:\Program Files\Microsoft Office\winword.exe"""


    Вопрос:

       Как сделать демо версию?

    Ответ:

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

    Лучше всего сделать сборку, в которой отсутствуют куски кода. Потому что
    если сделать полную версию и просто запретить выполнение некоторых
    функций, то её можно декомпилировать или взломать каким-либо другим
    способом и просто снять защиту. А когда куски кода просто отсутствуют -
    тогда и взламывать будет нечего.



    Ответ:

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

    Обрезаешь некоторые функции. Код комментируешь знаком ' , а вместо него пишешь:

    msgbox "Данная функция недоступна в демо версии"
      


    Вопрос:

       Что есть Controls и зачем они такие?

    Ответ:

    Автор ответа: Данила

    Это кусок кода, который, в основном, реализует какую-нибудь часть графического интерфейса. Кнопка или текстовое поле являются контролами. Если тебя не устраивают стандартные контролы (т.е. то, что можно натянуть на форму), то можешь написать свои.


    Вопрос:

       Такая ситуация: нужно определить версию Windows, а именно NT это или нет. (это нужно для того, чтобы можно было включать или отключать управление прозрачностью окон).
    Если система, под которой работает программа NT, то

    Check1.Enabled = True

    если нет (не NT), то Check1.Enabled = False
    Подскажите пожалуйста, как всё это сделать.

    Ответ:

    Автор ответа: Сан Саныч

    Private Type OSVERSIONINFO
         dwOSVersionInfoSize As Long
         dwMajorVersion As Long
         dwMinorVersion As Long
         dwBuildNumber As Long
         dwPlatformId As Long
         szCSDVersion As String * 128 ' Maintenance string for PSS usage
    End Type
    Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (lpVersionInformation As OSVERSIONINFO) As Long

    Public Function WinNT() As Boolean
    Dim lpOSInfo As OSVERSIONINFO
         lpOSInfo.dwOSVersionInfoSize = 148
         Call GetVersionEx(lpOSInfo)
         WinNT = (lpOSInfo.dwPlatformId > 1)
    End Function



    Ответ:

    Автор ответа: Роман

    Вот это вставить в модуль:

    Option Explicit
    Private Declare Function GetVersionEx _
        Lib "Kernel32" Alias "GetVersionExA" _
        (lpVersionInformation As OSVERSIONINFO) As Long
    Private Type OSVERSIONINFO 'for GetVersionEx API call
         dwOSVersionInfoSize As Long
         dwMajorVersion As Long
         dwMinorVersion As Long
         dwBuildNumber As Long
         dwPlatformId As Long
         szCSDVersion As String * 128
    End Type

    Const dwMask95 = &H1&
    Const dwMaskNT = &H2&

    Public Function IsWin95() As Boolean
             IsWin95 = (GetOsInfo() And dwMask95)
    End Function

    Public Function IsWinNT() As Boolean
             IsWinNT = (GetOsInfo() And dwMaskNT)
    End Function

    Public Function GetOsInfo() As Long
         Dim osvi As OSVERSIONINFO

         osvi.dwOSVersionInfoSize = Len(osvi)
         If GetVersionEx(osvi) = 0 Then
             Exit Function
         End If

         GetOsInfo = osvi.dwPlatformId
    End Function

    Используете функцию IsWinNT, если True, тогда используете прозрачность. Обратите внимание на тип OSVERSIONINFO.

    Использование прозрачности:
    Функция SetLayeredWindowAttributes работает в 2000-м и ХР, поэтому нужно проверять, чтобы OSVERSIONINFO.dwMajorVersion было не меньше 5-ти.

    Const LWA_COLORKEY = &H1
    Const LWA_ALPHA = &H2
    Const GWL_EXstyle="(-20)"
    Const WS_EX_LAYERED = &H80000
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
    Private Sub Form_Load()
         'KPD-Team 2000
         'URL: http://www.allapi.net/
         'E-Mail: KPDTeam@Allapi.net
         Dim Ret As Long
         'Set the window style to 'Layered'
         Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
         Ret = Ret Or WS_EX_LAYERED
         SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
         'Set the opacity of the layered window to 128
         SetLayeredWindowAttributes Me.hWnd, 0, 128, LWA_ALPHA
    End Sub


    Вопрос:

       Пример:
    Создан инсталяционный пакет при помощи P&D Wizard.
    Запуск и копирование файлов происходит нормально, но когда начинается регистрация библиотек, возникает ошибка:

    The file 'C:\Temp\msftqws.pdw\$(DllSelfRegisterEx)' could not be
    registered because it was not found.

    У меня система: WinXP Home EN SP2 v.1204 Licensed
    VB Enterprise 6 SP5 Licensed

    Помогите решить проблему.
    Кстати говоря инсталятор даёт ошибку на всех машинах.

    Ответ:

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

    Вообще лучше не пользоваться встроенным установщиком VB. Есть такая
    хорошая программа, называется Inno Setup. Бесплатная, имеет кучу всяких
    настроек. Адрес: http://www.jrsoftware.org.
    Ещё одна альтернатива - Nullsoft Installation System (тот самый
    установщик, который устанавливает Winamp). Имеет раз в десять больше
    настроек, чем Inno Setup, но скрипт довольно труден для понимания.
    Обе программы для создания установочных файлов используют собственные
    скриптовые языки.



    Ответ:

    Автор ответа: Данила

    Выброси эту дрянь и воспользуйся чем-нибудь специализированным. А лучше упаковывай всё в архив.




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

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

    наверх


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

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


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное