Visual2000 · Архив статей А.Колесова & О.Павловой

Советы тем, кто программирует на Visual Basic

Андрей Колесов, Ольга Павлова

© 199x, Андрей Колесов, Ольга Павлова
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" N 8/97, c. 141-147.


Совет 104. Проблемы с бета-версией VB 5.0

Судя по нашим контактам с читателями, многие из них уже познакомились с VB 5.0 на примере ее бета-версии. Соответственно, уже первого мая они обнаружили, что время, установленное для работы с ней, истекло (expired) и работа с программой заблокирована.

Однако главная неприятность заключается в следующем. Может возникнуть ситуация, когда перестанут работать и некоторые другие программы, установленные вместе с бета-версией на одном и том же компьютере. Дело в том, что блокировка запуска была направлена не только на саму программу VB, но и на ее компоненты, в том числе и на элементы управления OCX, общие для многих программ.

Самое неприятное, что при запуске такая программа (в нашем случае - программа оцифровки карт DIDGER) просто заявляла, что время ее работы истекло, не указывая конкретного модуля, в котором возникли проблемы.

В результате анализа ситуации выяснилось, что перестали работать модули COMDLG32.OCX и COMCTL32.OCX (о похожей проблеме с ними мы уже писали в Совете 88). Причем самое интересное заключалось в том, что после удаления VB5 с компьютера эти файлы остались на диске, так как было определено, что они используются в других программах. В результате пришлось удалить данные файлы вручную, а потом записать их заново, переустановив программу DIDGER.

Следует иметь в виду, что, вполне возможно, заблокированными оказались и другие общие модули VB5.

В начало статьи

Совет 105. При отладке не забывайте о сохранении проекта

Функции Windows API предоставляют программисту доступ к многочисленным расширенным функциям. Но опасность их использования заключается в том, что ответственность за корректность их применения полностью ложится на самого разработчика. Проблема же здесь заключается в том, что для изучения функций API зачастую требуется проведение серии экспериментов с ними. При этом весьма высока вероятность неверных действий со стороны программиста, в результате чего легко можно разрушить систему или тривиально "зависнуть".

Для обеспечения целостности своей работы при использовании функций API выберите команду Options из меню Tools, затем установите режим Save Before Run с подходящей для вас опцией Prompt либо Don't Prompt (запрашивать или не запрашивать подтверждение на сохранение проекта).

В начало статьи

Совет 106. Контролируйте установленные на компьютере шрифты

Если вы указываете для метки или текстового окна какой-либо шрифт, не установленный на том компьютере, где выполняется данное приложение, Windows автоматически заменит его на другой шрифт, не сообщая об этом.

Однако если отсутствующий шрифт будет в явном виде назначен для объекта, то программа аварийно завершит свою работу, выдав сообщение об ошибке "Invalid property value".

Ниже предлагается простой способ, с помощью которого можно обнаружить, установлены ли используемые в вашей программе шрифты на данном компьютере. Этот прием будет полезен при написании программ, предназначенных для широкого распространения: вполне возможно, что могут встретиться случаи, когда на компьютере отсутствует даже шрифт Arial.

Вначале создайте массив невидимых меток на своем окне запуска, используя все шрифты, которые требуются для работы вашей программы. Для каждой метки установите два свойства FontName и Tag, например, следующим образом:

lblFont(0).FontName = "Century Gothic"
lblFont(0).Tag = "Century Gothic"

lblFont(1).FontName = "Symbol"
lblFont(1).Tag = "Symbol"

Если Windows подставит другой шрифт, то свойство FontName метки изменится на новый шрифт в процессе выполнения программы. Чтобы известить своих пользователей о том, что у них не хватает каких-либо шрифтов, вызовите следующую подпрограмму в начале своей программы:

Sub CheckFonts ()

  Dim crlf As String, i As Integer, temp As String
  ' Проверка, установлены ли необходимые шрифты
  For i = 0 To 1
    If lblFont(i).FontName <> lblFont(i).Tag Then
      temp = temp & ", " & lblFont(i).Tag
    End If
  Next

  If temp <> "" Then       ' Сообщение пользователю
    MsgBox "В Вашей системе " & _
      "должны быть установлены следующие шрифты:" & _
      Chr(13) & Chr(10) & temp, 48
  End If
End Sub
Замененный шрифт можно использовать с помощью свойства FontName той метки, которая содержит нужный шрифт (или сохранить FontName в глобальной переменной):

  ' Установка шрифта Century Gothic
  picText_display.FontName = lblFont(0).FontName

В начало статьи

Совет 107. Новая утилита регистрации элементов управления

В состав Visual Basic 5.0 входит утилита, которая называется REGEDIT.EXE и находится на компакт-диске в каталоге VB50\Tools\RegUtils. Данное приложение позволяет регистрировать многочисленные OCX'ы на своем компьютере с помощью шаблонов файлов в качестве параметров командной строки. Например, чтобы зарегистрировать все OCX'ы в заданном каталоге, необходимо перейти в этот каталог и в командной строке написать REGEDIT *.OCX. Файл README, находящийся в каталоге \RegUtils, содержит инструкции для установки REGEDIT и двух других регистрирующих утилит.

В начало статьи

Совет 108. Управление шириной заголовков столбцов

При динамическом изменении свойства ColumnHeaders элемента управления ListView в режиме выполнения программы обычно заранее ничего не известно о длине текста заголовка. Поэтому пользователь должен каждый раз заново настраивать ширину столбца при просмотре таблицы. Однако, создав метку, свойство Visible которой будет установлено равным "Ложь" (False), а свойство Autosize - "Истина" (True), вы можете поместить в эту метку текст, который будет затем использоваться в качестве заголовка. После этого используйте Label1.Width в аргументе Add для ColumnHeader:

Private Sub Command1_Click()
    Dim ColumnText as String, clmx as ColumnHeader
    ColumnText = "Очень длинный текст для" &_
         "элемента управления ListView"
    Label1.Caption = ColumnText
    Set clmx = ListView1.ColumnHeaders.Add_
         (, , ColumnText, Label1.Width)
    ListView1.View = lvwReport
End Sub

В других случаях может оказаться полезной автоматическая установка одинаковой ширины всех столбцов ListView. Это выполняется с помощью такого кода:

Sub ResizeListView(ListView As ComctlLib.ListView)
  Dim head As ColumnHeader
  With ListView
    For Each head In .ColumnHeaders
      head.Width = .Width / .ColumnHeaders.Count
    Next
  End With
End Sub 

В начало статьи