| | | | |
Полный текст материала
Другие публикации автора: George Judkin
Цитата или краткий комментарий: «... Использование модальной формы для отображения хода выполнения длительного процесса. ...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
| | Содержит полезные и(или) интересные сведения | [1] | 5 | 100% | | | | Ничего особенно нового и интересного | [2] | 0 | 0% | | | | Написано неверно (обязательно укажите почему) | [3] | 0 | 0% | | Всего проголосовали: 5 | | | Все понятно, материал читается легко | [1] | 3 | 75% | | | | Есть неясности в изложении | [2] | 1 | 25% | | | | Непонятно написано, трудно читается | [3] | 0 | 0% | | Всего проголосовали: 4 |
[Модальные формы (режим ShowModal)] [Обработка длительных процессов (отображение/реакция и т.п.)]
Отслеживать это обсуждение
Всего сообщений: 1528-04-2012 10:58Здравствуйте, уважаемые рыцари!
Как уже говорилось ранее, делать наследников, для каждой отдельной операции не удобно.
А что, если использовать такой вариант:
Создаем класс формы, с нужными компонентами для отображения прогресса выполнения длительных операций, а также их пояснения.
Перед началом длительной операции, создаем форму, вместо ShowModal делаем просто Show, если нужно блокируем окно текущей формы. В процессе выполнений длительной операции изменяем значения прогресса на форме, а в конце закрываем и освобождаем ее.
Плюсом такому классу-форме можно написать удобные методы по увеличению прогресса, изменению пояснений, добавить возможность создавать "многоуровневый" прогресс, к примеру для ситуаций, когда нужно обрабатывать вложенные циклы. |
|
26-01-2012 23:11сообщение от автора материала >>> Нафиг этот ваш FireMonkey, я до сих пор в Дельфи 6 сижу и не вижу никаких причин для кроссплатформенности.
Нафиг все эти ваши станки с ЧПУ. И вообще ГАП — фигня. Я как точил болты на токарном станке, так и точу.
Рассуждения о том, нужна ли кроссплатформенность или нет в данном обсуждении являются офф-топиком. Здесь статья обсуждается. Идите на Базарную Площадь. Если хотите поговорить о кроссплатформенности вообще, давайте создадим там новую тему. Но не здесь. Ага?
|
|
26-01-2012 17:05> . Кабы ты это сделал в FireMonkey,
Нафиг этот ваш FireMonkey, я до сих пор в Дельфи 6 сижу и не вижу никаких причин для кроссплатформенности. |
|
15-11-2011 12:30сообщение от автора материала >>> Как передать этой "градусной" форме что ей делать? Получается, что сколько типов "зависаний" - столько же потомков (не экземпляров) этой формы
В данный момент именно так дело и обстоит. Это уже Сергей Перовский отметил. Были "гениальные" идеи попытаться сделать, например, события, обработчики которых задавать в Object Inspector. Были и еще задумки разные. Но все они постепенно обломились. Скорее всего, я больше это направление развивать не буду, поэтому решил отдать, что есть. Собственно, отдать идею с посылкой сообщения самому себе и занозу в мозги, что лучше сделать это дело гибким и настраиваемым.
>>> давно привык генерить формы через некую функцию, которая объявлена в интерфейсной части модуля формы
Я тоже люблю делать так же. Но вот делать некую универсальную функцию MessageDlg что-то не захотелось. Почему-то это показалось коряво.
>>> и еще про "оставшееся время"
Тут не настаиваю. Это на любителя. Но мне почему-то кажется нечестным, когда мне говорят "до завершения операции осталось 5 минут", а эти пять минут не имеют никакого отношения к тому, сколько времени осталось реально до завершения операции. С таким же успехом можно вообще ничего не вычислять и не корректировать, а до последнего момента писать, что до завершения операции осталось 30 секунд. Резульатты по качестыву будут такими же, а трудозатраты существенно меньше ;-)
Если же я пишу, что загружено 5 объектов из 12, то я ни капельки не вру. Их действительно загружено 5. А всего их действительно 12. |
|
14-11-2011 19:12Да и еще про "оставшееся время"... Я в параметрах указываю некую величину, которой инициализируется обратный отсчет. А вот в процессе обработки записей идет коррекция обратного отсчета по принципу среднее время обработки записи умножить на кол-во оставшихся записей.. Да, вначале он "прыгает" - работаю с Экселем и количество вызовов его методов различно, но к "середине градусника" (его макс - количество записей) уже достаточно достоверное время получается. Вывожу его отдельной лэйбой. |
|
14-11-2011 19:01 Не совсем понятно как эта модальная форма в процессе своего "модала" создает некую форму, генерит какие-то компоненты, да и еще обрабатывает некие записи по-строчно. Ну ладно, пусть это реализуется в некоем XXXStepIt и код остался за кадром, но... Как же все-таки получить ссылку на вновь созданную форму, результаты пошаговой оьработки записей? Как передать этой "градусной" форме что ей делать? Получается, что сколько типов "зависаний" - столько же потомков (не экземпляров) этой формы.
Я тоже сталкивался с такой проблемой, но поскольку уже давно привык генерить формы через некую функцию, которая объявлена в интерфейсной части модуля формы, то сделать такой "градусник" оказалось просто заменить Show на ShowModal (проблема с "активацией" решена точно также). Вот только уже имея в функции параметры вызова - никаких проблем в том, чтобы иметь кучу "возможных решаемых задач" и возвращении результатов. |
|
01-11-2011 03:24сообщение от автора материала Тэк-с... Господа, я, кажется, был неверно понят. Поясняю еще раз...
Я всю жизнь предпочитал разрабатывать маленький и быстрый код. Это достигается, в основном, только за счет разработки нативного кода. Зачастую, не просто под винду или никсы, а под конкретную версию. И тут мне предлагается сделать некое кроссплатформенное решение, которое заведомо будет больше и медленнее. Именно это я называл в своих сообщениях "кроссплатформенным монстром".
Причем, умом понимаю, что так надо. Что разрабатывать десять решений под десять разных платформ — это намного дороже, чем разработать одно кроссплатформенное решение, но душа к этому не лежит :(
Ну и это... у меня сейчас очень-очень мало остается на программирование. Решению, которое я опубликовал в этой статье, уже года два. И вот только сейчас оно дозрело до публикации. |
|
01-11-2011 03:05Юра! XE2 - это не кроссплатформенный монстр.
Там просто заместо VCL используется FireMonkey для кроссплатформы. Ничего монстроидального нет в этом.
Кстати, раз уже на джинсу меня потянуло:
где-то в начале февраля 2-3 будет конференция для Delphi-программистов силами Delphi-программистов.
Не пропустите! Планируйте отпуска/командировки.
И по FireMonkey - сейчас я готовлю большую красивую онлайн-интервью с Евгением Крюковым (ex. ksdev), одним из главных идеологов FireMonkey. Там попсы будет мало, а архитектуры много.
P.S. Я про кроссплатформу почему заикнулся - если делать что-то для кроссплатформенного кода (на FireMonkey, например), то нужно от механаизма (платформенно-зависимого) посылки сообщений Windows уходить. Собственно, Юра, если ты сделаешь "без сообщений", но на VCL, то обязуюсь (со ссылкой на тебя) перепахать на FireMonkey с тестированием под родную MacOS. |
|
31-10-2011 15:44..., а ты мне предлагаешь некоего кроссплатформенного монстра. Вроде бы про Delphi XE2 на халяву речь не шла :o) |
|
31-10-2011 14:21Отлично. Просто и по делу. Спасибо за материал, возьму на заметку - в хозяйстве пригодится. |
|
31-10-2011 13:41сообщение от автора материала >>> А если в задаче потребуется несколько разных запросов, для каждого делать свою форму - наследник?
Обломился я дальше обобщать *смущенно уставился себе под ноги*
>>> Форма одна и сколько угодно компонент для управления, имеющие обработчики OnCalcStepCount и OnProceedStep
Да, именно это вариант напрашивается в первую очередь. Но там сразу идеи начинают фонтанировать. Например, текст сообщения тоже хочется сделать кастомизируемым. Далее, возможно, имеет смысл включать значение счетчика в текст сообщения (что-то вроде Загружается модуль 5 из 12.). Ну и так далее, и тому подобное. У меня очень богатая фантазия ;-)
Поэтому, решил сейчас подать именно так. Основной упор, все же, на то: как можно вообще использовать модальные окна в данной ситуации (трюк с посылкой сообщения самому себе). А если потом будет время, то можно и еще что-то доизобретать. |
|
31-10-2011 13:32сообщение от автора материала Сева, ну ты сказал!
Я же всю жизнь любил писать маленький шустрый код, а ты мне предлагаешь некоего кроссплатформенного монстра. Это мне, у которого на стене висит высказывание про то, что амфибия — это хре... э-э-э... плохой автомобиль и плохой катер ;-)
А что касается этого материала... Не надо в нем искать какой-то глубокий смысл. Это просто маленькое техническое решение. Когда-то я в этом месте споткнулся и нашел, как мне показалось, оригинальное решение. Которым я и решил поделиться. Ну и еще, наверное, был один побудительный мотив. Очень уж мне хочется донести до программистов, что программирование — это не только визуальное проектирование и прописывание обработчиков событий. Раньше я уже пытался показать, что разработка собственных классов, например, это тоже программирование. Причем, доступное любому. А не только каким-то супер-мега-гуру. Сейчас вот добрался до механизма сообщений. Показал, что их тоже можно использовать простым смертным. Более того, без них иногда задачу решить затруднительно.
А про "метафору FlashGet" (чувствую, что я перестаю понимать современную терминологию ;-))... Знаешь, есть напимер, простенькие программы, в которых многопоточность и параллельность просто не нужны. Как бы не совершенствовался Photoshop, всегда останется место для простенького Paint. А еще есть, например, инициализация системы. Там что-то похожее тоже может пригодиться. |
|
31-10-2011 13:15Кстати, не очень ясно, почему нет такого стандартного компонента. Задача распространенная и очевидная. |
|
31-10-2011 13:05А если в задаче потребуется несколько разных запросов, для каждого делать свою форму - наследник?
Мне, почему-то, никогда не нравилась идея создания нового класса, ради единственного экземпляра.
Поэтому для подобных случаев я бы сделал нечто похожее на компоненты - диалоги.
Форма одна и сколько угодно компонент для управления, имеющие обработчики OnCalcStepCount и OnProceedStep. |
|
31-10-2011 04:54Юра, люблю тебя как родного.
Но хочу творчески покритиковать.
1. Не хочу, чтобы код был платформенно-зависимым. Кабы ты это сделал в FireMonkey, я бы воспел твой талант. А так могу лишь сказать, что нужно диверсифицировать свои инвестиции в исходный код.
2. Метафора с оконным подпрыгом в фейс юзеру не может считаться новой и, следовательно, перспективной. Более современно - список задач и кнопки "пуск/стоп/пауза" на тулбаре. Выбрал задачу - и изменил статус её выполнения.
3. Не хочу показаться невежливым, но метафора FlashGet-а - хороша.
Вот бы нам фреймворк, где что-то типа MVC с презумпцией выполнения задачи во вторичном потоке.
Раскатал губы? :) |
|
|
|