Оглавление:
1.Имитация клика по кнопке на любой форме (Пример: клик по кнопке Пуск)
2.Определение начальной и конечной позиции текста (Пример: определение текста до курсора в окне)
3.Построение графиков функции (Пример: построение графика функции y = x ^ 3 - 12 * x ^ 2 + 3 ^ x)
4.Получение случайного числа в заданном интервале (Пример: получение случайного числа в интервале от 0 до 10)
5.Определение размера файла в байтах (Пример:определение размера файла, определенного пользователем)
6.Считывание всех данных из файла (Пример: считывание информации из файла указанного пользователем).
7.Создания индикатора процесса ( в просторечии ProgressBar-а)
Имитация клика по кнопке на любой форме.
Пример: имитация клика по кнопке Пуск.
>Извините, как можно сымитировать клик по кнопке, расположенной на форме другой программы? Можно ли вообще это сделать?
Это достаточно легко сделать. Для начала нужно определиться, на что мы будем нажимать (то есть получить описатель этой кнопочки). Для этого понадобятся функции поиска формы, а также элемента формы.
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Для примера я предлагаю сымитировать клик по кнопке Пуск. Тогда нужно объявить следующие константы.
Private WndWind As Long ' Описатель окна
Private WbdButton As Long 'Описатель кнопки
И при загрузке вашей формы впишем такой код:
Private Sub Form_Load()
WndWind = FindWindow("Shell_TrayWnd", vbNullString) 'Ищем системную панель, на которой и находится нужная кнопка
WbdButton = FindWindowEx(WndWind, 0, "Button", vbNullString) 'Ищем кнопку на панели
End Sub
Вот мы и нашли кнопку Пуск. Теперь на нее нужно кликнуть. Т.к. клик - своего рада сообщение посылаемое кнопке, то воспользуемся функцией SendMessage
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Для того чтобы посылать клик, нужно объявить константу (они все обитают в MSDN).
Const BM_CLICK = &HF5
Для примера сделаем так: добавим на форму кнопочку, а в нее вставим такой код:
Private Sub Command1_Click()
Call SendMessage(WbdButton, BM_CLICK, 0, 0) ' Здесь нули, т.к. wMsg и wParam, мне кажется для клика не нужны
End Sub
Вот и все. Теперь при щелчке по нашей кнопке будет разворачиваться меню пуск
Листинг:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Const BM_CLICK = &HF5
Private WndWind As Long
Private WbdButton As Long
Private Sub Command1_Click()
Call SendMessage(WbdButton, BM_CLICK, 0, 0)
End Sub
Private Sub Form_Load()
WndWind = FindWindow("Shell_TrayWnd", vbNullString)
WbdButton = FindWindowEx(WndWind, 0, "Button", vbNullString)
End Sub
Определение начальной и конечной позиции текста
Пример: получение текста из текстового поля до курсора и после курсора.
>Мне нужно получить символы в текстовой строке идущие до курсора, я получаю начальную позицию текста и конечную позицию текста с помощью функции SendMessage, а как получить символы до курсора - не знаю.
Опять функция SendMessage - сговорились вы что ли? Ладно.
Самое сложное вы уже сделали, получили начальную и конечную позицию текста. Я тоже это сделал, теперь можно попытаться получить символы в строке до и после курсора. Если вы говорите, что вам их надо получить, тогда давайте выдавать их на печать, типа Print-ом. (До этого сохраняя в переменной, как вам это нужно).
Объявляем функцию и константу (кстати я не знал об этом способе применения до вашего письма).
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const EM_GETSEL = &HB0
Поместите на форме текстовое поле Text1, и заполните его текстом, наприме: "Это проверка работоспособности кода". Теперь само событие. Выделение текста заканчивается отпусканием кнопки мышь, тогда и вставим код:
Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Call SendMessage(Text1.hwnd, EM_GETSEL, begintext, curpos) 'Получаем 0 (начальная позиция) и число, являющееся позицией 'курсора
docursora = Mid(Text1.Text, begintext + 1, curpos - begintext) ' К начальной позиции прибавляем 1, т.к. она всегда ноль
Print "Текст до курсора: ", docursora
End Sub
Так мы получаем текст находящийся до курсора, помещаем его в переменную и выдаем на форму.
Листинг:
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Const EM_GETSEL = &HB0
Dim begintext As Long
Dim curpos As Long
Private Sub Text1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Call SendMessage(Text1.hwnd, EM_GETSEL, begintext, curpos)
docursora = Mid(Text1.Text, begintext + 1, curpos - begintext)
Print "Текст до курсора: ", docursora
End Sub
Построение графиков функций
Пример: построение графика функции y = x ^ 3 - 12 * x ^ 2 + 3 ^ x
> Гайдар, объясните идиоту. Как, ну как строить графики?!? Как??????
Для построения графика любой функции очень удобно ввести свои собственные координаты. Т.к. тогда вывод графической информации будет осуществляться там, где вам нужно, без сложных переводов. Причем задать собственную систему координат очень просто.
Для этого вам нужно установить значения ScaleHeight и ScaleTop для определения вашей оси ординат (Y). Например, ScaleHeight=-1000 ScaleTop=500 (YI [-500;500]). То есть как бы ScaleTop определяет верхнее значения, а ScaleHeight длину всей шкалы, причем длина определяется отнимая ScaleHeight из ScaleTop. Поэтому ScaleTop должен быть положительным.
Для задания оси абсцисс (X) нужно установить ScaleLeft и ScaleWidth. Исходя из предшествующих рассуждений, можно заявить, что ScaleLeft должен быть отрицательным.
Также необходимым параметром является DrawWidth, определяющий толщину рисуемой линии.
Для примера можно рассмотреть какую-нибудь простенькую функцию и построить ее.
Ну, к примеру: y=x^3-12x^2+3^x.
Пусть печать происходит прямо из функции:
Function Example(ByVal x As Single)
'здесь задается наша функция
y = x ^ 3 - 12 * x ^ 2 + 3 ^ x
‘тут она выводится на форму (каждая из полученных точек)
Debug.Print y
‘Посылаем y в ответ для дальнейшей работы в программе.
Example = y
End Function
Теперь еще нужно построить график. Это мы сделаем по нажатию на кнопку в меню. Сделайте менюшку по вашему вкусу и обязательно поместите там пунк Построить график (name=mnuDraw).
Private Sub mnuDraw_Click()
Form1.BackColor = &H80000009 ‘На белой форме смотрится эффектнее
‘Толщина линий обозначающих координатные оси
DrawWidth = 2
‘Масштабирование
Scale (-10, 200)-(10, -200)
‘Рисование осей
Form1.ForeColor=&H0& ‘На всякий случай
Line (-10, 0)-(10, 0)
Line (0, -200)-(0, 200)
‘А график смотрится лучше когда он тоньше, чем оси
DrawWidth = 1
‘А вот собственно и само построение графика
Form1.ForeColor = &HFF& ‘Другим цветом график смотрится красиво
For x = -10 To 10 Step 0.01 ‘Чем точнее, тем линии плавнее
Line -(x, Example(x)) ‘Построение
Next
End Sub
<
Вообще-то график уже построен, но нужны некоторые доработки, например, в событие Resize формы можно вставить код отвечающий для изменения ваших параметров. Но для нашего примера хватит и этого:
Private Sub Form_Resize()
Refresh
End Sub
Листинг программы построения графика:
(Form1,mnuDraw) - необходимые части содержимого формы
Function Example(ByVal x As Single)
y = x ^ 3 - 12 * x ^ 2 + 3 ^ x
Debug.Print y
Example = y
End Function
Private Sub Form_Resize()
Refresh
End Sub
Private Sub mnuDraw_Click()
Form1.BackColor = &H80000009
DrawWidth = 2
Scale (-10, 200)-(10, -200)
Form1.ForeColor = &H0&
Line (-10, 0)-(10, 0)
Line (0, -200)-(0, 200)
DrawWidth = 1
Form1.ForeColor = &HFF&
For x = -10 To 10 Step 0.01
Line -(x, Example(x))
Next
End Sub
Получение случайного числа в заданном интервале
Пример: получение случайного числа в интервале от 0 до 10
>Гайдар, не могли бы вы ответить, как получить случайное число в VB, такое, чтобы оно было где-то между заданным минимальным и максимальным параметром. Прости я пробовал делать это rnd(number) но число получается меньше единицы. А мне для создания игры требуется получать числа от 11 до 444. Возможно ли это на VB, т.к. в Perl есть такая функция, то я думал, что и в VB она может быть.
Да вы правы. Но не совсем, т.к. rnd возвращает значение от 0 до единицы [0,1) - если кто помнит школьную математику, то поймет, что ноль в интервал включен, а единица нет. Я не буду рассуждать на тему существования\несуществования истинно случайных чисел. Просто скажу, что при каждом перезапуске программы числа попадаются в той же последовательности, что и при предыдущем запуске. Хотя конечно можно что-то придумать :-).
Отвечаю на вопрос. Существует такая известная формула получения случайного числа: Int((maxVal - minVal + 1) * Rnd + minVal), это и есть способ получения случайного числа.
Для проверки этого напишем пример. Создадим форму и впишем:
Private Sub Form_Click()
Dim RndVal
RndVal = Int(11 * Rnd) ' Int(10-0 +1)*rnd + 0), а Int, т.к нам нужно целое число
MsgBox RndVal
End Sub
Это даже программой назвать трудно, кода уж слишком мало! Но это дело можно легко исправить и почти вдвое увеличить длину кода, это мы сделаем чтобы сделать числа еще более случайными. Для того чтобы реализовать механизм генерации случайных чисел впишем следующий код, с событие загрузки формы, т.к. он немного изменен:
Листинг:
Private Sub Form_Click()
Dim RndValue
Randomize ' Инициализация генератора случайных чисел
Do
RndValue = Int((11 * Rnd)) 'Опять же получаем число от 0 до 10
MsgBox RndValue, vbInformation, "Ваше случайное число"
Dim iMsg As Integer
iMsg = MsgBox("Генерировать еще одно число?", 36, "Генератор случайных чисел")
Select Case iMsg
Case vbYes
Case vbNo
End 'Если ответ положительный, то выход из генератора
End Select
Loop
End Sub
Определение размера файла в байтах
Пример:определение размера файла, определенного пользователем
>Привет сенсеям, а не подскажите как размер файла определить, не открывая его, а то лишний код набивать - лень.
Лень - двигатель прогресса. Поэтому в VB есть такая неплохая функция, типа FileLen. Пишете следующее: FileLen("YourFilePath")
Листинг
Поместите на форме два текстовых окна и кнопку.
Private Sub Command1_Click()
On Error GoTo err_
Text2.Text=FileLen(Text1.Text)
Exit Sub
err_:
msgbox"Введите правильный путь!",16,"Ошибка"
End Sub
Считывание всех данных из файла
Пример: считывание информации из файла указанного пользователем).
>Помогите!!!!! Мне нужно считать в переменную все содержимое файла. Как это быстро сделать. (А еще хорошо бы просто и понятно).
Всем бы просто и понятно только и нужно. Ну это сделать элементарно. Код выглядит примерно так:
MyData = Input$(FileLen(YourFile),YourFile) ' Конечно сначала его нужно открыть (см. листинг)
Листинг:
Поместите на форме Command1 и Text1, Text2 (Multiline=True).
Private Sub Command1_Click()
Open Text1.Text For Input As #1
Text2.Text=Input$(LOF(1),1) 'LOF - так определяется длина открытого файла, просто пишется короче, чем FileLen
Close #1
End Sub
Создания индикатора процесса ( в просторечии ProgressBar-а)
>Простите за идиотский вопрос, я знаю конечно, что и так этой ерунда навалом, но как мне сделать собственный Progress Bar, но не тащить его за программой отдельной библиотекой, а встроить его именно там, где он нужен. Можно без текущих процентов, но желательно, чтобы код был небольшим.
Вот требования пошли - чтобы код был небольшим. А когда я гигантов предлагал?
Самый простой способ такой - берете картинку (полоску цвет который вам больше нравится), эта картинка и будет вашим прогрессом. Эту картинку мышкой на форме сворачиваете до минимуму (по длине, а по ширине оставьте такой, какая должна быть в конце. Эту полосочку помещаете точно на лейбл, длина и ширина которого совпадает с длиной и шириной развернутой полоски. Ставите BorderStyle = 1 - Fixed Single. Также нужно поместить таймер, в котором это все и будет происходить.
Вот и все. Теперь осталось добавить код:
Private Sub Timer1_Timer()
Picture1.Width = Picture1.Width + 10 'Каждый интервал прибавляется 10
If Picture1.Width = Label1.Width Then Picture1.Width = 0 'Когда достигается конец лейбла происходит сброс до начального значения
End Sub
Для инициализации таймера используем событие Form_Load, а для остановки процесса Form_Click. Для возобновления процесса используем Form_DblClick.
Private Sub Form_Click()
Timer1.Enabled = False
End Sub
Private Sub Form_DblClick()
Timer1.Enabled = True
End Sub
Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Листинг
Private Sub Form_Click()
Timer1.Enabled = False
End Sub
Private Sub Form_DblClick()
Timer1.Enabled = True
End Sub
Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer()
Picture2.Width = Picture2.Width + 10
If Picture2.Width = Picture1.Width Then Picture2.Width = 0
End Sub