На этой странице располагаются советы для начинающих и опытных программистов.

1.    Первый пакет советов

2.    Второй пакет советов

 

Последующий пакет советов смотрите ниже…..



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

 

Hosted by uCoz