Вы можете значительно улучшить формы и элементы управления в вашем приложении, если оптимизируете их производительность.

Например, использование в формах и отчетах среды данных (data environment), позволяет открывать таблицы гораздо быстрее, чем при при выполнении команд USE, SET ORDER или SET RELATION из события Load. Когда вы используете среду данных, Visual FoxPro применяет для открытия таблиц и установке индексов и отношений между таблицами механизм доступа к данным на низком уровне.

Ограничивайте количество форм в наборе форм (Form Set)

Применяйте наборы форм только в том случае, если несколько форм должны совместно использовать приватный сеанс данных (private data session). Когда Вы используете набор форм, Visual FoxPro создает экземпляры всех форм и их элементов управления для всех формах в наборе, даже в том случае, если только первая форма из набора является единственной отображаемой формой. Это может быть занять много времени и не требуется для форм, которые не должны совместно использовать приватный сеанс данных.

Use form sets only when it is necessary to have a group of forms share a private data session. When you use a form set, Visual FoxPro creates instances of all forms and all controls on all forms in the form set, even though the first form in the form set is the only one being displayed. This can be time consuming, and is unnecessary if the forms don't have to share a private data session. В этом случае, вместо использования набора форм, вы должны выполнить команду DO FORM для вызова других форм только тогда, когда они будут необходимы.

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

Динамическая загрузка страниц (Page Controls) в страничном фрейме (блоке) (Page Frame)

Подобно набору форм, при загрузке страничного фрейма будут загружаться все элементы управления на каждой его странице, что может стать причиной замедления загрузки страничного фрейма. Взамен этого, вы можете динамически загружать страницы, когда это потребуется, путем заблаговременного создания классов  элементов управления для этих страниц и их загрузки в момент активизациинужной страницы.

Ниже приводится схема динамической загрузки страниц:

  1. Конструируется форма и в нее, как правило, включаются все элементы управления на всех страницах.

  2. Когда конструирование завершено, перейдите на вторую страницу вашего страничного фрейма и сохраните элементы управления как класс (save as a class).

  3. Откройте созданный вами класс для того, чтобы убедиться в правильном расположении элементов управления.

  4. Повторите шаги 2 и 3 для третьей и последующих страниц фрейма.

  5. В событии Activate второй и последующих страниц добавьте объекты и сделайте их видимыми.

    Например, если ваш класс элементов управления называется cnrpage1, то вы должны поместить следующий код:

      Копировать код
    IF THIS.ControlCount = 0
    THIS.AddObject("cnrpage1","cnrpage1")
    THIS.cnrpage1.Visible = .T.
    ENDIF

Динамическое связывание элементов управления с данными

Вы можете уменьшить время загрузки формы, которая содержит много связанных с данными элементов управления, если отсрочите связь этих элементов управления до тех пор, пока она понадобиться.

Ниже приводится схема процесса динамического связывания элементов управления с данными:

  1. Поместите таблицы и представления для вашей формы в среду данных так, чтобы они открывались при загрузке формы.

  2. Для каждого связываемого элемента управления поместите в событие GotFocus код, который свяжет его со значением данных при получении фокуса этим элементом управления.

    Например, следующий код связывает элемент управления ComboBox с полем customer.company:

      Копировать код
    * Проверка правильности связывания элемента управления.
    IF THIS.RecordSource = ""
    * Присвоение свойству RecordSource значения имени поля
    THIS.RecordSource = "customer.company"
    * Присвоение свойству RecordSourceType типа "поле"
    THIS.RecordSourceType = 6
    THIS.Refresh
    ENDIF

Отсрочка обновления экрана

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

Например, предположим, что вы захотите сделать элементы управления видимыми или невидимыми, изменить их цвета, или поменять записи в связанных элементах управления. Рекомендуем отсрочить перерисовку этих элементов управления дополного окончания требуемых изменений.

Ниже приводится схема процесса отсрочки обновления экрана:

  1. Присвойте свойству формы LockScreen значение .T. (Истина).

  2. Скорректируйте элементы управления как требуется.

  3. Вызовите метод формы Refresh.

  4. Присвойте свойству формы LockScreen значение .F. (Ложь).

Совет:
Эта техника не обеспечивает увеличение производительности при обновлении одного-единственного элемента управления.

Например, следующий код изменяет сразу несколько экранные свойства, перемещает указатели на новые записи и, только затем, выводит на экран новую информацию. Если вначале кода не присвоить свойству LockScreen значения .T., то экран будет обновляться после каждого изменения, затрагивающего конкретные элементы управления, а это снизит производительность всей операции обновления:

  Копировать код
THISFORM.LockScreen = .T.
THISFORM.MyButton.Caption = "Сохранить"
THISFORM.MyGrid.BackColor = RGB (255, 0, 0) && Красный
SKIP IN customers
SKIP IN orders
THISFORM.Refresh
THISFORM.LockScreen = .F.

Сокращение кода в часто используемых методах

Ввиду того, что метод Refresh и событие Paint вызываются довольно часто, вы можете увеличить производительность работы форм, сократив в них количество строк кода. Аналогично, для ускорения загрузки формы вы должны переместить код из события Init в нечасто используемые события, такие как Activate, Click, и GotFocus. При этом, вы должны использовать какое-то свойство (например, Tag или пользовательское свойство) для отслеживания того, чтобы этот код был выполнен только один раз.

См. также