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


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

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



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

Ссылки:

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

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

       Наконец-то в график укладываться начал :)
    Читайте!


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




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

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


    Как открыть засосавшийся лоток привода?

    Вопрос:

    Иногда, Windows XP, после записи компакт диска в Проводнике, лоток привода засасывает. Раньше приходилось перегружать систему, но потом обнаружил что если засосало, то для выбрасывания привода можно воспользоваться NERO. Решил написать для себя маленькую прогу, которая, естественно, использует функцию API mciSendString и поместить ее в панель быстрого запуска.

    Сказано: сделано! Но вот после очередного засасывания, моя прога не помогла, пришлось опять воспользоваться NERO

    Вот и вопрос, какими средствами это делает NERO? Ясно что не mciSendString.

    Ответ:

    Public Declare Function DeviceIoControl Lib "kernel32" Alias
    "DeviceIoControl" (ByVal hDevice As Long, ByVal dwIoControlCode As Long,
    lpInBuffer As Any, ByVal nInBufferSize As Long, lpOutBuffer As Any, ByVal
    nOutBufferSize As Long, lpBytesReturned As Long, lpOverlapped As
    OVERLAPPED) As Long


    hDevice можно получить из CreateFile с параметром вроде "\\.\E:" (если у вас CD-Rom - E: и т.д.).

    Ещё нужна константа
    Const IOCTL_STORAGE_MEDIA_REMOVAL = &H2D4804
    и тип
    Type PREVENT_MEDIA_REMOVAL
         PreventRemoval As Boolean
    End Type

    Dim Prevent As PREVENT_MEDIA_REMOVAL
    Dim BytesReturned As Long

    'Затем вы устанавливаете Prevent.PreventRemoval в True - разрешить
    'извлечение.

    'И вызываете собственно функцию:

    DeviceIoControl hDevice, IOCTL_STORAGE_MEDIA_REMOVAL, Prevent,
    Len(Prevent), ByVal 0&, 0, BytesReturned, ByVal 0&


    Кстати, под 98-ми etc., может быть код
    Const IOCTL_MEDIA_REMOVAL = &H74804
    Но тут точно не знаю.

    И eject'ить тоже можно через DeviceIOControl.

        Andrey Shchekin

    наверх


    Как в Access организовать выборку по полю?

    Вопрос:

    Написал программулю, которая работает с базой данных на Access'е. Все работает, выборки проходят нормально, но я споткнулся на том, как сделать выборку по полю, формат которого "Дата"

    Если просто в апострофах брать '01.02.2002' - не проходит (несоответствие типов)

    Пробовал SQL'вельную функцию To_Date('01.02.2002',dd.mm.yyyy),
    говорит, что не знает такую функцию

    Ответ:

    Дату надо заключать в решётки (#)
    А чтобы гарантировано прошло преобразование передавать её в американском формате #mm/dd/yyyy#

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

    наверх


    Как сделать участки, имеющие определенный цвет, прозрачными?

    Вопрос:

    У меня на форме есть участки с определенным цветом. Как сделать участки, имеющие этот цвет, прозрачными?

    Ответ:

    Если VB .NET, то можно указывать цвет точки не только R, G и B компоненты, но и альфа-канал (уровень прозрачности в процентах).

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

    Через картинку. Других не знаю.
    Картинку ты всегда можешь подогнать под свою форму. Создай BMP в которой закрась определенным цветом те участки, которые ты хочешь изничтожить (или наоборот).

    Написал маленький пример для упрощения (см файл "Вырезать форму.zip"

        Аваков Дмитрий Александрович

    наверх


    Как сделать запрос с исключением?

    Вопрос:

    Можно в селекте исключить повторяющиеся записи по какому-нибудь полю?

    Скажем у меня есть несколько записей содержащих одинаковое значение в поле Field1. Мне нужно только значение этого поля, которое я добавлю в список на форме. Хочу отсечь повторения на уровне запроса.

    Ответ:

    Select field1 From YouTable Group By field1

        Paponov Igor

    Вот нормальный рабочий запрос:

    select distinct [ParentID] from [CodeItems]

        DmitryK1

    наверх


    Как побороть проблемы с кодировкой текста в приложении на VB, использующим БД MS Access?

    Вопрос:

      Ситуация. Моё приложение на VB 6 использует файл Access 2000. В полях таблицы этого файла, имеющих тип Text, я без проблем пишу по-русски (весь "офис" у меня с русской поддержкой). Но при "вытаскивании" содержимого этих полей в TextBox'ы приложения получаю лишь набор ?????.
      На машине у меня windows 98 (английский). Помогите разобраться в причине проблемы.

    Ответ:

    По всей видимости, проблема в шрифте TextBox'а. Попробуйте в явном виде задать для него "Кириличный" шрифт, например Courier New Cyr.

    VMJ

    наверх


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

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

    Вопросы:


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

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

       Как из VB запустить какую-либо программу (Excel, Word и др.)?


    Автор вопроса: •Creator•

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

       У кого-нибудь есть контрол для декодирования музыки с компакта в MP3?


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

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

       Есть .ехе с MDI-окном, к ней подкрепляется .dll'ка которая содержит репорты. Как репорты сделать дочерними по отношению .ехе MDI окна? Установка свойства MDIChild у репорта не проходит, выдается 336 ошибка.


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

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

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


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

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

       Может быть кто знает как обрабатывать параллельный порт (LPT) средствами Vb? Или,если уже есть где-то такие программы, может подскажете ссылку. Интересует опрос порта и запись в него.




    Ответы:


    Вопрос:

       Подскажите, пожалуйста, как узнать список всех подразделов и параметров реестра определенной ветви.

    Ответ:

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

    Проще создай bas-файл registry и используй его в прогах обычным добавленим модуля:
      
    Public Const HKEY_CLASSES_ROOT = &H80000000
    Public Const HKEY_CURRENT_USER = &H80000001
    Public Const HKEY_LOCAL_MACHINE = &H80000002
    Public Const HKEY_USERS = &H80000003
    Public Const HKEY_PERFORMANCE_DATA = &H80000004
    Public Const ERROR_SUCCESS = 0&
      
    ' Registry API prototypes
      
    Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey As String) As Long
    Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
    Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
    Public Const REG_SZ = 1 ' Unicode nul terminated string
    Public Const REG_DWORD = 4 ' 32-bit number
      
    Public Sub savekey(hKey As Long, strPath As String)
    Dim keyhand&
    r = RegCreateKey(hKey, strPath, keyhand&)
    r = RegCloseKey(keyhand&)
    End Sub
      
    Public Function getstring(hKey As Long, strPath As String, strValue As String)
      
    Dim keyhand As Long
    Dim datatype As Long
    Dim lResult As Long
    Dim strBuf As String
    Dim lDataBufSize As Long
    Dim intZeroPos As Integer
    r = RegOpenKey(hKey, strPath, keyhand)
    lResult = RegQueryValueEx(keyhand, strValue, 0&, lValueType, ByVal 0&, lDataBufSize)
    If lValueType = REG_SZ Then
         strBuf = String(lDataBufSize, " ")
         lResult = RegQueryValueEx(keyhand, strValue, 0&, 0&, ByVal strBuf, lDataBufSize)
         If lResult = ERROR_SUCCESS Then
             intZeroPos = InStr(strBuf, Chr$(0))
             If intZeroPos > 0 Then
                 getstring = Left$(strBuf, intZeroPos - 1)
             Else
                 getstring = strBuf
             End If
         End If
    End If
    RegCloseKey keyhand
    End Function
      

    Public Sub savestring(hKey As Long, strPath As String, strValue As String, strdata As String)
    Dim keyhand As Long
    Dim r As Long
    r = RegCreateKey(hKey, strPath, keyhand)
    r = RegSetValueEx(keyhand, strValue, 0, REG_SZ, ByVal strdata, Len(strdata))
    r = RegCloseKey(keyhand)
    End Sub
      

    Function getdword(ByVal hKey As Long, ByVal strPath As String, ByVal strValueName As String) As Long
    Dim lResult As Long
    Dim lValueType As Long
    Dim lBuf As Long
    Dim lDataBufSize As Long
    Dim r As Long
    Dim keyhand As Long
      
    r = RegOpenKey(hKey, strPath, keyhand)
      
      ' Get length/data type
    lDataBufSize = 4
         
    lResult = RegQueryValueEx(keyhand, strValueName, 0&, lValueType, lBuf, lDataBufSize)
      
    If lResult = ERROR_SUCCESS Then
         If lValueType = REG_DWORD Then
             getdword = lBuf
         End If
    'Else
    ' Call errlog("GetDWORD-" & strPath, False)
    End If
      
    r = RegCloseKey(keyhand)
         
    End Function
      
    Function SaveDword(ByVal hKey As Long, ByVal strPath As String, ByVal strValueName As String, ByVal lData As Long)
         Dim lResult As Long
         Dim keyhand As Long
         Dim r As Long
         r = RegCreateKey(hKey, strPath, keyhand)
         lResult = RegSetValueEx(keyhand, strValueName, 0&, REG_DWORD, lData, 4)
         'If lResult <> error_success Then Call errlog("SetDWORD", False)
         r = RegCloseKey(keyhand)
    End Function
      
    Public Function DeleteKey(ByVal hKey As Long, ByVal strKey As String)
    Dim r As Long
    r = RegDeleteKey(hKey, strKey)
    End Function
      
    Public Function DeleteValue(ByVal hKey As Long, ByVal strPath As String, ByVal strValue As String)
    Dim keyhand As Long
    r = RegOpenKey(hKey, strPath, keyhand)
    r = RegDeleteValue(keyhand, strValue)
    r = RegCloseKey(keyhand)
    End Function


    Вопрос:

       Подскажите, пожалуйста, как в этой строке прикреплять аттачи?

    ShellExecute 0&, "Open", "mailto:" + Ps1_Email + "?Subject=" + Ps2_Subject + "&body=" + Ps3_Body, "", "", SW_SHOWNORMAL

    Ответ:

    Автор ответа: •Creator•

       Попробуйте дописать это:

       + ";A=" + Chr$(34) + "filename" + Chr$(34)

       Кстати Chr$(34) - это ковычки ". Их лучше использовать, если будут где-то пробелы...


    Вопрос:

       Как в отдельном окне, не связанном с написанной на VB6 программой, открыть программы с расширениями .exe, .doc, .txt, .jpg, .bmp, и др.

    Ответ:

    Автор ответа: •Creator•

    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

    Public Function ShellProgramm(WebAdress As String)
         ShellProgramm = ShellExecute(0, "open", WebAdress, "", "", 1)
    End Function


    Во всей программе используешь так:

    ShellProgramm("c:\My Documents\file.doc")


    Вопрос:

       Что означает ошибка номер 91 "Object variable or With block variable not set"? Как можно её исправить?

    Ответ:

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

    Ответ help'a: (сам переводи =) )
      
    There are two steps to creating an object variable. First you must declare the object variable. Then you must assign a valid reference to the object variable using the Set statement. Similarly, a With...End With block must be initialized by executing the With statement entry point. This error has the following causes and solutions:
      
    ћ You attempted to use an object variable that isn't yet referencing a valid object.
      
    Specify or respecify a reference for the object variable. For example, if the Set statement is omitted in the following code, an error would be generated on the reference to MyObject:
      
    Dim MyObject As Object ' Create object variable.
    Set MyObject = Sheets(1) ' Create valid object reference.
    MyCount = MyObject.Count ' Assign Count value to MyCount.
      
    ћ You attempted to use an object variable that has been set to Nothing.
      
    Set MyObject = Nothing ' Release the object.
    MyCount = MyObject.Count ' Make a reference to a released object.
      
    Respecify a reference for the object variable. For example, use a new Set statement to set a new reference to the object.
      
    ћ The object is a valid object, but it wasn't set because the object library in which it is described hasn't been selected in the References dialog box.
      
    Select the object library in the Add References dialog box.
      
    ћ The target of a GoTo statement is inside a With block.
      
    Don't jump into a With block. Make sure the block is initialized by executing the With statement entry point.
      
    ћ You specified a line inside a With block when you chose the Set Next Statement command.
      
    The With block must be initialized by executing the With statement.



    Ответ:

    Автор ответа: Тим

    Это означает, что эта объектная переменная имеет значение Nothing. В окне просмотра объекта в отладчике это можно увидеть. Я часто использую следующую кострукцию, когда не уверен, что объект существует
      
    If Not (myobjectVariable Is Nothing) Then
          какие то действия с объектом
    end if
      
    или
      
    If myobjectVariable Is Nothing Then
         set myobjectVariable = какой-то объект, который точно не Nothing
    end if


    Вопрос:

       После упаковки готового проекта с помощью Package and Diployment Wizard VB6.0 получаю следующие файлы и папки:
      
    C:\Мои документы\My VB6\Установка\*.*
    SETUP.LST
    setup.exe
    Проект1.CAB
    Проект1.TXT
    SETUP.LST

        Плюс Папка "Support" с копиями файлов упаковки проекта и самого проекта.
      
    При инсталяции упакованного проекта, после окна: Setup is checking for necessary disk space... (Установка проверяет необходимое дисковое пространство ...) выдается ошибка:

    C:\WINDOWS\SETUP.LST
    Invalid line in setup information file!
    Section: Setup1 Files
    @Project1.exe,$(AppPath),,$(Shared),12.12.03 10:53:58AM,16384,1.0.0.0
      
        Содержимое файла SETUP.LST:

    [Bootstrap]
    SetupTitle=Install
    SetupText=Copying Files, please stand by.
    CabFile=Project1.CAB
    Spawn=Setup1.exe
    Uninstal=st6unst.exe
    TmpDir=msftqws.pdw
    Cabs=1
      
    [Bootstrap Files]
    File1=@VB6STKIT.DLL,$(WinSysPathSysFile),,,6.18.98 12:00:00 AM,102912,6.0.81.69
    File2=@COMCAT.DLL,$(WinSysPathSysFile),$(DLLSelfRegister),,5.31.98 12:00:00 AM,22288,4.71.1460.1
    File3=@STDOLE2.TLB,$(WinSysPathSysFile),$(TLBRegister),,5.5.99 10:22:00 PM,17920,2.40.4275.1
    File4=@ASYCFILT.DLL,$(WinSysPathSysFile),,,5.5.99 10:22:00 PM,147728,2.40.4275.1
    File5=@Olepro32.dll,$(WinSysPathSysFile),$(DLLSelfRegister),,6.8.00 5:00:00 PM,164112,5.0.4515.0
    File6=@OLEAUT32.DLL,$(WinSysPathSysFile),$(DLLSelfRegister),,9.19.01 2:47:08 PM,614672,2.40.4515.0
    File7=@MSVBVM60.DLL,$(WinSysPathSysFile),$(DLLSelfRegister),,12.9.98 4:28:18 PM,1409024,6.0.82.68
      
    [IconGroups]
    Group0=Установка программы VB_6
    PrivateGroup0=True
    Parent0=$(Programs)
    Group1=Установка программы VB6
    PrivateGroup1=False
    Parent1=$(Start Menu)
      
    [Установка программы VB_6]
    Icon1="Проект1.exe"
    Title1=Установка программы VB_6
    StartIn1=$(AppPath)
      
    [Setup]
    Title=Установка программы VB_6
    DefaultDir=$(ProgramFiles)\Проект1
    AppExe=Проект1.exe
    AppToUninstall=Проект1.exe
      
    [Setup1 Files]
    File1=@Проект1.exe,$(AppPath),,$(Shared),12.12.03 9:43:30 AM,20480,1.0.0.0

        Прошу подсказать, где мною допускается ошибка.

    Ответ:

    Автор ответа: Тим

    1.C помощью Microsoft Visual Basic откроем проект [Program Files]\Microsoft Visual Studio\VB98\Wizards\PDWizard\Setup1\Setup1.vbp

    2.Откроем для редактирования модуль basSetup1 (файл setup1.bas)

    3.Внесем изменения в функцию ParseDateTime() Оригинальная функция ParseDateTime() имеет вид:

    Function ParseDateTime(ByVal strDateTime As String) As Date

    Dim Var As Variant

         Var = strDateTime

         If 0 = VariantChangeTypeEx(VarPtr(Var), VarPtr(Var), &H409, 0, vbDate) Then

             ParseDateTime = Var Else 'Raise same error as CDate

             Err.Raise 13

         End If

    End Function

         Функция ParseDateTime() производит перевод даты из строки в тип Date посредством вызова функции API VariantChangeTypeEx(). В данном случае, VariantChangeTypeEx делает попытку привести Variant-переменную к типу Date без учета установок в Regional Settings, и, соответственно, требует жесткого соблюдения формата записи даты в файле setup.lst ("mm/dd/yy" или "mm/dd/yyyy"). Поскольку P&D Wizard не придерживается этого правила, функция VariantChangeTypeEx() не всегда отрабатывает успешно.

         Используем для преобразования строки в дату функцию СDate. Эта функция работает более гибко и позволяет использовать в качестве аргумента строку с различными видами разделителей (точка, запятая, '/'). Приведем функцию ParseDateTime() к виду:

    Function ParseDateTime(ByVal strDateTime As String) As Date

         ParseDateTime=CDate(strDateTime)

    End Function

    4.Скомпилируем проект (File\Make Setup1.exe:) для создания нового модуля setup1.exe. 5.Перенесем новый setup1.exe папку "...\Wizards\PDWizard\" (именно отсюда он берется P&D Wizard'ом при создания дистрибутива). Теперь можно использовать P&D Wizard для создания дистрибутива на компьютере с разделителями даты/времени устанавливаемыми по умолчанию для России.

    Или здесь http://www.vbrussian.com/DepWiz.asp полная статья


    Вопрос:

       А как в уже имеющийся документ Excel внести данные из VB60 в определенные ячейки (Например D4, E5)?

    Ответ:

    Автор ответа: •Creator•

    Dim numbCell As Integer
    Dim indCell, myNameCell As String
    numbCell = 25: indCell = "D"
    myNameCell = indCell & Trim(Str(numbCell))
             ' в переменную myNameCell записали значение "D25"
    Range(myNameCell).Font.Color = vbRed
    Range(myNameCell).Value = "Привет"
             ' установили цвет щрифта - красный
             ' записали в ячейку "D25" символьную строку: "Привет"



    Ответ:

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

    Это довольно просто

    мой_Excel.cell(x,y)="HI"

    x,y - координаты(числовые)


    Вопрос:

       Скажите пожалуйста как прочитать из реестра(!) информацию о текущем видеоадаптере, его название и обезательно(!) в какой ветке реестра он прописан. Например у меня он прописан в:

    "HKEY_LOCAL_MACHINE\Enum\PCI\VEN_5333&DEV_8A01&SUBSYS_8A015333&REV_01\BUS_00&DEV_0B&FUNC_00"

    (У меня PCI видео). Это означает что в каждой конкретной системе он прописан в разных местах и просто считать его не получится. Как можно реализовать универсальный метод определение этого самого места в реестре ?

    Ответ:

    Автор ответа: •Creator•

    Используй API, если такая есть...

    У меня вообще Enum нэту в HKLM
    Кстати про PCI тоже кое-где в реестре упоминается, хотя таким и не пахнет.

    У меня там:

    HKLM\System\ControlSet001\Control\Class\{4df4vd4fvd4vd44d4dfv4d4dv4dfv4d4fvd4vf4dv}\0000\DriverDesc = "SuperGeForce5 1024mb"

    HKLM\System\ControlSet001\Enum\PCI\VEN_8086&DEV........

    тут тоже, да вобще почти во всем реестре эта карточка, где же истина?


    Вопрос:

       Купил резак, хочу сделать свой диск с инфой и автораном. Последний на VB. VB недавно начал учить, но есть опыт работы с Паскалем. Расскажи вкратце про это дело, и если знаешь дай пару ссылок.

    Ответ:

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

    Создаешь программу на форму кидаешь кнопку, в ее коде пишишь:

    on error goto 1
    shell app.path & "/" & "Путь что запускать"
    exit sub
    1:
    msgbox "Fatal Error"


    Вопрос:

       Как в тексте найти двойные кавычки (") ?

    Ответ:

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

    Их код chr(34). Например:

    if strSymbol = chr(34) then .......



    Ответ:

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

    instr(<строка>,"""")




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

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

    наверх


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

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