Pull to refresh

Comments 13

Тогда уж можно переименовать TCursorSaver в TCursorChanger и передавать ему новый курсор в конструктор. Будет более SRPшно.
А если курсор поменять нужно более чем на время жизненного цикла одной функции? К примеру, у меня асинхронная загрузка 1000 html документов, и курсор должен оставаться в виде crSomeWait, пока не придет последний ответ. Я так понимаю, с таким примером, ваш метод не пройдет?
Если созданный интерфейс будет сохраняться на протяжении всей цепочки вызовов (передачей в виде параметра или сохранением в какое-то приватное поле класса, в рамках которого работает асинхронная загрузка) — то подойдет.
Ну тогда нужно будет явно удалять экземпляр TCursorSaver, а это уже не автоматически…
Почему? Я уже писал в статье, что у TInterfacedObject есть счетчик использований. Нужно, чтобы до конца всей цепочки вызовов где-то имелась хотя бы одна ссылка на интерфейс, а в конце цепочки вызовов эта ссылка разрушалась — вместе с TCursorSaver.
Как вариант — можно инициализировать ICursorSaver перед вызовом цепочки, и передавать его в каждый блок загрузки. Тогда счетчик использований обнулится в конце последнего блока загрузки — и курсор вернется в нормальное состояние.
передавать его в каждый блок загрузки — беда беда. Так нельзя делать, это будет сложнее чем так не делать.

В этом то и суть, что чтобы убрать из него последнюю ссылку — нужно что-то сделать, а если нужно что-то сделать — это уже не автоматически).
Не зная, как у вас ваша асинхронная загрузка реализована — сложно что-то подсказать. Но общее направление поиска возможного решения — удерживать созданный интерфейс используемым (т.е. с ненулевым счетчиком) до самого последнего блока выполнения. Как это сделать, и насколько это будет целесообразно — вам виднее.
Да нет у меня никакой асинхронной загрузки), я пытался указать на сложности при необходимости изменения курсора более чем на жизненный цикл одного метода. Конечно можно модернизировать ваш пример для чего угодно, но в этом случае уже легче будет самостоятельно возвращать курсор, имхо.
Можно еще оптимизировать:
Определить Create как
constructor Create(ACursor: TCursor = crHourGlass);

и добавить в него
ScreenCursor := ACursor;

Тогда код вызова станет на одну строку меньше.
*чешет затылок*
А я по-старинке делал что-то типа
procedure busy(flag: boolean);
begin
    if flag then
        screen.cursor:=crSQLwait
    else
        screen.cursor:=crNormal;
    PanelWait.visible:=flag
end;

Ну и перед тяжёлыми вычислениями вызывал busy(true), а по завершении — busy(false).
Я делал в JQuery стиле:
procedure SetBusy(IsBusy: boolean = true); begin if IsBusy then screen.cursor:=crSQLwait else screen.cursor:=crNormal; end;
Вызов
SetBusy; // я занят, нихт троген! SetBusy(false); // свободен, яя арбайтен финиш
UFO just landed and posted this here
Что это? А то гугл разленился, показывает только этот Ваш коммент…
Sign up to leave a comment.

Articles