Здесь всё, что мне когда-нибудь помогло и я хотел бы этим
поделиться с другими, а также полезные советы других пользователей.
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 |