Маленькие хитрости: автоматическое восстановление вида указателя курсора

в 7:01, , рубрики: Delphi, интерфейс, курсор мыши, маленькие хитрости, метки: , , ,

Добрый день, коллеги!

Те из вас, кто пишет клиентские приложения, наверняка сталкивались с необходимостью менять вид курсора, чтобы показать пользователю, что в данный момент приложение выполняет какую-то обработку данных (длительную или не очень) или выполняет запрос к базе. Хочу поделиться маленькой хитростью, как упростить себе жизнь. Подробности под катом.

Изменять вид курсора все равно придется самостоятельно, а вот восстанавливать вид курсора можно автоматически. Для этого послужит вот такой код:

type
  ICursorSaver = interface
  end;

  TCursorSaver = class(TInterfacedObject, ICursorSaver);
  private
    FCursor: TCursor;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

constructor TCursorSaver.Create;
begin
  FCursor := Screen.Cursor;
end;

destructor TCursorSaver.Destroy;
begin
  Screen.Cursor := FCursor;
  inherited;
end;

Далее в нужном месте кода объявляем переменную типа ICursorSaver и инициализируем ее.

var
  saveCursor: ICursorSaver;
begin
  saveCursor := TCursorSaver.Create;
  Screen.Cursor := crSQLWait;
// здесь свой код, выполняющий обработку данных
end;

Как это работает? TInterfacedObject ведет учет ссылок на интерфейс, когда счетчик опускается до нуля — вызывается деструктор. В начале области видимости мы создаем объект и инициализируем им интерфейсную переменную, при этом захватывается текущий вид курсора. В конце области видимости интерфейсная переменная разрушается, интерфейс освобождается, деструктор возвращает вид курсора к первоначальному состоянию.

Данный способ можно использовать для сохранения состояния не только курсора, но и состояния любых других объектов — только в этом случае нужно делать deep copy объекта.

Автор: gorynych_zmey

* - обязательные к заполнению поля