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;
Ссылки по теме