Visual Basic (FAQ

Зміст:
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


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*