Comments 13
Тогда уж можно переименовать TCursorSaver в TCursorChanger и передавать ему новый курсор в конструктор. Будет более SRPшно.
+1
А если курсор поменять нужно более чем на время жизненного цикла одной функции? К примеру, у меня асинхронная загрузка 1000 html документов, и курсор должен оставаться в виде crSomeWait, пока не придет последний ответ. Я так понимаю, с таким примером, ваш метод не пройдет?
+2
Если созданный интерфейс будет сохраняться на протяжении всей цепочки вызовов (передачей в виде параметра или сохранением в какое-то приватное поле класса, в рамках которого работает асинхронная загрузка) — то подойдет.
+1
Ну тогда нужно будет явно удалять экземпляр TCursorSaver, а это уже не автоматически…
0
Почему? Я уже писал в статье, что у TInterfacedObject есть счетчик использований. Нужно, чтобы до конца всей цепочки вызовов где-то имелась хотя бы одна ссылка на интерфейс, а в конце цепочки вызовов эта ссылка разрушалась — вместе с TCursorSaver.
Как вариант — можно инициализировать ICursorSaver перед вызовом цепочки, и передавать его в каждый блок загрузки. Тогда счетчик использований обнулится в конце последнего блока загрузки — и курсор вернется в нормальное состояние.
Как вариант — можно инициализировать ICursorSaver перед вызовом цепочки, и передавать его в каждый блок загрузки. Тогда счетчик использований обнулится в конце последнего блока загрузки — и курсор вернется в нормальное состояние.
0
передавать его в каждый блок загрузки — беда беда. Так нельзя делать, это будет сложнее чем так не делать.
В этом то и суть, что чтобы убрать из него последнюю ссылку — нужно что-то сделать, а если нужно что-то сделать — это уже не автоматически).
В этом то и суть, что чтобы убрать из него последнюю ссылку — нужно что-то сделать, а если нужно что-то сделать — это уже не автоматически).
0
Не зная, как у вас ваша асинхронная загрузка реализована — сложно что-то подсказать. Но общее направление поиска возможного решения — удерживать созданный интерфейс используемым (т.е. с ненулевым счетчиком) до самого последнего блока выполнения. Как это сделать, и насколько это будет целесообразно — вам виднее.
0
Можно еще оптимизировать:
Определить Create как
и добавить в него
Тогда код вызова станет на одну строку меньше.
Определить Create как
constructor Create(ACursor: TCursor = crHourGlass);
и добавить в него
ScreenCursor := ACursor;
Тогда код вызова станет на одну строку меньше.
+2
*чешет затылок*
А я по-старинке делал что-то типа
Ну и перед тяжёлыми вычислениями вызывал busy(true), а по завершении — busy(false).
А я по-старинке делал что-то типа
procedure busy(flag: boolean);
begin
if flag then
screen.cursor:=crSQLwait
else
screen.cursor:=crNormal;
PanelWait.visible:=flag
end;
Ну и перед тяжёлыми вычислениями вызывал busy(true), а по завершении — busy(false).
+3
UFO just landed and posted this here
Sign up to leave a comment.
Маленькие хитрости: автоматическое восстановление вида указателя курсора