(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;

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


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

Магазин программного обеспечения   WWW.ITSHOP.RU
Enterprise Connectors (1 Year term)
IBM Rational Functional Tester Floating User License
TeeGrid VCL/FMX Source Code single license
IBM Domino Messaging Server Processor Value Unit (PVU) License + SW Subscription & Support 12 Months
VCL Subscription
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
СУБД Oracle "с нуля"
Проект mic-hard - все об XP - новости, статьи, советы
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
Обсуждения в форумах
Пишу программы на заказ профессионально (3233)
Пишу программы на заказ на языках Pascal (численные методы, списки, деревья, прерывания) под...
 
Сергей Ковалевский: Хватит платить Западу - у России должна быть своя ОС (68)
> На сегодняшний день открытых СУБД не существует. Есть довольно > примитивный MySQL, а все...
 
Как заказчики обманывают наивных художников и дизайнеров (19)
Ни один уважающий себя деловой человек не будет бесплатно раздавать свою работу и тратить время...
 
Разработка программ базы данных (44)
Написание прикладных компьютерных программ (базы данных) на заказ. Разработка корпоративных...
 
Парная нелинейная регрессия по параметрам (1)
Модуль «Парная нелинейная регрессия по параметрам». Вход: двумерный массив чисел; одномерный...
 
 
 



    
rambler's top100 Rambler's Top100