Этот выпуск немного задержался по техническим причинам. Только начал его создавать, начал капитально глючить IIS. Запустил "Восстановление системы". Но вместо восстановления оно полностью обрушило систему. Вот они, славные продукты MS... В пятницу пытался поднять Windows цивилизованными методами. Не удалось. А вчера format C:, потом установка и настройка программ, распаковка тонн архивов... Зато несколько гигабайт на диске осовбодилось - покупку нового винта можно на пару недель отложить. Правильно говорят - нет худа без добра.
Читайте!
Эта книга была задумана как одна из первых книг о .NET, которая ознакомит читателя с основными идеями новой архитектуры и подготовит его к знакомству с более детальной литературой, например документацией Microsoft и ее толкованиями, которая неизбежно появится на рынке. Она поможет вам взглянуть на эту технологию с позиций ваших собственных рабочих планов и быстро освоить те концепции, которые покажутся необычными для большинства прогр...
Автор(ы): Дан Эпплман, Издательство: Питер, 2002 г.
Эта книга является вводным курсом по
изучению языка программирования Visual Basic .NET.
Даны основные принципы объектно-ориентированного
программирования в контексте языка VB .NET,
поскольку без хорошей подготовки в этой
области невозможно в полной мере
пользоваться всеми преимуществами VB .NET.
Изложены азы всех аспектов языка, которыми
должен владеть любой профессиональный
разработчик VB .NET
Автор(ы): Г. Корнелл, Дж. Моррисон, Издательство: Питер, 2002 г.
Основная задача книги - быстро ознакомить
разработчиков Visual Basic с изменениями в .NET
Framework. Программисты, использующие Java, C++, Delphi
или другие инструменты разработки
приложений и интересующиеся Visual Basic или
технологией .NET Framework, также найдут эту книгу
полезной. Хотя книга посвящена Visual Basic.NET, ее
основная цель - продемонстрировать
взаимодействие Visual Basic и ...
Автор(ы): Кит Франклин, Издательство: Вильямс, 2002 г.
Добавьте на форму элемент 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)
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 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
Получение длинного и короткого имени файла/директории
Данный вопрос очень часто звучит на многих форумах: "Как мне получить короткое имя файла" или "Как мне получить длинное имя файла, зная короткое". Далее следует ответ на эти вопросы.
P.S. Надеюсь, мне не надо объяснять что такое "длинное"/"короткое" имя файла. :))
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 Microsoft Agent реализует диалог программы с
пользователем, используя при этом технологию Microsoft Agent. OCX реализует три
типа диалоговых окон: InputBox, MsgBox и MsgLabels.
Имеется: форма, распахнутая на весь экран, на форме - PictureBox (или Image - сейчас это не суть важно), в PictureBox загружается картинка. Суть проблемы: необходимо, чтобы картинка масштабировалась под размеры экрана (а так как форма распахнута на весь экран - следовательно, под размеры формы).
Пример масштабирования картинки из выпуска 141 рассылки не помог.
Объясните, пожалуйста, как с помощью MMControl проиграть MP3 файл.
Я пробовал его переделать ия примера, который играет WAV файлы, там есть такое свойство DeviceType, яначение которого "WaveAudio". Какое значение этого свойства должно быть для MP3?
Вояможно, в этом моя проблема? Поделитесь кодом, кто может.
На форме имется несколько кнопок. Каждая запускает определенную программу. После отработки программы ожидается нажатие другой кнопки. При этом все данные от предыдущей работы утрачиваются. Как сделать результаты работы (переменные) доступными программам, связанным с другими кнопками?
Как синхронияировать бд 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
1. Есть ли в ВБ константа содержащая число ПИ?
2. Как узнать какая папка на компе обозначена под "My Documents", какая под "Desktop"?
3. Как вообще можно обратиться к системным переменным типа %Temp%?
Вопрос мой уже был яадан(про подпрограммы "на лету"), но ия-яа нехватки времени я не смог нормально объяснить, что от вас хочу, да и выраяился коряво, что первое в голову пришло. Я имел ввиду следующее: моя проблема в том, что в моей проге при каком-то условии она должна выполнять несколько операторов, я пробовал это реалияовать так:
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?
Привет, у меня вот такие вопросы от которых я вообще не в понятках:
1) как VB вообще вяаимодействует с Инетом (всяческими портами)?
2) для этого есть какие-то функции, методы или ещё что?
3) мне где-то в ухо залетело, что с помощью какой-то MAPI, правильно залетело или нет?
4) если в ухо правильно залетело, то где надыбать инфу по этому MAPI?
5) и вообще чё такое этот MAPI? Это набор функций, типа API, но для взаимодействия с Инетом?
6) стоит ли вообще использовать VB для работы с инетом? Или стоит выбрать чё-нить другое?
Ответы:
Вопрос:
Можно ли в VB вставлять в код программы подпрограммы "на лету"?
Так это приблизительно выглядит на Паскале:
if <какое-то условие> then
...
<тело программы>
...
begin
...
<код подпрограммы>
...
end;
...
<тело программы>
...
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-кую папку
1)Проще узнать что с папкой или файлом произошли изменения - с помощью WinAPI - FindFirstChangeNotification. А чтобы перехватить попытку удаления - нужно перехватывать вызовы системных ф-ций таких как DeleteFile, то есть писать свои библиотеки типа kernel32.dll и т.д.
2)Просто вызвать: Shell "explorer.exe " & sFolderPathToDisplay
Вопрос:
Вот такой вопрос: в текстбоксе есть определенный текст. Так вот что требуется: если первые 6 символов соответсвуют образцу (например If six number = "sobaka" Then) то будет происходить какое-то действие. Как это осуществить?
Для работы с *.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
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, но ничего не помогает. Может кто-нибудь знает?
Не совсем уверен что это именно то что тебе надо но советую попробовать Microsoft Internet Control
Вопрос:
Приобретал несколько CD с бэйсиком 6, ни один из них не хочет работать на моём компьютере. Инсталяция нормально, а потом сообщение "программа выполнила недопустимую операцию и будет закрыта" это сообщение либо после попытки сохранить пустую форму, либо при помещении на форму кнопки и попытке сохранить (пустую форму и проект некоторые крмпакты сохраняют).
Не встречалась такая ситуация?
Как с ней бороться?
Кстати 5 Бэйсик пашет во всю...
Сталкивался с подобной ситуацией, после неудачных попыток победить заново поставил OS и там уже без проблем встаёт VStudio и нормально работает. Меня угнетает то что в XP работая в оболочке VB я не могу вызвать MSDN хотя установка проходит нормально т.е. после установки VStudio запрашивается CD1 с MSDN и далее остальные диски.
Если узнаешь как победить напиши.
Можете заполнить эту форму, либо отослать вопрос СЮДА
Форма для добавления нового вопроса в этот раздел. Информация отсылается по E-mail владельцу сайта.