Visual basic корисні поради
Visual Basic: Корисні поради
Тут все, що мені коли-небудь допомогло і я хотів би цим поділитися з іншими, а також корисні поради інших користувачів.
1. Є багато програм, що знімають маски з вікон з паролями. Все, напевно, бачили: наводиш мишку на вікно із зірочками і у вікні програми-зломщика з'являється текст пароля. Програми, написані на Visual Basic НЕ защещени від цього. Іншими словами в текстовому вікні все ж знаходиться текст, тільки замаскований. Я ж знайшов як цього уникнути:
- в розділі форми General Declarations оголосіть змінну, котра міститиме код:
Dim pswd As String
- у властивостях текстового поля встановіть в PasswordChar зірочку "*". Тепер клацніть по текстовому полю два рази і виберіть подія Text1_KeyPress. впишіть:
Private Sub Text1_KeyPress (KeyAscii As Integer)
pswd = pswd + Chr (KeyAscii)
KeyAscii = Asc ( "*")
End Sub
- Тепер натискання будуть відловлювати, а передовалась будуть текстовому полю тільки зірочки! І програма-зломщик пароль вже не дістане. Якщо хтось хоче зробити так, як в Linux'e, тобто ніяких зірочок немає взагалі, то рядок KeyAscii = Asc ( "*") треба замінити на KeyAscii = 0 і все!
2.Сочітаніе операторів Chr (13) + Chr (10) можна замінювати константою vbCrLf.
3.Чтоби Ваш EXE не був запущений одночасно два рази в подія Form_Load впишіть:
Private Sub Form_Load ()
If App.PrevInstance = True Then
MsgBox "Проект уже запущений!"
End
End If
5. Якщо Ви застосовуєте у вашій програмі порівняння текстових рядків, то Вам буде корисно нагадування наступного:
- рядки однакові за змістом, але різні за написанням будyт розпізнані, як нерівні:
"Visual Basic" <> "Visual BASIC"
- якщо ж Ви хочете, щоб схожість проходило за змістом, а не з написання, то Вам доведеться перетворити обидві рядки до верхнього або нижнього регістру:
UCase ( "Visual Basic") = UCase ( "Visual BASIC")
' "VISUAL BASIC" = "VISUAL BASIC"
LCase ( "Visual Basic") = LCase ( "Visual BASIC")
' "Visual basic" = "visual basic"
- або ж поставити в General Declaration опцію Option Compare Text. Програма буде тоді розрізняти текст тільки за змістом
6. Якщо Ви хочете У MsgBox'e вивести кілька рядків і кожні раз з нового рядка, то між цими рядками потрібно вставити константу vbCrLf:
MsgBox "Галодранці" + vbCrLf + "ycix краiн" + vbCrLf + _
"Y eдiну купку" + vbCrLf + "гоп!"
7. На одному з українських сайтів, присвячених VB, я натрапив на цілу дискусію, присвячену тому, що робити і як боротися з Null (зокрема, при роботі з базами даних). Можливо, я не правий, але я завжди для цих цілей користуюся маленької функцією, вміщеній де-небудь в
модулі:
Public Function CheckNull (sCheck as String) as String
If IsNul (sCheck) Then
CheckNull = Empty
Else
CheckNull = Trim $ (sCheck)
End If
End Function
8.Очень часто замість звичайних кнопок використовуються картинки. Тобто існує всього три картинки - одна на яку будуть тиснути (img1), друга віджимання (img2) і третя натиснута (img3) (img2 і img3 - невидимі). Робимо це так:
Private Sub Form_Load ()
'При завантаженні форми картинка 1 приймає вигляд _
картинки 2 (віджимання)
img1.Picture = img2.Picture
End Sub
Private Sub Image1_MouseDown (Button As Integer. Shift As Integer. _
X As Single. Y As Single)
'При натисканні мишкою на картинку 1, вона набирає вигляду _
картинки 3 (натиснута)
img1.Picture = img3.Picture
End Sub
Private Sub Image1_MouseUp (Button As Integer. Shift As Integer. _
X As Single. Y As Single)
'При відпуску кнопки мишки картинка 1, вона знову набуває вигляду _
картинки 2 (віджимання)
img1.Picture = img2.Picture
End Sub
Цей прийом знає кожен. Але є в ньому один недолік, а саме: при серії безперервних кліків на об'єкт картинка чомусь реагує через раз. Тобто то натисне, то не натиснете. Так ось ось сам рада :-). щоб цього уникнути в подія Img1_MouseDown потрібно вставити рядок
Тобто зображенні одночасно надсилається натиснута кнопка. Чому так, зрозуміти не можу сам. Але в дужках, звичайно ж, не важлива буква "A" - там може стояти і В і С. Головне сама подія. Якщо хто-небудь може дати цьому зрозуміле пояснення - давайте! Наперед дякую!
9.Еслі протягом роботи програми Вам потрібно кілька разів змінювати значення двох змінних, то використовуйте цю процедуру:
Sub Swap (V1 As Variant. V2 As Variant)
Dim Mk As Variant
Mk = V2
V2 = V1
V1 = Mk
End Sub
виклик:
Swap x, y
ABC = Environ ( "windir")
І ВСЕ!
Але і це ще не все! Також можна отримати наступні перменная:
ABC = Environ ( "TMP") 'директорія тимчасових файлів TEMP
ABC = Environ ( "BLASTER") 'координати звукової карти
ABC = Environ ( "PATH") 'шляху, оголошені в autoexec.bat
А Й ЦЕ ВСЕ ЩЕ НЕ ВСЕ.
Щоб отримати ім'я та значення перменная, в дужках замість рядка треба поставити номер змінної (або індекс?).
Вставте следуюшую процедуру в вікно Code, запустіть проект, клікніть на формі побачите список всіх змінних і їх значень!
Private Sub Form_Click ()
'Беремо перменная і присвоюється їй одиницю
m = 1
'Запускаємо цикл, який збільшує змінну m кожен
'Раз на одиницю і підсовує її функції Environ
Do
'Прісваеваемого перменная EnvString возвращаемую перменная,
'Відповідну номеру m
EnvString = Environ (m)
'Друкуємо перменная, відповідну номеру m
Print Environ (m)
'Перменная m збільшуємо на один
m = m + 1
'Якщо перменная EnvString все ще не порожня - крутимо далі.
Loop Until EnvString = ""
End Sub
ТЕПЕР ВСЕ! ;-)) І тепер всі, хто недолюблює API-функції (по-моєму їх взагалі мало, хто долюблівает :-)) можуть користуватися тільки цим рядком!
11.Чтоби зробити форму з рамками, але без заголовка, потрібно змінити наступні її властивості:
Caption = ""
ControlBox = False
12.Якщо потрібно поміняти значення змінної As Boolean на протилежне, то замість процедури:
If ABC Then
ABC = False
Else: ABC = True
End If
можна використовувати рядок:
І тоді яке значення не містила б змінна ABC, воно (значення) стане протилежним!
13.Чтоби в меню між пунктами ввести розділову смужку, у вікні "Menu Editor" в поле "Caption" введіть "-" (тире), а поле "Name" будь-яке ім'я.
14. Якщо ваша форма містить меню, введіть в подія Form_Load цей код і під меню з'явиться маленька смужка, що підкреслює меню:
AutoRedraw = True
ScaleMode = 3
Cls
Line (0, 0) - Step (ScaleWidth, 0), QBColor (8)
Line (0, 1) - Step (ScaleWidth, 0), QBColor (15)
AutoRedraw = False