(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

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

Источник: habrahabr
gorynych_zmey

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

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

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

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 объекта.

UPD: Коллеги romik и koreec предлагают устанавливать вид курсора прямо в конструкторе. Тогда конструктор будет выглядеть так:

constructor TCursorSaver.Create(ACursor: TCursor = crHourGlass);
begin
  FCursor := Screen.Cursor;
  Screen.Cursor := ACursor;
end;

Ссылки по теме


 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 16.11.2012 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Delphi Professional Named User
Enterprise Connectors (1 Year term)
SmartBear AQtime Pro - Node-Locked License (Includes 1 Year Maintenance)
NERO 2016 Classic ESD. Электронный ключ
IBM Domino Messaging Server Processor Value Unit (PVU) License + SW Subscription & Support 12 Months
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Вопросы и ответы по MS SQL Server
Компьютерная библиотека: книги, статьи, полезные ссылки
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100