VBNet
VBMania
Голосование: Голосования сайта VBNet.Ru. Результаты голосований передаются на сайт. Проследите, что есть соединение с интернетом. Ссылки: |
Господа!!! читайте MSDN!!! Несколько слов от автора:
Этот выпуск немного задержался по техническим причинам. Только начал его создавать, начал капитально глючить IIS. Запустил "Восстановление системы". Но вместо восстановления оно полностью обрушило систему. Вот они, славные продукты MS... В пятницу пытался поднять Windows цивилизованными методами. Не удалось. А вчера format C:, потом установка и настройка программ, распаковка тонн архивов... Зато несколько гигабайт на диске осовбодилось - покупку нового винта можно на пару недель отложить. Правильно говорят - нет худа без добра.
Читайте! Содержание выпуска
Книги
Остальные книги о VB можно найти здесь. наверх Хотите знать, какие файлы скопированы в память? Добавьте на форму элемент CommandButton и ListBox. Вставьте код, запустите. Затем переключитесь в Проводник, выберите несколько файлов, скопируйте их. Затем перейдите в вашу программу и нажмите на кнопку. Private Const CF_HDROP = 15 Private Type POINT x As Long y As Long End Type Private Type DROPFILES pFiles As Long pt As POINT fNC As Long fWide As Long End Type Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function CloseClipboard Lib "user32" () As Long Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Sub ShowFilesOnClipboard() Dim lHandle As Long Dim lpResults As Long Dim lRet As Long Dim df As DROPFILES Dim strDest As String Dim lBufferSize As Long Dim arBuffer() As Byte Dim vNames As Variant Dim i As Long If OpenClipboard(0) Then lHandle = GetClipboardData(CF_HDROP) ' If you don't find a CF_HDROP, you don't want to process anything If lHandle > 0 Then lpResults = GlobalLock(lHandle) lBufferSize = GlobalSize(lpResults) ReDim arBuffer(0 To lBufferSize) CopyMemory df, ByVal lpResults, Len(df) Call CopyMemory(arBuffer(0), ByVal lpResults + df.pFiles, (lBufferSize - Len(df))) If df.fWide = 1 Then ' it is wide chars--unicode strDest = arBuffer Else strDest = StrConv(arBuffer, vbUnicode) End If GlobalUnlock lHandle vNames = Split(strDest, vbNullChar) i = 0 While Len(vNames(i)) > 0 List1.AddItem vNames(i) i = i + 1 Wend End If End If CloseClipboard End Sub Private Sub Command1_Click() List1.Clear Call ShowFilesOnClipboard End Sub наверх Получение имен всех логических дисков Очередной пример из серии "как определить имена всех дисков в системе". Причина появления этого примера - использование API-функции GetLogicalDriveStrings Private Declare Function GetLogicalDriveStrings Lib "kernel32" Alias "GetLogicalDriveStringsA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long Private Function GetDriveStrings() As String Dim result As Long ' Result of our api calls Dim strDrives As String ' String to pass to api call Dim lenStrDrives As Long ' Length of the above string result = GetLogicalDriveStrings(0, strDrives) strDrives = String(result, 0) lenStrDrives = result result = GetLogicalDriveStrings(lenStrDrives, strDrives) If result = 0 Then GetDriveStrings = "" Else GetDriveStrings = strDrives End If End Function Private Sub Command1_Click() Dim strDrives As String strDrives = GetDriveStrings() If strDrives = "" Then MsgBox "No Drives were found!", vbCritical Else DisplayDriveTypes strDrives End If End Sub Private Sub DisplayDriveTypes(drives As String) Dim pos As Long Dim drive As String List1.Clear pos = 1 Do While Not Mid$(drives, pos, 1) = Chr(0) drive = Mid$(drives, pos, 3) pos = pos + 4 List1.AddItem UCase(drive) Loop End Sub наверх Установить высоту выпадающего окна ComboBox'а к количеству имеющихся строк Запустите проект, нажмите на стрелку элемента ComboBox, затем сделайте клик левой клавишей мыши на любом пустом месте формы, затем снова щелкните на элементе ComboBox... Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long Public Sub ResizeCbo(cbo As ComboBox) Counter = cbo.ListCount cboLeft = cbo.Left / Screen.TwipsPerPixelX cboTop = cbo.Top / Screen.TwipsPerPixelY cboWidth = cbo.Width / Screen.TwipsPerPixelX cboHeight = cbo.Height / Screen.TwipsPerPixelX * Counter MoveWindow cbo.hwnd, cboLeft, cboTop, cboWidth, cboHeight, 1 End Sub Private Sub Form_Click() Call ResizeCbo(Combo1) End Sub Private Sub Form_Load() Combo1.AddItem "1" Combo1.AddItem "2" Combo1.AddItem "3" Combo1.AddItem "4" Combo1.AddItem "5" Combo1.AddItem "6" Combo1.AddItem "7" Combo1.AddItem "8" Combo1.AddItem "9" Combo1.AddItem "10" Combo1.AddItem "11" Combo1.AddItem "12" Combo1.AddItem "13" Combo1.AddItem "14" End Sub наверх Определение соответствия имени файла маске Данный пример позволяет определить, соответствует ли имя файла какой-либо маске. Очень часто вы используете специальные символы (к примеру при поиске файлов) - знак вопроса (?) или звездочку (*). Знак вопроса означает, что в данном месте может быть только один символ, а звездочка означает, что в данном месте может быть любое количество символов. В общем, посмотрите на прилагающийся пример, и вы сразу поймете в чем дело. Private Function IsMask(ByVal FileName As String, ByVal Mask As String) As Boolean 'объявляем переменные Dim i As Integer Dim pos As Integer Dim posit As Integer Dim curs As String Dim tmp As Integer Dim temp As String Dim j As Integer 'Заменяем идущие подряд несколько звёздочек на одну pos = 1 posit = InStr(pos, Mask, "**") Do While posit <> 0 temp = Left$(Mask, posit - 1) temp = temp & Mid$(Mask, posit, 1) temp = temp & Right$(Mask, Len(Mask) - (posit + 1)) Mask = temp posit = InStr(pos, Mask, "**") Loop 'Заменяем *? на * pos = 1 posit = InStr(pos, Mask, "*?") Do While posit <> 0 temp = Left$(Mask, posit - 1) temp = temp & Mid$(Mask, posit, 1) temp = temp & Right$(Mask, Len(Mask) - (posit + 1)) Mask = temp posit = InStr(pos, Mask, "*?") Loop 'Перебираем все символы в Mask For pos = 1 To Len(Mask) curs = Mid$(Mask, pos, 1) Select Case curs 'если символ "?", то это любой знак Case "?" j = j + 1 i = i + 1 'если символ "*", то Case "*" If pos = Len(Mask) Then 'Если это последний символ, отпускаем с богом i = i + (Len(FileName) - j) 'А если нет, то ищем символв FileName, 'стоящий в Mask за звездой Else tmp = InStr(pos, FileName, Mid$(Mask, pos + 1, 1)) 'Если символ не найден, то If tmp = 0 Then 'Значение функции = False IsMask = False 'Выходим из функции Exit Function End If 'i = i + кол-во непроверенных символов i = i + (tmp - (j + 1)) 'то же самое с j j = j + (tmp - (j + 1)) End If 'если символ не "*" и не "?", то Case Else j = j + 1 'если символ в FileName совпадает с символом 'в Mask, то If Mid$(FileName, j, 1) = Mid$(Mask, pos, 1) Then 'Увеличиваем счётчик попаданий i = i + 1 End If End Select 'завершаем цикл Next 'Если i соответствует длине FileName, то 'значение функции True, иначе False If i = Len(FileName) Then IsMask = True Else IsMask = False End Function Private Sub Form_Load() MsgBox IsMask("ritual.txt", "*.*"), , "ritual.txt" & " *.*" MsgBox IsMask("ritual.txt", "r*.*"), , "ritual.txt" & " r*.*" MsgBox IsMask("ritual.txt", "m*.*"), , "ritual.txt" & " m*.*" MsgBox IsMask("ritual.txt", "?i????.*"), , "ritual.txt" & " ?i????.*" MsgBox IsMask("ritual.txt", "*u??.*"), , "ritual.txt" & " *u??.*" MsgBox IsMask("ritual.txt", "*.htm"), , "ritual.txt" & " *.htm" MsgBox IsMask("ritual.txt", "*.txt"), , "ritual.txt" & " *.txt" End End Sub наверх Получение длинного и короткого имени файла/директории Данный вопрос очень часто звучит на многих форумах: "Как мне получить короткое имя файла" или "Как мне получить длинное имя файла, зная короткое". Далее следует ответ на эти вопросы. P.S. Надеюсь, мне не надо объяснять что такое "длинное"/"короткое" имя файла. :)) Private Const MAX_PATH& = 260 Private Const INVALID_HANDLE_VALUE = -1 Private Type FILETIME dwLowDateTime As Long dwHighDateTime As Long End Type Private Type WIN32_FIND_DATA dwFileAttributes As Long ftCreationTime As FILETIME ftLastAccessTime As FILETIME ftLastWriteTime As FILETIME nFileSizeHigh As Long nFileSizeLow As Long dwReservedЇ As Long dwReserved1 As Long cFileName As String * MAX_PATH cAlternate As String * 14 End Type Private Declare Function apiFindFirstFile Lib "kernel32" Alias "FindFirstFileA" (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long Private Declare Function apiFindClose Lib "kernel32" Alias "FindClose" (ByVal hFindFile As Long) As Long Private Declare Function apiGetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long Function fGetShortName(ByVal stLongPath As String) As String Dim stShortPath As String Dim lngBuffer As Long, lngRet As Long stShortPath = String$(MAX_PATH, 0) lngBuffer = Len(stShortPath) lngRet = apiGetShortPathName(stLongPath, stShortPath, lngBuffer) fGetShortName = Left(stShortPath, lngRet) End Function Function fGetLongName(ByVal strFilename As String) As String Dim lpFindFileData As WIN32_FIND_DATA Dim strPath As String, lngRet As Long Dim strFile As String, lngx As Long, lngY As Long Dim strTmp As String strTmp = "" Do While Not lngRet = INVALID_HANDLE_VALUE lngRet = apiFindFirstFile(strFilename, lpFindFileData) strFile = Left$(lpFindFileData.cFileName, InStr(lpFindFileData.cFileName, vbNullChar) - 1) If Len(strFilename) > 2 Then strTmp = strFile & "\" & strTmp strFilename = fParseDir(strFilename) Else strTmp = strFilename & "\" & strTmp Exit Do End If Loop fGetLongName = Left$(strTmp, Len(strTmp) - 1) lngY = apiFindClose(lngRet) End Function Private Function fParseDir(strInFile As String) As String Dim intLen As Long, boolFound As Boolean Dim i As Integer, F As String, strDir As String intLen = Len(strInFile) If intLen > 0 Then boolFound = False For i = intLen To 1 Step -1 If Mid$(strInFile, i, 1) = "\" Then F = Mid$(strInFile, i + 1) strDir = Left$(strInFile, i - 1) boolFound = True Exit For End If Next i End If If boolFound Then fParseDir = strDir Else fParseDir = strInFile End If End Function Private Sub Command1_Click() Dim fShort fShort = fGetShortName("C:\Program Files") MsgBox fShort fShort = fGetLongName(fShort) MsgBox fShort End Sub наверх Мои программы BalloonMessage for MS Agent BalloonMessage for Microsoft Agent реализует диалог программы с
пользователем, используя при этом технологию Microsoft Agent. OCX реализует три
типа диалоговых окон: InputBox, MsgBox и MsgLabels. Автора: Шатрыкин Иван и Павел Сурменок. наверх Вопрос/Ответ Здесь Вы можете задать вопрос, или ответить на уже имеющиеся вопросы. Вопросы:Автор вопроса: Memphis Ответ ожидается по этому адресу Имеется: форма, распахнутая на весь экран, на форме - PictureBox (или Image - сейчас это не суть важно), в PictureBox загружается картинка. Суть проблемы: необходимо, чтобы картинка масштабировалась под размеры экрана (а так как форма распахнута на весь экран - следовательно, под размеры формы). Пример масштабирования картинки из выпуска 141 рассылки не помог. Автор вопроса: 001 Ответ ожидается по этому адресу Объясните, пожалуйста, как с помощью MMControl проиграть MP3 файл. Я пробовал его переделать ия примера, который играет WAV файлы, там есть такое свойство DeviceType, яначение которого "WaveAudio". Какое значение этого свойства должно быть для MP3? Вояможно, в этом моя проблема? Поделитесь кодом, кто может. Автор вопроса: Alexandr Ответ ожидается по этому адресу На форме имется несколько кнопок. Каждая запускает определенную программу. После отработки программы ожидается нажатие другой кнопки. При этом все данные от предыдущей работы утрачиваются. Как сделать результаты работы (переменные) доступными программам, связанным с другими кнопками? Автор вопроса: Alex Ответ ожидается по этому адресу Вопрос элементарный: как сохранить ияображение в формате JPG, GIF. Метод SavePicture сохраняет только в BMP ??? Автор вопроса: Vadim Ответ ожидается по этому адресу Как синхронияировать бд ACCESS 97/2000 ? Делал с помощью DAO: Sub InternetSynchronizeX() Dim dbsTemp As Database Set dbsTemp = OpenDatabase("C:\veda_dog\dbProf.mdb") ' Synchronize the local database with the replica on ' the Internet server. dbsTemp.Synchronize _ "http://vad.chat.ru/dbProf.mdb", _ dbRepImpExpChanges + dbRepSyncInternet dbsTemp.Close End Sub выдает ошибку :"Неправельный HTTP адрес" Автор вопроса: Vadim Ответ ожидается по этому адресу Как показать список всех процессов как это делает win2000. Автор вопроса: Корик Ответ ожидается по этому адресу 1. Есть ли в ВБ константа содержащая число ПИ? 2. Как узнать какая папка на компе обозначена под "My Documents", какая под "Desktop"? 3. Как вообще можно обратиться к системным переменным типа %Temp%? Автор вопроса: Eugene Ответ ожидается по этому адресу Как сохранить OLE объект в базе данных MS ACCESS и как затем его обратно вычитать и поместить в контрол OLE? Автор вопроса: Maxim Ответ ожидается по этому адресу Хочу узнать как извлеч корень n-ой степени из числа??? Автор вопроса: 001 Ответ ожидается по этому адресу Вопрос мой уже был яадан(про подпрограммы "на лету"), но ия-яа нехватки времени я не смог нормально объяснить, что от вас хочу, да и выраяился коряво, что первое в голову пришло. Я имел ввиду следующее: моя проблема в том, что в моей проге при каком-то условии она должна выполнять несколько операторов, я пробовал это реалияовать так: if условие1 then делать1 делать2 if условие2 then делать 3 делать 4 НО при выполнении условия1, если оно истинно, то выполняется делать1, в противном случае делать1 не выполняется, а делать 2 выполняется в любом случае то же самое и с условием2: делать3 яависит от условия2, а делать4 выполняется всегда. Можно, конечно было так: (General)|(Declarations) ------------------------------- Private Sub подпрограмма1() делать1 делать2 End Sub ------------------------------- Private sub подпрограмма2() делать3 делать4 End Sub (Button1)|(Click) -------------------------------- Private Sub Button1_Click() if условие1 then подпрограмма1 if условие2 then подпрограмма2 End Sub Но мне не надо описывать подпрограммы в модулях или еще где, можно ли какими-нибудь операторами в VB объединить делать1 и делать2, а также делать3 и делать4 в группы, не описывая их в (General)|(Declarations) или в модулях? Сравните примеры на Паскале: var a,b:integer; begin randomize; a:=random(10); b:=4 if a=3 then begin {1} a:=a+b; b:=3; {2} end; end. --------------------------------- var a,b:integer; procedure sub1 a:=a+b; b:=3; end; begin randomize; a:=random(10); b:=4; if a=3 then sub1; end. В первом примере операторы {1} и {2} - аналоги тех операторов, которые мне нужны для объединения их в подпрограмму. Но это на Паскале, а как это сделать на Visual Basic? Искренне благодарен яа любую информацию. Автор вопроса: goodroman Ответ ожидается по этому адресу Привет, у меня вот такие вопросы от которых я вообще не в понятках: 1) как VB вообще вяаимодействует с Инетом (всяческими портами)? 2) для этого есть какие-то функции, методы или ещё что? 3) мне где-то в ухо залетело, что с помощью какой-то MAPI, правильно залетело или нет? 4) если в ухо правильно залетело, то где надыбать инфу по этому MAPI? 5) и вообще чё такое этот MAPI? Это набор функций, типа API, но для взаимодействия с Инетом? 6) стоит ли вообще использовать VB для работы с инетом? Или стоит выбрать чё-нить другое? Ответы: Вопрос: Можно ли в VB вставлять в код программы подпрограммы "на лету"? Так это приблизительно выглядит на Паскале: if <какое-то условие> then ... <тело программы> ... begin ... <код подпрограммы> ... end; ... <тело программы> ... А как в Visual Basic? Ответ: Автор ответа: as Компонент Microsoft Script Control X.X и ... Private Sub Form_Load() Dim strCode As String strCode = "Sub NameMe() MsgBox ""Hello World"" End Sub" ScriptControl1.AddCode strCode ScriptControl1.Run "NameMe" End Sub Вопрос: 1) Как сделать так, чтоб при попытке удаления определённой папки в программу поступал сигал. 2) Пишу программу запрашивающую пароль при попытке открыть папку. Как при получении правильного пароля открыть обычную Windows-кую папку Ответ: Автор ответа: Sergey 1)Проще узнать что с папкой или файлом произошли изменения - с помощью WinAPI - FindFirstChangeNotification. А чтобы перехватить попытку удаления - нужно перехватывать вызовы системных ф-ций таких как DeleteFile, то есть писать свои библиотеки типа kernel32.dll и т.д. 2)Просто вызвать: Shell "explorer.exe " & sFolderPathToDisplay Вопрос: Вот такой вопрос: в текстбоксе есть определенный текст. Так вот что требуется: если первые 6 символов соответсвуют образцу (например If six number = "sobaka" Then) то будет происходить какое-то действие. Как это осуществить? Ответ: Автор ответа: VMJ Private Sub Txt_Change() if instr(ucase(Txt.text),"ABCDE")=1 then 'То что нужно сделать end if End Sub Вопрос: Какие есть API-функции для работы с *.ini файлами (если можно, пример кода) Ответ: Автор ответа: Memphis Для работы с *.ini файлами существуют следующие функции: Private Declare Function OSWritePrivateProfileString _ Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpString As Any, _ ByVal lpFileName As String _ ) As Long Private Declare Function OSGetPrivateProfileString _ Lib "kernel32" _ Alias "GetPrivateProfileStringA" ( _ ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String _ ) As Long А вот как их можно использовать (код придумал не я, я его только доработал - добавил запись в *.ini файлы). Кстати, код проверенный и на 100% рабочий (я его смастерил в виде модуля INIReaderWriter.bas и использую в трёх проектах): Option Explicit Private Declare Function OSWritePrivateProfileString _ Lib "kernel32" Alias "WritePrivateProfileStringA" ( _ ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpString As Any, _ ByVal lpFileName As String _ ) As Long Private Declare Function OSGetPrivateProfileString _ Lib "kernel32" _ Alias "GetPrivateProfileStringA" ( _ ByVal lpApplicationName As String, _ ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Long, _ ByVal lpFileName As String _ ) As Long Private Const nBUFSIZEINI = 1024 Private Const nBUFSIZEINIALL = 4096 Public Function GetPrivateProfileString(ByVal szSection As String, _ ByVal szEntry As Variant, _ ByVal szDefault As String, _ ByVal szFileName As String) As String ' szSection - это секция, например [setup] ' szEntry - это вхождение, например в секции [setup] есть вхождение File=C:\111.exe, так вот File и будет значением szEntry ' szDefault - это значение, возвращаемое по умолчанию ' szFileName - это путь и имя к INI файлу Dim szTmp As String Dim nRet As Long If (IsNull(szEntry)) Then szTmp = String$(nBUFSIZEINIALL, 0) nRet = OSGetPrivateProfileString(szSection, _ 0&, _ szDefault, _ szTmp, _ nBUFSIZEINIALL, _ szFileName) Else szTmp = String$(nBUFSIZEINI, 0) nRet = OSGetPrivateProfileString(szSection, _ CStr(szEntry), _ szDefault, _ szTmp, _ nBUFSIZEINI, _ szFileName) End If GetPrivateProfileString = Left$(szTmp, nRet) End Function Public Sub WritePrivateProfileString(ByVal szSection As String, _ ByVal szEntry As Variant, _ ByVal szString As String, _ ByVal szFileName As String) ' szSection - это секция, например [setup] ' szEntry - это вхождение, например в секции [setup] есть вхождение File=C:\111.exe, так вот File и будет значением szEntry ' szString - это строка, которая запишется в указанное вхождение (см. выше - это будет 111.exe) ' szFileName - это путь и имя к INI файлу Dim szTmp As String Dim nRet As Long If (IsNull(szEntry)) Then szTmp = String$(nBUFSIZEINIALL, 0) nRet = OSWritePrivateProfileString(szSection, _ 0&, _ szString, _ szFileName) Else szTmp = String$(nBUFSIZEINI, 0) nRet = OSWritePrivateProfileString(szSection, _ CStr(szEntry), _ szString, _ szFileName) End If End Sub Вопрос: Как размещать GIF-анимировыанные картинки на форме? Я пробовал Image, PictureBox, но ничего не помогает. Может кто-нибудь знает? Ответ: Автор ответа: vmv просто и сердито получается с помощью DSMAniGifControl (56к) Ответ: Автор ответа: Tibor Не совсем уверен что это именно то что тебе надо но советую попробовать Microsoft Internet Control Вопрос: Приобретал несколько CD с бэйсиком 6, ни один из них не хочет работать на моём компьютере. Инсталяция нормально, а потом сообщение "программа выполнила недопустимую операцию и будет закрыта" это сообщение либо после попытки сохранить пустую форму, либо при помещении на форму кнопки и попытке сохранить (пустую форму и проект некоторые крмпакты сохраняют). Не встречалась такая ситуация? Как с ней бороться? Кстати 5 Бэйсик пашет во всю... Ответ: Автор ответа: Bob Сталкивался с подобной ситуацией, после неудачных попыток победить заново поставил OS и там уже без проблем встаёт VStudio и нормально работает. Меня угнетает то что в XP работая в оболочке VB я не могу вызвать MSDN хотя установка проходит нормально т.е. после установки VStudio запрашивается CD1 с MSDN и далее остальные диски. Если узнаешь как победить напиши. Можете заполнить эту форму, либо отослать вопрос СЮДА Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта. |
|||||||||||||||
Выпуск подготовили: |
Сурменок Павел |