Среда, 18.06.2025, 03:55
Приветствую Вас Гость | RSS
Меню сайта
fff
  • Индексация
  • Девочки
    Форма входа
    Категории раздела
    Теория алгоритмов [3]
    Теория алгоритмов
    Code Snippets [1]
    Code Snippets
    Все о PHP [20]
    Все о PHP
    Visual C++ [13]
    Visual C++
    WIN32 API [7]
    WIN32 API
    Delphi [72]
    Delphi
    ASP [2]
    ASP
    Java [67]
    Java
    VBScript [6]
    VBScript
    CGI [2]
    CGI
    VRML [2]
    VRML
    PERL [9]
    PERL
    HTML [4]
    HTML
    XML [10]
    XML
    Архив записей

    Статьи по Оптимизации

    ПРОГРАММИРОВАНИЕ! СОЗДАНИЕ САЙТОВ И ИХ ОПТИМИЗАЦИЯ

    Главная » Статьи » Программирование » Delphi

    Задержка выполнения On
    Задержка выполнения On
    В случае нажатия пользователем клавиши или изменении текущего элемента компонента ComboBox, вы обратите внимание на досадную задержку, возникающую при генерации события On.

    Так как "работа кипит", я хотел бы отреагировать на изменение ItemIndex несколько позднее, например, 100 миллисекунд спустя. Вот что у меня получилось. На простой форме располагаем компоненты ComboBox и Label. Необходимым дополнением является вызов Application.ProcessMessages, позволяющий избежать замедления работы PC, когда очередь сообщений для формы пуста.
    unit Unit1;

    interface

    uses

    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
    Dialogs,

    StdCtrls;

    const

    // Просто некоторая константа сообщения
    PM_COMBO = WM_USER + 8001;

    // 500 миллисекунд
    CWantedDelay = 500;

    type

    TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Label1: TLabel;
    procedure ComboBox1(Sender: TObject);
    private
    procedure PMCombo(var message : TMessage); message PM_COMBO;
    public
    end;

    var

    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.ComboBox1(Sender: TObject);
    begin

    PostMessage(Handle, PM_COMBO, 0, 0);
    end;

    procedure TForm1.PMCombo(var message : TMessage);
    const

    InProc : BOOLEAN = FALSE;
    StartTick : LONGINT = 0;
    begin

    if InProc then begin
    // Обновляем стартовое время задержки
    StartTick := GetTickCount;

    end else begin
    // Организация цикла
    InProc := TRUE;

    // Инициализация стартового времени
    StartTick := GetTickCount;

    // Ожидаем истечения стартового времени.
    // Пока стартовое время не исчерпалось, позволяем операционной системе обрабатывать сообщения
    while GetTickCount - StartTick < CWantedDelay do Application.ProcessMessages;

    // Иллюстративное приращение счетчика, задающее некоторую реальную работу обработчику события On
    Label1.Caption := IntToStr ( StrToIntDef ( Label1.Caption, 0 ) + 1);

    // Завершение цикла
    InProc := FALSE;
    end;
    end;

    end.

    Категория: Delphi | Добавил: Merlin (07.12.2009)
    Просмотров: 961 | Комментарии: 1 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *: