Календарь на Май 2024 года: calendar2008.ru/2024/may/
Навигация
Главная »  Sql 

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


Источник: 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;


 

 Сколько стоит update?.
 Формирование хранимых шаблонов в Oracle 9.
 Oracle_trace - лучшее встроенное средство диагностики.
 Первичный ключ - составной или суррогатный?.
 Мониторинг использования индексов в планах запросов в Oracle 10g.


Главная »  Sql 

© 2024 Team.Furia.Ru.
Частичное копирование материалов разрешено.