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

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


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

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


VBNet VBMania
Ссылки:

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

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

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


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




    Как побайтно скопировать содержимое Image в другой Image?

    Вопрос:

    Подскажите, как считать по-байтно содержимое объекта Image и записать скажем в строкрвую переменную, а затем произвести обратную операцию (в другой Image)?

    Ответ:

    А вообще скопировать данные битмапа в буфер можно такими функциями:

    GetBitmapBits (устаревшая). Вместо нее лучше использовать
    GetDIBits

    Записать данные из буфера в битмап:
    SetBitmapBits (устаревшая). Лучше использовать
    SetDIBits

    Думаю, не нужно говорить, что это - API.

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

    наверх


    Как сделать полную выгрузку формы

    Вопрос:

    Как сделать полную выгрузку формы.
    Например:

    form2.show vbmodal

    и выход из формы делается так:

    set form2=nothing
    unload me

    И если еще раз запустить эту форму некоторые переменные, рисунки остаются прежними которые были в прошлом запуске и измененные пееременные тоже не признаёт. Вопрос: как сделать полную выгрузку формы?

    Ответ:

    lngTemp=DestrotWindow(form1.hwnd)
    unload form1

    Последняя строка нужна для того, чтоб Бейсик понял, что форма выгружена. Ведь после того, как мы разрушаем форму, VB вроде об этом не знает.

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

    наверх


    Как вывести список расшаренных ресурсов?

    Вопрос:

    Как в локальной сети на расшареном ресурсе вывести в Лист список папок, а в другой их содержимое.

    Ответ:

    Если ты заранее знаешь имя расшаренного ресурса, например \\COMP\DIR (COMP - имя компа в сети, DIR - имя расшаренной папки) то делаешь так: кидаешь на форму стандартные элементы DirListBox и FileListBox, по событию Change для DirListBox'а пишешь:

    Me.FileListBox.Path = Me.DirListBox.Path Все, теперь тебе нужно только установить свойство

    Me.DirListBox.Path = "\\COMP\DIR"

        DedMorozzz

    наверх


    Как установить координаты (0;0) в центре формы?

    Вопрос:

    Как установить координаты (0;0) в центре формы?

    Ответ:

    Это делают АПИ-функции:

    GetMapMode
    GetViewportExtEx
    GetViewportOrgEx
    GetWindowExtEx
    GetWindowOrgEx
    SetMapMode
    SetViewportExtEx
    SetViewportOrgEx
    SetWindowExtEx
    SetWindowOrgEx
    и прочие из темы "Coordinate Space and Transformation Functions"

        Мартынов Сергей

    frmmain.scale (-100,-100)-(100,100)

    Хотя, может, скобки и не нужны

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

    наверх


    Как минимизировать форму?

    Вопрос:

    На форме есть кнопка Command1, при нажатии на которую нужно свернуть форму. Как это сделать просто?

    Ответ:

    Private Sub Command1_Click()
        Me.WindowState = vbMinimized
    End Sub

        Рязанов Андрей

    наверх


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

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

    Вопросы:


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

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

       Есть MDI форма, на ней панель инструментов.
    Есть MDI child, на ней тоже есть панель инструментов.
    Задача обычная: при загрузке дочерней формы надо отобразить обе панели инструментов в родительской форме.
    Сделал как написано в MSDN. установил в род. форме NegotiateToolbar=true.
    Но всё равно тулбары отображаются каждый на своей форме. Если развернуть дочернюю форму, то между тулбаром чилда и тулбаром родителя появляется какой-то промежуток, наверное на толщину бордера формы.
    Причём абсолютно независимо от того какое значение NegotiateToolbar, NegotiateMenu всё остаётся на своих местах.
      
    Что ещё необходимо сделать, чтобы всё было как в нормальных MDI интерфейсах?


    Автор вопроса: Олег

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

       Как заблокировать клавишу Winkey? Если точнее, то мне надо, чтобы не
    появлялось меню Пуск. У меня Windows Xp Professional.


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

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

       Как удалять полностью разделы из файла ini?


    Автор вопроса: Кирилл Глуховченко

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

       Каким образом можно осуществить поиск по записям данных, по определённому признаку?


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

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

       Как в DataReport изменить толщину линии?


    Автор вопроса: Шурик

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

       Как сохранить в файл из коллекции или обьекта, чтобы можно было потом обратно загружать в обьект или в коллекцию?


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

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

       При создании программы AUTORUN, использую .ocx, без него никак. Как можно этот файл из OLE контейнера скопировать в нужное место? Или вытащив его из ресурса программы проделать то же самое.


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

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

       Можно ли в VB6 / VB .net работать с базой MySQL?


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

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

       На форме 2 елемента Line: Line1 и Line2.
    Надо узнать точку их пересечения.


    Автор вопроса: Шайкин Олег

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

       Никак не могу найти Анализер от VS .NET. Значки от него есть, а самого нет. Кто-нибудь знает, как его поставить?


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

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

       Пишу на VB6, т.к. не разобрался как там создавать (а именно подключать) отчёты, использую Crystal Reports из VB5.
    Необходимо выводить на печать одну запись БД на один лист (запись имеет порядка 50 полей). Может существует более удобный инструмент для реализации этого? (не огромных розмеров - чтобы можно было скачать). И может кто располагает описанием мотодов и свойств этого Crystal Reports из VB5.


    Автор вопроса: Ale)(ey

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

       Как получить имя удаленного пользователя (залогиненного), зная его ip или имя компьютера?


    Автор вопроса: @nton

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

       Как написать на VB заставку (скринсейвер)?




    Ответы:


    Вопрос:

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

    Ответ:

    Автор ответа: Yuri Samsonov

    Я использую ShellExecute. Она открывает ассоциированный файл.
    Пример:
      
    (это в модуль)
    Public Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
      
    (это в форму)
    N_file = File1.Path & "\" & File1.FileName
    ShellExecute 0&, "Open", N_file, "", vbNullString, 1

    N_file - строковая переменная
    File1 - элемент FileList, т.е. File1.Path - путь файла, который открываю,File1.FileName - его имя.


    Вопрос:

       Пример:
    Создан инсталяционный пакет при помощи 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

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

    Ответ:

    Автор ответа: Yuri Samsonov

    Не могу сказать конкретно про этот файл, но уже давно убедился: P&D Wizard работает с жуткими глюками. У меня он вообще половину библиотек и связей не тянул в инсталляху. Я пользуюсь Visual Studio Installer. Делает все "на 5"! Еще ни разу не подвел.


    Вопрос:

       Скажите как прочитать файл в переменную за один раз (VB 6) без использование FSO.

    Ответ:

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

    Dim z As String
    Open Файл For Binary As #1 'открыть файл как бинарный
         z = Space(LOF(1)) 'количество считываемых байт, в данном случае все
          Get #1, , z 'чтение
    Close #1 'закрыть файл



    Ответ:

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

    dim str as string
    open "c:\1.txt" for binary as #1
    str=space(LOF(#1))
    get #1,,str
    close #1



    Ответ:

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

    Dim BinDat() As Byte
    Open _файл_ For Binary As #1
    Get #1,,BinDat()
    Close #1



    Ответ:

    Автор ответа: Андрей Гончаров

    Open "c:\autoexec.bat" For Input As #1
        MyVARIABLE = Input(LOF(1), 1)
    Close #1



    Ответ:

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

    Dim FN As Integer
    FN = FreeFile
    Dim FName As String
    FName = "C:\file.txt"
    'открыть файл
    Open FName For Input As #FN
    'присвоить переменной содержимое файла
    all_file = Input(LOF(FN), #FN) ' или LOF(FN)-1, у меня некоторые
    файлы только так шли
    'закрыть файл
    Close #FN


    Вопрос:

       На моем счету уже с десяток, если не больше, программ написанных на VB. По этому уже давно подумываю, как и мои друзья (даааа… не перевелись еще програмеры на матушке Руси!!!) защитить права на авторство своих программ или зарегистрировать свою торговую марку или компанию или команду или четам еще есть. Подскажите, где это можно сделать (вернее, где в Инете можно сделать), сколько это будет стоить и т.п.

    Ответ:

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

    Посмотри на copyright.ru.



    Ответ:

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

    Если напишете что-то полезное, то это все равно взломают.
    И вообще, мы за бесплатное ПО.



    Ответ:

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

    Геморное это дело.
    Во первых, чтобы претендовать на авторство, тебе придёться очень повозиться. Дело в том, что товарищи которые этим занимаються принимают программы, оформленные строго по ГОСТу. ГОСТ называется ЕСПД. Не слышал? :) Таким вот образом прграмма типа "хелло ворлд", занимает порядка 10 стр.


    Вопрос:

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

    Прим. ред.: видимо, имелась в виду градиентная заливка :)

    Ответ:

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

    For i = 1 To 20
    Picture1.Line _
    (0, 0 + i)-(100 - 1, 100 + i), RGB(начальный_красный + i, начальный_зелёный + i, начальный_синий + i)
    Next i



    Ответ:

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

    Создать фон с плавным переходом из синего в черный

    Код, приведенный ниже, рисует фон тонкими полосками оттенков синего - от светлого до темного. Самое сложное - добиться плавного перехода не только в режиме 256 цветов, но и при 16-и и 32-разрядном представлении цвета. Метод Line в Visual Basic не позволяет прочерчивать прямые линии составным цветом, но разрешает заполнить таким цветом прямоугольники. При этом свойство DrawStyle формы надо установить как vbInvisible, а ее сво-во ScaleMode-как vbPixels. Свойство DrawStyle определяет стиль линий. Значение vbPixels свойства ScaleMode позволяет вычислять размеры прямоугольника в пикселях, избегая ошибок округления; благодаря этому прямоугольники распологаются точно один под другим - без зазоров и наложения.

    Option Explicit

    Private Sub Form_Paint()
    Dim x As Long
    Dim height As Long
    Dim width As Long
    ScaleMode = vbPixels
    height = ScaleHeight
    width = ScaleWidth
    Drawstyle="vbInvisible"
    Fillstyle="vbFSSolid"
    For x = 0 To height
    FillColor = RGB(0, 0, 255 - (x * 255) \ height)
    Form1.Line (-1, x - 1)-(width, x + 1), , B
    Next x
    End Sub

    Эта процедура заполняет форму любого размера оттенками синего. Для полноты впечатления растяните форму на весь экран, указав в ее свойстве BorderStyle значение 0-None, а свойство WindowState - значение 2-Maximazed.



    Ответ:

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

    Чтобы сделать градиент, можно использовать цикл:

    Dim x As Long
    Dim y As Long
    Do While x / 2 < Picture1.ScaleWidth Or y / 2 < Picture1.ScaleHeight
       x = x + 1
       y = y + 1
       Picture1.Line (0, y)-(x, 0), RGB(0, 0, x)
    Loop


    Вопрос:

       Как при помощи win api, зная hwnd окон, изменить содержание текстового поля, или нажать на кнопку программно?

    Ответ:

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

    Option Explicit
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
    Private Declare Function SetWindowText Lib "user32" Alias "SetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String) As Long

    Private Sub Command1_Click()
         Dim hwnd As Long
         hwnd = FindWindowEx(hwnd, 0&, "_класс_окна_текстбокса_", vbNullString)
         SetWindowText hwnd, "Привет, Борис!"
    End Sub

    Кладешь на форму кнопку, пишешь этот код.
    "Хэндлы" и "классы" можно узнать через программу Spy++, которая входит в состав Visual Studio.
    В примере уже известен хэндл формы, поэтому сразу ищем хэндл текстбокса. Если бы на форме был контейнер, а в нем текстбокс, тогда сначала нужно было бы искать хэндл контейнера:

    hwnd = FindWindowEx(hwnd, 0&, "_класс_окна_контейнера_", vbNullString)

    Если неизвестен хендл окна, то так:

    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    hwnd = FindWindow (vbNullString, "_заголовок_формы_")

    Наверное, еще можно посылать сообщение, узнав хендл, с помощью функции SendMessage, но у меня не получилось.



    Ответ:

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

    Используй API:

    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

    или

    Public Declare Function SendDlgItemMessage Lib "user32" Alias "SendDlgItemMessageA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

    ещё понадобится:

    Public Declare Function GetDlgItem Lib "user32" Alias "GetDlgItem" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long

    для получения HWND кнопки (или чего там?)


    Вопрос:

       Приведите пример создания ссылки в реестре.
    Например:

    "HKEY_LOCAL_MACHINE\SYSTEM\software\counter"
    строковый параметр "count"
    значение "10"

    Ответ:

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

    Вот полный листинг кода формы с кнопкой:
       
    Option Explicit

    Private Const HKEY_LOCAL_MACHINE = &H80000002
    Private Const REG_OPTION_NON_VOLATILE = 0
    Private Const KEY_ALL_ACCESS = &HF003F

    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" _
    (ByVal hKey As Long, ByVal lpSubKey As String, ByVal Reserved As Long, _
    ByVal lpClass As String, ByVal dwOptions As Long, ByVal samDesired As Long, _
    ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, phkResult As Long, _
    lpdwDisposition As Long) As Long
    Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" _
    (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, _
    ByVal dwType As Long, ByVal lpData As Any, ByVal cbData As Long) As Long

    Private Type SECURITY_ATTRIBUTES
             nLength As Long
             lpSecurityDescriptor As Long
             bInheritHandle As Long
    End Type

    Private Enum RegTypes
    RegNonee = 0
    RegSZ = 1
    RegExpandSz = 2
    RegBinary = 3
    RegDword = 4
    RegDwordLittleEndian = 4
    RegDwordBigEndian = 5
    RegLink = 6
    RegMultiSz = 7
    RegResourceList = 8
    RegFulResourceDesc = 9
    End Enum

    Private Function RegSetValueSave(Root As Long, SubKey As String, Key As String, _
    value As String) As Boolean
         Dim hKey As Long
         Dim sa As SECURITY_ATTRIBUTES
         Dim nDisp As Long
         RegSetValueSave = False
         If Not RegCreateKeyEx(Root, SubKey, 0, vbNullString, REG_OPTION_NON_VOLATILE, _
         KEY_ALL_ACCESS, sa, hKey, nDisp) Then
             If RegSetValueEx(hKey, Key, 0, RegSZ, value, Len(value) + 1) = 0 Then RegSetValueSave = True
             RegCloseKey hKey
         End If
    End Function

    Private Sub Command1_Click()
    Dim bUser As Boolean
    bUser = RegSetValueSave(HKEY_LOCAL_MACHINE, "SYSTEM\software\counter", "count", "10")
    End Sub


    Вопрос:

       Функция RND при каждом запуске генерирует одну и туже последовательность. Как сделать, что бы она генерировалась по-разному?

    Ответ:

    Автор ответа: Пащенко А.

    До первого вызова RND используй оператор:

    Randomize Timer



    Ответ:

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

    Например, так:

    Rnd(Minute(Time) * Second(Time))



    Ответ:

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

    Функция Rnd возвращает значение, меньшее 1 и большее или равное нулю.
    Аргумент число определяет способ генерации случайного числа функцией Rnd:
    При использовании одинаковых опорных чисел получаются одинаковые последовательности случайных чисел, поскольку при генерации каждого следующего члена последовательности используется предыдущий член.
    Перед вызовом функции Rnd используйте инструкцию Randomize без аргумента для инициализации генератора случайных чисел значением, возвращаемым системным таймером.
    Ниже приведена формула, предназначенная для получения случайных целых чисел в заданном диапазоне:

    Int((верхняяГраница - нижняяГраница+ 1) * Rnd + нижняяГраница)

    Здесь верхняяГраница представляет максимальное число в диапазоне, а нижняяГраница минимальное число в диапазоне.
    Примечание. Для повторения последовательности случайных чисел следует вызвать функцию Rnd с отрицательным аргументом сразу после использования инструкции Randomize с числовым аргументом. Повторное использование инструкции Randomize с тем же числовым аргументом не приведет к повторению предыдущей последовательности случайных чисел.

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


    Вопрос:

       Как сохранить файл, который является ресурсом в моей программе, на диск?

    Ответ:

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

    Dim a() As Byte
    a()=LoadResData(101,1)
    open "c:\1.txt" for binary as #1
    put #1,,a()
    close #1


    Вопрос:

       Приходится пользоваться CommonDialog для вызова матрицы цветовой палитры, но мне нужны цвета в формате “Hex”. Проблема состоит в том, что цвет, переведенный в Hex, не соответствует истинному цвету, выбранному с помощью предлагаемой цветовой матрицы. Подскажите, как правильно перевести цвет в Hex. Можно ли воспользоваться другими цветовыми матрицами, если да то какими (и как)? Как можно выбрать цвет наведением курсора на любой объект, как принадлежащий данному приложению, так и вне него? Если можно приведите пример. Надеюсь на помощь…

    Ответ:

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

    Function RGBtoHex(lRGBcolor As Long) As String
    Dim strHex As String
    strHex = Hex(lRGBcolor)
    Do Until Len(strHex) >= 6
    strHex = "0" & strHex
    Loop
    RGBtoHex = strHex
    End Function


    Вопрос:

       Возможно, ли в текстовом поле предлагать вариант написания, как это делает VB?

    Ответ:

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

    Можно, но это такой геморрой.
    Вот примерный код, но он, скорее всего не работает, ну кто его знает...
    List1 - содержит все варианты

    Public sub text1_change(…)
    Dim I as integer
    Dim Остаток as string
    For i=0 to list1.listcount
    If instr(1,text1,list1.list(i)) then
    Остаток=right(list1.list(i), len(list1.list(i))-instr(1,text1,list1.list(i))) 'Тут должна быть строка, которую мы предлагаем в роли окончания
    Exit for
    End if
    Next i
    Dim IndexLastChar as integer
    IndexLastChar=len(text1.text)' Количество символов введенных пользователем
    Text1.text=text1.text+остаток
    Text1.selstart= IndexLastChar
    Text1. sellength =len(остаток)
    End sub


    Вопрос:

       Как определить путь к папкам Windows, System, System32, Fonts?

    Ответ:

    Автор ответа: Пащенко А.

    Функция Environ возвращает значение переменной окружения, например:

    Environ("systemroot") 'системная папка Windows


    Вопрос:

       Нужно вывести все шрифты из папки Fonts в ComboBox, подобно тому, как это делает добрый старина Word, и заблокировать кнопку (Enabled = False), отвечающую за жирный шрифт, если выбранный шрифт этого не поддерживает.

    Ответ:

    Автор ответа: Иванченко Максим

    Получение списка шрифтов:

    Dim i As Integer
    For i = 0 To Screen.FontCount - 1
        Combo1.AddItem Screen.Fonts(i)
    Next




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

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

    наверх


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

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


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

    В избранное