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


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

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



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

Доска почёта:

Sergey Y. Tkachev
Кононенко Роман
Kirill

Ссылки:

  • Улицы VB
  • Использование VB
  • Азбука VB
  • VB на русском
  • Улицы VB
  • Кирпичики VB
  • CообЧа VB
  • Snoozex Design
  • IgorykSoft
  • Господа!!! читайте 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 можно найти
    здесь.

    наверх


    Проверить наличие дискеты или CD-Rom'а в устройстве

    Добавьте на форму элемент DriveListBox и элемент CommandButton. Добавьте следующий код. Запустите программу. Выбирая в элементе DriveListBox любое устройство (дисковод или привод CD-Rom) и нажимая на кнопку вы узнаете, находится ли дискетка или лазерный диск в устройстве.

    'ВАРИАНТ 1

    Private Declare Function GetVolumeInformation Lib "kernel32" Alias "GetVolumeInformationA" (ByVal lpRootPathName As String, ByVal lpVolumeNameBuffer As String, ByVal nVolumeNameSize As Long, lpVolumeSerialNumber As Long, lpMaximumComponentLength As Long, lpFileSystemFlags As Long, ByVal lpFileSystemNameBuffer As String, ByVal nFileSystemNameSize As Long) As Long
    Private Sub Command1_Click()
    erg& = GetVolumeInformation(Drive1.Drive, VolName$, 127&, VolNumber&, MCM&, FSF&, FSys$, 127&)
    If erg& = 0 Then
    MsgBox "Ничего в текущем устройстве нет"
    Else
    MsgBox "В текущем устройстве присутствует диск"
    End If
    End Sub

    'ВАРИАНТ 2


    'Установите ссылку к библиотеке Microsoft Scripting Runtime (scrrun.dll)

    Private Sub Form_Load()
    Dim FSO As FileSystemObject
    Dim CDDrive As Drive
    Set FSO = New FileSystemObject
    Set CDDrive = FSO.GetDrive("F:")
    If CDDrive.IsReady Then
    MsgBox CDDrive.VolumeName
    Else
    MsgBox "CD в лотке отсутствует"
    End If
    Set CDDrive = Nothing
    Set FSO = Nothing
    End Sub

    наверх


    Изменить метку диска/устройства

    Добавьте 1 Command Button на форму

    Private Declare Function SetVolumeLabel Lib "kernel32" Alias "SetVolumeLabelA" (ByVal lpRootPathName As String, ByVal lpVolumeName As String) As Long
    Private Sub Command1_Click()
    'replace the "d:\" below with the drive you want to change its label
    'replace the "MyNewLabel" below with the drive new label
    If SetVolumeLabel("d:\", "MyNewLabel") = 0 Then
    MsgBox "An Error occured while trying to change drive label", vbCritical, "Error"
    End If
    End Sub

    наверх


    Получить имя принтера по умолчанию

    Вариант 1. Очень простой

    MsgBox Printer.DeviceName

    Вариант 2

    Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal dwReserved As Long, ByVal samDesired As Long, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName$, ByVal lpdwReserved As Long, lpdwType As Long, lpData As Any, lpcbData As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
    Const HKEY_CURRENT_CONFIG As Long = &H80000005
    Function RegGetString$(hInKey As Long, ByVal subkey$, ByVal valname$)
    Dim RetVal$, hSubKey As Long, dwType As Long, SZ As Long
    Dim R As Long
    RetVal$ = ""
    Const KEY_ALL_ACCESS As Long = &HF0063
    Const ERROR_SUCCESS As Long = 0
    Const REG_SZ As Long = 1
    R = RegOpenKeyEx(hInKey, subkey$, 0, KEY_ALL_ACCESS, hSubKey)
    If R <> ERROR_SUCCESS Then GoTo Quit_Now
    SZ = 256: v$ = String$(SZ, 0)
    R = RegQueryValueEx(hSubKey, valname$, 0, dwType, ByVal v$, SZ)
    If R = ERROR_SUCCESS And dwType = REG_SZ Then
    RetVal$ = Left$(v$, SZ - 1)
    Else
    RetVal$ = "--Not String--"
    End If
    If hInKey = 0 Then
    R = RegCloseKey(hSubKey)
    End If
    Quit_Now:
    RegGetString$ = RetVal$
    End Function
    Private Sub Form_Resize()
    Dim GetCurrPrinter As String
    GetCurrPrinter = RegGetString$(HKEY_CURRENT_CONFIG, "System\CurrentControlSet\Control\Print\Printers", "Default")
    Print GetCurrPrinter
    End Sub

    наверх


    Просмотреть все устройства и определить их тип

    (жесткий диск, дисковод, CD-ROM, сетевой диск, ...)
    Расположите на форме элемент ListBox.

    Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
    Const DRIVE_CDROM = 5
    Const DRIVE_FIXED = 3
    Const DRIVE_RAMDISK = 6
    Const DRIVE_REMOTE = 4
    Const DRIVE_REMOVABLE = 2
    Dim strDrive As String
    Dim strMessage As String
    Dim intCnt As Integer
    Private Sub Form_Load()
    For intCnt = 65 To 86
    strDrive = Chr(intCnt)
    Select Case GetDriveType(strDrive + ":\")
    Case DRIVE_REMOVABLE
    rtn = "Floppy Drive"
    Case DRIVE_FIXED
    rtn = "Hard Drive"
    Case DRIVE_REMOTE
    rtn = "Network Drive"
    Case DRIVE_CDROM
    rtn = "CD-ROM Drive"
    Case DRIVE_RAMDISK
    rtn = "RAM Disk"
    Case Else
    rtn = ""
    End Select
    If rtn <> "" Then
    List1.AddItem "Drive " & strDrive & " is type: " & rtn
    'strMessage = strMessage & vbCrLf & "Drive " & strDrive & " is type: " & rtn
    End If
    Next intCnt
    'MsgBox (strMessage)
    End Sub

    наверх


    Открыть/закрыть CD-ROM

    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
    Private Sub Command1_Click()
    Call mciSendString("CD-ROM открыт", 0&, 0&, 0&)
    End Sub
    Private Sub Command2_Click()
    Call mciSendString("CD-ROM закрыт", 0&, 0&, 0&)
    End Sub

    наверх


    Узнать количество свободного места на диске

    Расположите на форме элемент CommandButton

    Private Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, lpNumberOfFreeClusters As Long, lpTtoalNumberOfClusters As Long) As Long
    Private Type DiskInformation
    lpSectorsPerCluster As Long
    lpBytesPerSector As Long
    lpNumberOfFreeClusters As Long
    lpTotalNumberOfClusters As Long
    End Type
    Dim info As DiskInformation
    Dim lAnswer As Long
    Dim lpRootPathName As String
    Dim lpSectorsPerCluster As Long
    Dim lpBytesPerSector As Long
    Dim lpNumberOfFreeClusters As Long
    Dim lpTotalNumberOfClusters As Long
    Dim lBytesPerCluster As Long
    Dim lNumFreeBytes As Double
    Dim sString As String

    Private Sub Command1_Click()
    lpRootPathName = "с:\" 'вместо С вы можете использовать букву любого существующего диска в системе
    lAnswer = GetDiskFreeSpace(lpRootPathName, lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters)
    lBytesPerCluster = lpSectorsPerCluster * lpBytesPerSector
    lNumFreeBytes = lBytesPerCluster * lpNumberOfFreeClusters
    sString = "Number of Free Bytes : " & lNumFreeBytes & vbCr & vbLf
    sString = sString & "Number of Free Kilobytes: " & (lNumFreeBytes / 1000) & "K" & vbCr & vbLf
    sString = sString & "Number of Free Megabytes: " & Format(((lNumFreeBytes / 1000) / 1000), "0.00") & "MB"
    MsgBox sString
    End Sub

    наверх


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

    BalloonMessage for MS Agent

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

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

    наверх


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

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

    Вопросы:


    Автор вопроса:
    Сергей \(Brains\)

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

       Как зделать музыку на Visual Basic как на Qbasic
    (на QBASIC музыка играет оператором Play" "),а каким операторм или какую функцию нужно вызывать в VB


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

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

       1. Для просмотра HTML странички к програме прицепил объект WebBrowser. Задаю свойству Navigate полный путь и имя файла. Открывает все нормально. В документе есть ссылки внитри текста. При нажатии на любую из них ругается, что немогу открыть страницу и т.д. (будто ее не существует). Хотя какое-то время назад (как только я начинал делать свою програму) все работало нормально. Что делать.

    2. Записываю в фаил строку текста. В нем есть запятые, точки, все как положено. При чтении из фала VB почемуто воспринимает знаки препинания как разделители записей, и , соответственно, они пропадают. Выручайте, мож кто знает. Записываю в фаил по OUTPUT, читаю INPUT.


    Автор вопроса: Duke Alexandr

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

       Скажите кто знает, как из визуала открыть фаил Wordом в кодировке DOS, и ещё запустить макрос на обработку, а по окончанию скопировать это всё в Excel и запустить макрос ещё там!


    Автор вопроса: Юрий

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

       Увидел в форуме, что столкнулся с аналогичной проблемой, решил спросить, не выяснил как перебросить таблицу из ворда в эксель?


    Автор вопроса: Nechaev Sergey

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

       По причинам преплохого качества телефонной линии пришлось сесть за свою звонилку. Загвоздка в следующем: нигде в родных доках не нашел набора АТ команд для моего Acorp Rockvell 56. Толи искал плохо, то ли что... Не мог бы кто-нибудь поделиться инфой или линком (желательно на русском, но не обязательно). А основная пакость в том, что нормально связь работает только при скорости =< 31200. Если больше, надо перезванивать. Дак вот, как узнать скорость на которой произошел коннект.


    Автор вопроса: timshv@graffiti.net

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

       Как узнать тип объектной переменной в VB6?
    Я присваиваю переменной типа Variant объект, например Node или ListItem или ещё какой то, как узнать какого типа в данный момент эта переменная?


    Автор вопроса: САНЯ

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

       У меня такой вопрос, я делаю прогу типа проводника, как сделать так чтобы ия List можно было выбрать файл и открыть его.
    Т.е как ссылаться на объекты ия Васика(ВБ).


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

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

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


    Автор вопроса: МАЯК

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

       Подскажите плиз, что такое DataEnvironment (окружение среды), счем его едят, и где его искать. Если можно подробнее.


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

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

       (VB.net) Вопрос такой, мне нужно чтобы программа заменяла в файлах некоторые байты на другие, то есть символы, слова и т.д., не меняя размер файла! к примеру как делают программы закачек, они создают пустые файлы, а потом набивают пустышки на нужные данные, вот и я бы такое сделать хотел, кто поможет советом как это сделать?


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

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

       Как использовать в Basic функцию Rnd для любых символов(букв.цифр)
    Напешите код. Если кто знает.


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

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

       Какая API функция меняет региональные настройки


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

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

       Как скомпилировать проект, что бы он работал без инсталляции и использования MSVBVM60.DLL (на другом компе)?


    Автор вопроса: МАЯК

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

       Еще один вопросик, как в Excele создаются базы данных *.MDB?


    Автор вопроса: МАЯК

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

       Люди хелп плиз, проблема вобщем то такая. Написал кое какую прогу, все работало нормально, Вставил в нее код созданный макросам в Excele? теперь при сохранении данных в таблице все идет как надо. При попытке ее открыть после сохранения Excel не запускается, и причем сам Excel висит в меню завершения программ вызываемых Ctrl+Alt+Del. На закрытие Excelя использую такой код

    " wBook.SaveAs файл' где файл переменная.
           wBook.Close
           Set wBook = Nothing
           ' если Excel запускали мы, то надо бы его закрыть
           If StartedNew Then
           exapp.Quit
           End If
           Set exapp = Nothing

    Убираю код написаный макросом все опять нормально работает. В чем проблема?


    Автор вопроса: Vitaliy A. Tokarev (UkrTop)

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

       У меня в ХР не выбирается содержимое комбо (окно) по нажатию первой буквы. Может кто чего подскажет?


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

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

       нужно сделать чтобы прога определяла имя своего файла и место нахождения
    app.exeName - че то не работае


    Автор вопроса: Паничев Стас

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

       Подскажите пожалуйста как в реестр записывать DWORD параметр. Есле не трудно напишите пример пожалуйста.


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

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

       Как определить на каком элементе управления установлен фокус? Желательно с примером.


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

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

       В прошлом выпуске говорилось о перемещении кнопки в любой место. А как сделать так чтобы она перемещалось но только не залезало на кнопку2 так чтобы и близко не подходила на 50 пикселей???


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

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

       Подскажите ссылки где можно найти документацию и исходняки для 3D програмирования DirectX. Если нетрудно киньте на E-Mail исходняки, можно урезая файлы .3ds .x и т.д. Мне нужно именно 3D, а не плоская графика.




    Ответы:


    Вопрос:

       Вопрос 1: Как сделать так,чтобы программу невозможно было выгрузить, а если её выгрузить, то запускалась бы копия программы.
    Вопрос 2: У меня есть программа. Как сделать так, чтобы она брала данные из внешнего файла (например .txt) и загружала их оттуда (В этом файле должны находиться переменные вместе с данными)

    Ответ:

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

    Чтобы вместо закрываемой программы запускалась ее копия, достаточно добавить следующий код.
      
    Private Sub Form_Unload(Cancel As Integer)
    cancel=1
    Shell (App.Path + "\project1.exe")
    Cancel = 0
    End Sub
      
    Здесь app – объект содержащий глобальные свойства VB-приложения, в том числе путь path к нему.
      
    Если кодљ будет таким
      
    Private Sub Form_Unload(Cancel As Integer)
    Cancel = 1
    End Sub,
      
    то окно можно будет закрыть лишь диспетчером задач.


    Вопрос:

       Вопрос 1: Как сделать так,чтобы программу невозможно было выгрузить, а если её выгрузить, то запускалась бы копия программы.
    Вопрос 2: У меня есть программа. Как сделать так, чтобы она брала данные из внешнего файла (например .txt) и загружала их оттуда (В этом файле должны находиться переменные вместе с данными)

    Ответ:

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

    На вопрос номер раз.
    Форму с таким кодом не возможно выгрузить "стандартными средствами" - ни кнопка Х, ни wm_close на эту форму не подействуют. Но есть Task Manager, по крайней мере в NT, и TerminateProcess :( Кстати на команду End в теле программы Cancel = 1 тоже не действует.

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
         Cancel = 1
         'Некоторое условие, при выполнении которого выход, все же допускается.
         'У меня просто CheckBox на форме. Если галочка стоит - выходим.
         If Check1.Value = 1 Then Cancel = 0
    End Sub

    Что касается "... а если её выгрузить, то запускалась бы копия программы", то что-то запустить может либо юзер (который, как я понимаю, этого не хочет), либо система (которая не станет, потому как очень гордая, и её нужно долго просить :), либо другая РАБОТАЮЩАЯ программа.


    Вопрос:

       Вопрос 1: Как сделать так,чтобы программу невозможно было выгрузить, а если её выгрузить, то запускалась бы копия программы.
    Вопрос 2: У меня есть программа. Как сделать так, чтобы она брала данные из внешнего файла (например .txt) и загружала их оттуда (В этом файле должны находиться переменные вместе с данными)

    Ответ:

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

    Ответ на первый вопрос:

    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Shell "путь к твоей проге" 'при закрытии запуск заново
    Unload Me 'выгружаешь эту версию
    End Sub

    теперь твою прогу даже по Ctrl-Alt-Del не убрать ;)

    Ответ на второй вопрос:

    Open "путь к твоему файлу.txt" For Input As #1 '1 - свободный номер файла
    Do While Not EOF(1) 'цикл до конца файла #1
        Input #1,tmp 'tmp-переменная куда читаешь
    Loop

    вариант: вместо Input #1,tmp пишешь LineInput #1,tmp - читает всю строку игнорируя запятые


    Вопрос:

       Вопрос 1: Как сделать так,чтобы программу невозможно было выгрузить, а если её выгрузить, то запускалась бы копия программы.
    Вопрос 2: У меня есть программа. Как сделать так, чтобы она брала данные из внешнего файла (например .txt) и загружала их оттуда (В этом файле должны находиться переменные вместе с данными)

    Ответ:

    Автор ответа: Murat Shonov

    По первому вопросу использовать QueryUnload :
      
    Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Dim I As Integer
    I = 1
    Cancel = I
    End Sub
      
    При таком раскладе форму закрыть невозможно. То есть параметр Cancel не даст выгрузить форму.
    А параметр UnloadMode показывает каким образом пользователь пытается закрыть твою форму.
    Там есть константы:

    vbFormControlMenu (0 - Пользователь закрыл приложение посредством [Alt+F4], кнопки Close (Закрыть) окна или одноименной команды системного меню)
      
    vbFormCode (1 - В коде выполняется команда Unload)
      
    vbAppWindows (2- Завершение сеанса Windows)
      
    vbAppTaskManager (3 - Выход из приложения с помощью менеджера задач)
      
    vbFormMDIForm (4 - Дочерняя форма MDI закрыта, так как закрыта вышестоящая форма MDI)
      
    Здесь идет название константы и в скобках указывается значение плюс описание того, что подлый пользователь делает с твоей программой.
    И если не нравится то в процедуре указываешь что надо запустить твою программу.
      
    И по второму вопросу там надо пользоваться одним из трех видов доступа к файлам.
    Первый это последовательный доступ. В какой процедуре ты его будешь использовать неважно.
      
    Private Sub Form_Load()
    Dim intFH As Integer ‘ intFH это дескриптор файла нужен для всех видов доступа т.е. Visual Basic работает не с самим файлом а с его каналом в системе, дескриптор это канал.
    intFH = FreeFile ‘функция FreeFile возвращает значение пустого канала
      
    Open "text.txt" For Input As intFH ‘здесь ты указываешь файл который хочешь открыть и его путь. А также указываешь как тебе надо открыть этот файл Input для чтенияљ Output для записи Append для добавления. Если открываешь файл для Input и файла нет в указанном месте выдается ошибка, остальные просто создадут новый файл.
      
    Do Until EOF(intFH)
    Line Input #intFH, strString ‘Line Input считывает одну строку из файла
    strText = strText & strString & vbLf
    Loop
    Close ‘каждый открытый канал надо обязательно закрывать. Close закрывает все открытые каналы Close intFH закрывает выбранный канал
    End Sub
      
    Для записи используются операторы Print# , Write#. Так же открывается файл и в него через переменную или прямо ручками из кода даешь какие-то данные.
    Второй вид доступа это - произвольный доступ.
      
    Open “text.txt” for Random [Access доступ] [Блокировка] As #intFH [Len = длинна записи]
      
    Access – тип доступа, но можно без него там есть Read, Write и Read Write. Для чтения, записи и чтения записи одновременно. Len длинна записи указывается не помню то ли в байтах то ли в символах.
    Считывание и запись в файл производятся операторами

    Get #intFH, 7, Address ‘ считывает 7ю запись
    Put #intFH, 2, Address ‘ записывает 2ю запись
      
    И третий вид доступа двоичный

    Open “text.txt” For Binary [Access доступ] [Блокировка] As #intFH
      
    Тоже самое только не random и параметра len нету
    Считывание и запись точно так же

    Get #intFH, 7, Address ‘ считывает 7 байт
    Put #intFH, 2, Address ‘ записывает 2 байт
      
    Если надо подробней могу на мыло кинуть Вордовский документ.


    Вопрос:

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

    Ответ:

    Автор ответа: Скуратович Павел

    Наиболее универсальный способ (чтоб не запускалась даже из разных .exe-файлов):

    Const ERROR_ALREADY_EXISTS = 183&
    Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As Any, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
    Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Sub Form_Load()
         Dim hMutex As Long
         'Пробуем создать Mutex
         hMutex = CreateMutex(ByVal 0&, 1, App.Title)
         'Если такой mutex уже существует...
         If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
             'Чистим за собой
             ReleaseMutex hMutex
             CloseHandle hMutex

             MsgBox "типа, ""программа уже запущена"""
             End
         End If
    End Sub


    Вопрос:

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

    Ответ:

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

    Private Sub Form_Load()
    If App.PrevInstance = True Then
    MsgBox "Программа уже запущена"
    End
    End If
    End Sub


    Вопрос:

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

    Ответ:

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

    Вот так будет правильнее 8)
    ВАЖНОЕ ЗАМЕЧАНИЕ!!!!
    твоя форма не должна иметь Me.Caption = "постоянное имя формы" присвой ей сначала во свойствах "временное имя"; после запуска проги оно всё равно изменится на "постоянное имя формы". Это сделано для того чтобы первый экземпляр программы не закрывался.


    Option Explicit
    Private Declare Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Sub Form_Activate()
    Me.Caption = "постоянное имя формы"
    End Sub

    Private Sub Form_Load()
    Dim hnd As Long
    hnd = FindWindow("ThunderRT6FormDC", "постоянное имя формы")
    If hnd <> 0 And hnd <> Me.hWnd Then
         MsgBox ("Программа уже запущена")
         Unload Me
    End If
    End Sub


    Вопрос:

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

    Ответ:

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

    Надо просто добавить код:
      
    Private Sub Form_Load()
    If App.PrevInstance Then
    MsgBox ("Программа уже работает!")
    Unload Me
    End If
    End Sub


    Вопрос:

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

    Ответ:

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

    'Примерно вот так:
    Private Sub Form_Load()
         If App.PrevInstance = True Then
             MsgBox "Программа уже запущена.", vbOKOnly Or vbExclamation
             Unload Form1
         End If
    End Sub


    Вопрос:

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

    Ответ:

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

    Option Explicit
    Private Declare Function FindWindow Lib "user32" Alias _
    "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

    Private Sub Form_Activate()
    Me.Caption = "MyApplication"
    End Sub

    Private Sub Form_Load()
    Dim hnd As Long
    hnd = FindWindow("ThunderRT6FormDC", "MyApplication")
    If hnd <> 0 And hnd <> Me.hWnd Then
         Unload Me
    End If
    End Sub


    Вопрос:

       Люди, подскажите пожалуйста, ломаю голову какой код вписать, чтоб при нажатии на кнопку, программа проверила наличие файла в директории и при его наличии в строке имя файла отобразилось имя того же файла только с еденицей, при наличии файла с еденицей предложила вариант с двойкой, вобщем как в WORDE, а при попытке сохранить файл под имеющемся именем, выдала системное сообщение "файл с таким именем уже есть, хотите его заменить?. Я сделал так а дальше незнаю....
      
    Private Sub ShowSave()
    Объявил две переменные файл_пом и Файл_библиотека.
    On Error GoTo ErrorHandler
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "All Files (*.*)|*.*|Word Documents (*.doc )|*.doc |Text Files (*.txt)|*.txt|"
    CommonDialog1.FilterIndex = 3
    CommonDialog1.InitDir = "D:\DOCUMENTS"
    'CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNAllowMultiselect
    CommonDialog1.Action = 2
      
    Файл_библиотека = App.Path + "\Sveden1.ph" ' файл *.bib
    *-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*
    файл_пом = CMDialog1.FileName 'придаем переменной файл_пом, адрес места
    'расположения файла с данными адреса расположения файла *.bib
    If Dir(файл_пом) = "" Then
    1
      
    '***********
      
    'Здесь мой код.
    '**********
      
    Exit Sub
    ErrorHandler:
    If Err.Number = 32755 Then Exit Sub
    Else
    If MsgBox("Заменить существующий файл" & " " & " " & файл_пом, vbYesNo + vbExclamation, "Выход?") = vbYes Then
    GoTo 1001
    Else
    Exit Sub
    End If
    End Sub
      

    End Sub
      
    '.FileName ( .Font, .Color, .FromPage, .ToPage, .Copies, .Orientation)

    Ответ:

    Автор ответа: Александр Горбылёв

    Я бы предпочёл использовать FSO. Для этого надо установить ссылку ("Project"->"References") на "Microsoft Scripting Runtime".
    Классы объектов, которые входят в состав FSO:

    CreateObject Function
    Dictionary Object
    Drive - класс для работы с устройствами системы, такими как жесткий диск,
    CD-ROM, логический диск и т.п.
    Drives Collection
    Folder - класс для работы c папками: создание, удаление, чтение, установка атрибутов
    File Object - класс для работы c файлами: создание, удаление, чтение, установка атрибутов файлов
    FileSystemObject - базовый класс системы, на основе которого построены другие классы
    Files Collection
    Folder Object
    Folders Collection
    TextStream - специальный класс для работы с текстовыми файлами

    Использование системы FSO состоит из трех этапов:

    1. Создание объекта системы FSO
    2. Настройка требуемых методов объекта FSO
    3. Настройка доступных свойств объекта FSO

    Создать объект FSO можно объявлением переменной типа FSO:

         Dim oFSO As New FileSystemObject

    Для создания объекта можно использовать следующий оператор:

         Set oFSO = CreateObject("Scripting.FileSystemObject")

    Вот пример получения коллекции файлов папки и её обхода с помощью оператора For Each...Next:

    Function ShowFolderList(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
         s = s & f1.name & vbCrLf
       Next
       ShowFolderList = s
    End Function

    Остальное - в MSDN (ищем FileSystemObject Object).


    Вопрос:

       Люди, подскажите пожалуйста, ломаю голову какой код вписать, чтоб при нажатии на кнопку, программа проверила наличие файла в директории и при его наличии в строке имя файла отобразилось имя того же файла только с еденицей, при наличии файла с еденицей предложила вариант с двойкой, вобщем как в WORDE, а при попытке сохранить файл под имеющемся именем, выдала системное сообщение "файл с таким именем уже есть, хотите его заменить?. Я сделал так а дальше незнаю....
      
    Private Sub ShowSave()
    Объявил две переменные файл_пом и Файл_библиотека.
    On Error GoTo ErrorHandler
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "All Files (*.*)|*.*|Word Documents (*.doc )|*.doc |Text Files (*.txt)|*.txt|"
    CommonDialog1.FilterIndex = 3
    CommonDialog1.InitDir = "D:\DOCUMENTS"
    'CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNAllowMultiselect
    CommonDialog1.Action = 2
      
    Файл_библиотека = App.Path + "\Sveden1.ph" ' файл *.bib
    *-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*
    файл_пом = CMDialog1.FileName 'придаем переменной файл_пом, адрес места
    'расположения файла с данными адреса расположения файла *.bib
    If Dir(файл_пом) = "" Then
    1
      
    '***********
      
    'Здесь мой код.
    '**********
      
    Exit Sub
    ErrorHandler:
    If Err.Number = 32755 Then Exit Sub
    Else
    If MsgBox("Заменить существующий файл" & " " & " " & файл_пом, vbYesNo + vbExclamation, "Выход?") = vbYes Then
    GoTo 1001
    Else
    Exit Sub
    End If
    End Sub
      

    End Sub
      
    '.FileName ( .Font, .Color, .FromPage, .ToPage, .Copies, .Orientation)

    Ответ:

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

    'Функция GenerateFileName
    'генерирует имя файла в заданном каталоге sDir
    'вида sNameTemplate0001.ext, sNameTemplate0002.ext, .. sNameTemplate9999.ext
    Public Function GenerateFileName(ByVal sDir As String, ByVal sNameTemplate As String) As String
         Dim oFSO As New FileSystemObject
         Dim sFileName As String
         Dim iCounter As Integer
             
         'Последовательно генерируем имена файлов и проверяем на их наличие в заданном каталоге
         iCounter = 1
         Do
             sFileName = oFSO.BuildPath(sDir, _
                             oFSO.GetBaseName(sNameTemplate) & Format(iCounter, "000#") & "." &
    oFSO.GetExtensionName(sNameTemplate))
             iCounter = iCounter + 1
         Loop While oFSO.FileExists(sFileName)
         
         GenerateFileName = sFileName
    End Function


    Вопрос:

       Люди, подскажите пожалуйста, ломаю голову какой код вписать, чтоб при нажатии на кнопку, программа проверила наличие файла в директории и при его наличии в строке имя файла отобразилось имя того же файла только с еденицей, при наличии файла с еденицей предложила вариант с двойкой, вобщем как в WORDE, а при попытке сохранить файл под имеющемся именем, выдала системное сообщение "файл с таким именем уже есть, хотите его заменить?. Я сделал так а дальше незнаю....
      
    Private Sub ShowSave()
    Объявил две переменные файл_пом и Файл_библиотека.
    On Error GoTo ErrorHandler
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "All Files (*.*)|*.*|Word Documents (*.doc )|*.doc |Text Files (*.txt)|*.txt|"
    CommonDialog1.FilterIndex = 3
    CommonDialog1.InitDir = "D:\DOCUMENTS"
    'CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNAllowMultiselect
    CommonDialog1.Action = 2
      
    Файл_библиотека = App.Path + "\Sveden1.ph" ' файл *.bib
    *-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*
    файл_пом = CMDialog1.FileName 'придаем переменной файл_пом, адрес места
    'расположения файла с данными адреса расположения файла *.bib
    If Dir(файл_пом) = "" Then
    1
      
    '***********
      
    'Здесь мой код.
    '**********
      
    Exit Sub
    ErrorHandler:
    If Err.Number = 32755 Then Exit Sub
    Else
    If MsgBox("Заменить существующий файл" & " " & " " & файл_пом, vbYesNo + vbExclamation, "Выход?") = vbYes Then
    GoTo 1001
    Else
    Exit Sub
    End If
    End Sub
      

    End Sub
      
    '.FileName ( .Font, .Color, .FromPage, .ToPage, .Copies, .Orientation)

    Ответ:

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

    Присоединяешь к проекту Microsoft Scripting Runtime
    В твоей проге я не разбирался но я сделал бы так

    Option Explicit
    Dim FSO As New FileSystemObject 'присоединяем FileSystemObject

    Private Sub Rename(file As String) 'пусть в переменной file
                                                  'лежит полный путь к
                                                  'файлу
    Dim n As Integer
    Dim tmp as String
    n=1
    Do

       If FSO.FileExists(file)=False Then 'если файла с таким
           **сохраняешь свой файл** 'именем нет
          Exit Do
       End If
       file=Replace (file,".",Str(n)+".") 'меняем имя файла
       n=n+1
    Loop
    End Sub


    Вопрос:

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

    Ответ:

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

    Перебор всех файлов TXT и заполнение ComboBox:

    Sub FillDownFiles(ByVal StartPath As String, ByRef Ctr As ComboBox)
         Dim D(), Count, XDir
         StartPath = StartPath + IIf(Right(StartPath, 1) <> "\", "\", "")
         XDir = Dir(StartPath, vbDirectory)
         Count = 0
         Do While XDir <> ""
             If XDir <> "." And XDir <> ".." Then
                 If (GetAttr(StartPath + XDir) And vbDirectory) = vbDirectory Then
                     If (Count Mod 10) = 0 Then
                         ReDim Preserve D(Count + 10)
                     End If
                     Count = Count + 1
                     D(Count) = XDir
                 Else
                     If Right(XDir, 4) = ".TXT" Then
                         Ctr.AddItem StartPath + XDir
                     End If
                 End If
             End If
             XDir = Dir
         Loop
         For I = 1 To Count
             FillDownFiles StartPath + D(I) + "\", Ctr
         Next I
    End Sub


    Вопрос:

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

    Ответ:

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

    Есть такая возможность :)

    Private Function ListFile(directory As String) As String
    Static flag As Boolean
    If flag = False Then
             ListFile = Dir(directory)
             flag = True
         Else
             ListFile = Dir()
    End If
    If ListFile = "" Then ListFile = "В этой папке файлов больше нет"
    flag = False
    End Sub


    Вопрос:

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

    Ответ:

    Автор ответа: Александр Горбылёв

    Я бы предпочёл использовать FSO. Для этого надо установить ссылку ("Project"->"References") на "Microsoft Scripting Runtime".
    Классы объектов, которые входят в состав FSO:

    CreateObject Function
    Dictionary Object
    Drive - класс для работы с устройствами системы, такими как жесткий диск,
    CD-ROM, логический диск и т.п.
    Drives Collection
    Folder - класс для работы c папками: создание, удаление, чтение, установка атрибутов
    File Object - класс для работы c файлами: создание, удаление, чтение, установка атрибутов файлов
    FileSystemObject - базовый класс системы, на основе которого построены другие классы
    Files Collection
    Folder Object
    Folders Collection
    TextStream - специальный класс для работы с текстовыми файлами

    Использование системы FSO состоит из трех этапов:

    1. Создание объекта системы FSO
    2. Настройка требуемых методов объекта FSO
    3. Настройка доступных свойств объекта FSO

    Создать объект FSO можно объявлением переменной типа FSO:

         Dim oFSO As New FileSystemObject

    Для создания объекта можно использовать следующий оператор:

         Set oFSO = CreateObject("Scripting.FileSystemObject")

    Вот пример получения коллекции файлов папки и её обхода с помощью оператора For Each...Next:

    Function ShowFolderList(folderspec)
       Dim fso, f, f1, fc, s
       Set fso = CreateObject("Scripting.FileSystemObject")
       Set f = fso.GetFolder(folderspec)
       Set fc = f.Files
       For Each f1 in fc
         s = s & f1.name & vbCrLf
       Next
       ShowFolderList = s
    End Function

    Остальное - в MSDN (ищем FileSystemObject Object).


    Вопрос:

       Что такое ScaleWidth и ScaleHeight? Чем отличаются от Width и Height?

    Ответ:

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

    Показывают размер объекта в единицах указанных в ScaleMode


    Вопрос:

       Что такое ScaleWidth и ScaleHeight? Чем отличаются от Width и Height?

    Ответ:

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

    1. Width и Height содержат размеры всего окна, а ScaleWidth и ScaleHeight - только клиентской области (без заголовка окна и рамки).
    2. Width и Height всегда измеряются в Twip'ах, а ScaleWidth и ScaleHeight - в зависимости от свойства ScaleMode. Twip - логическая единица, обычно равная 1/15 px на экране и всегда равная 1/1440 дюйма на любом устройстве.


    Вопрос:

       Работаю с Win 5.0
    у меня программа ассоциирована к расширению .zzz
    Я хочу уянать полный путь к программе которая накодится в командной строке. Я делаю это с помощью

    Private Declare Function GetCommandLine Lib "kernel32" Alias "GetCommandLineA" () As String

    Под win9x все нормально,но под NT происход крах программы. Есть ли артальнотива это функции или другой способ яделать это ?

    Ответ:

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

    Попробуй средствами VB - используй функцию Command$.


    Вопрос:

       Почему в VB6 на WinXP не работают такие функции API как - ChangeDisplaySettings и ExitWindowsEx?
    Тот же код, но на ос Win9X, работает.

    Ответ:

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

    Это потому, что АПИ функции со временем устаревают. Выходят новые операционки, в них появляются новые АПИ функции (взамен старым) - более быстрые, более универсальные (про стабильность промолчу :-)). Так вот МокроСофт старые функции из новых операционок выбрасывает не сразу, а лишь спустя какой-то период времени, как бы давая возможность программистам перейти на использование новых функций, после чего полностью прекращает их (функций) поддержку.
    Всю информацию о той или иной АПИ функции можешь посмотреть в MSDN (http://msdn.microsoft.com/).


    Вопрос:

       Каким образом можно из VB получать и обрабатывать системные события Windows ! Например, читать клавиатуру.

    Ответ:

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

    Системных событий очень много, а вот читать клавиатуру вне программы
      
    'Модуль
    Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
    Public Const VK_TAB = &H9 ' Константа для TAB key.Для других кнопок посмотрите в API вьювере
      
    'Программа
    If GetAsyncKeyState(VK_TAB) Then msgboх "Кто то трогает ТАБ", vbinformation


    Вопрос:

       Как в VB яавершить работу приложения Windows?

    Ответ:

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

    'FindTopWindow определяет самого верхнего родителя для окна,
    'чей дескриптор передается в качестве параметра. Надо, чтобы не убить
    'какую-нибудь кнопку, но, в принципе, это не обязательно ;)

    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 Const WM_CLOSE = &H10

    Private Sub btnClose_Click()
         If hwdCurWindow = FindTopWindow(hwdCurWindow) Then
             SendMessage hwdCurWindow, WM_CLOSE, 0, 0
             hwdCurWindow = 0
         End If
    End Sub

    Public Function FindTopWindow(ByVal hw As Long) As Long
         Dim NewHwnd As Long
         NewHwnd = GetParent(hw)
         While NewHwnd <> 0
             hw = NewHwnd
             NewHwnd = GetParent(hw)
         Wend
         FindTopWindow = hw
    End Function


    Вопрос:

       Как сделать всплывающую подсказку (ToolTipText)в 2 и более строк?

    Ответ:

    Автор ответа: Скуратович Павел

    Установить себе Windows 2000/XP/что_там_ещё_есть и использовать vbCrLf 8-)


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

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

    наверх


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

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