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
4.Чтобы
запустить на VB5.0 исходники,
написанные на VB6.0 откройте
файл проекта с расширением VBP
каким-нибудь текстовым
редактором и удалите строки:
Retained
= 0
DebugStartupOption
= 0
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 нужно вставить строку
SendKeys
"A"
Т.е.
картинке одновременно
посылается нажатая клавиша.
Почему так, понять не могу сам.
Но в скобках, конечно же, не
важна буква "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
Но объявление
перменных желательно поменять
с Variant на то, которое нужно Вам -
меньше памяти надо будет. А эта
процедура - универсальна! Чтобы
не содержали аргументы V1 и V2, их
значения поменяются местами.
10. В Бэйсике есть
одна ОЧЕНЬ полезная, но
многими забытая функция Environ!
Она возвращает имена и
содержание всех переменных
среды операционной системы!!!
Так, например, чтобы получить
директорию Windows, совсем не надо
прибегать к API-функции
GetWindowsDirectory!!!!!! А получить её
можно так:
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 = Not ABC
И
тогда какое значение не
содержала бы переменная 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
|