Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
ВнизProgressViewer Найти похожие ветки
← →
Loginov Dmitry © (2007-12-18 10:19) [0]Вышло обновление модуля визуализации длительных операций ProgressViewer.
Скачать его можно по адресу:
http://matrix.kladovka.net.ru/download.php?getfilename=uploads/other/progressviewer.zip
Возможности обновленного модуля Вы можете посмотреть, запустив демку.
Если Вы считаете, что в модуле чего-то нехватает, или обнаружите какой-либо глюк, напишите об этом!
← →
oldman © (2007-12-18 10:23) [1]А какая по длительности операция нужна для теста?
А то я стараюсь избегать в программе окон "Ждите, думаю..."
← →
Альф (2007-12-18 11:10) [2]Оформление кода замечательное :)
По мелочи:
№1. Возможность использовать собственную форму.
или же
№2. Использовать окно с заголовком и крестиком. Юзерам лень тянуться за ESC, любят нажимать на крестик...
№3. Использовать стандартный ProgressBar.
№4. Использование задаваемых юзером сообщений и стиля вывода. Вот эти все SProductName, SLine1 и т.п.
№5. Вызов оформить вот такwith TProgressViewer.Create("", False) do try
// some work...
finally
Free();
end;
Также непонятна необходимость создания вот этогоWndHandleList := TThreadList.Create;
ThreadsList := TList.Create;
← →
Slym © (2007-12-18 11:45) [3]Ну и цветовая схема... Win3.11?
баги:
1. бегунок наезжает на прарую свою границу...
2. если бегунок постепенно скрывается справа, то почему "резко" появляется слева?
3. Основная форма "висит" :) несмотря на выкрутасы с потоками...
4. Если запускаю "долгий запрос" в доп потоке "Отмена" не канает но окошку ожидания уже конец
5. Не проверено, но - Если ProgressMethod выполнится не вызвав принудительно Terminate прогреса, то прогресс будет прогрессировать до опупения!
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить к некоторым "нестабильным" проблемам
← →
Rouse_ © (2007-12-18 11:46) [4]
procedure TProgressViewer.AddStringInfo(LineNumber: Integer; AText: string;
TextAlignment: TAlignment = taRightJustify; ALineBreak: Boolean = False;
AFontColor: TColor = clBlack; AFontStyle: TFontStyles = [];
AFontSize: Integer = 8; AFontName: string = "MS Sans Serif");
Имхо лучше оформить передачу параметров в виде record, а то слишком много всего...
В DoCancelByUser, DrawProgress и Execute глухой except
Практически везде не изменяемый в теле процедур string параметр передается без префикса const
← →
Loginov Dmitry © (2007-12-18 11:50) [5]
> Оформление кода замечательное :)
Не сомневаюсь!
> №1. Возможность использовать собственную форму.
Используй! Кто мешает? Исходники открыты.
> №2. Использовать окно с заголовком и крестиком. Юзерам лень
> тянуться за ESC, любят нажимать на крестик...
Можешь заголовок добавить. Лично я не вижу необходимости в кнопке "Закрыть". Кнопка "Отмена" более наглядна.
> №3. Использовать стандартный ProgressBar.
Если не устраивает то, что предложено, можеть использовать стандартный ProgressBar. Это не сложно сделать. Но я в этом не вижу никакой необходимости - только дополнительная нагрузка на процессор.
> №5. Вызов оформить вот так
Можешь оформлять вызов как тебе удобно. Мои же рекомендации приведены в самом начале модуля.
> Также непонятна необходимость создания вот этого
Если лень читать исходники, поясню: это сделано для того, чтобы но Handle окна, переданного в оконную функцию, найти объект TProgressViewer, породивший данное окно и вызвать его метод DoCancelByUser (если пользователь нажал кнопку "Отмена").
← →
Loginov Dmitry © (2007-12-18 11:52) [6]Ну вот уже более конструктивные замечания! Отвечу чуть позже!
← →
Slym © (2007-12-18 11:53) [7]а это мой прогрессбар, правда слабая бета версия :) http://ifolder.ru/4607526
полностью гуевый (отсюда медленней чем [0]) с примерами
← →
Slym © (2007-12-18 11:57) [8]Slym © (18.12.07 11:45) [3]
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить к некоторым "нестабильным" проблемам
у меня запуск IE перехватил на себя модальность Мессаж бокса с вытекающими отсюда последствиями:
1. активация месажбокса активирует IEApp.
2. Закрытие программы вызывает определенные траблы...
3. IE после этого остался "замодаленым" т.е. не принимал фокуса ввода
4. проверено несколько раз: результаты разные
← →
Kolan © (2007-12-18 11:59) [9]> хо лучше оформить передачу параметров в виде record, а то
> слишком много всего…
И называется это Long params list
← →
Семер Сурков (2007-12-18 12:57) [10]Я не специалист в winapi, но тема меня заинтересовала, т.к. мне тоже нужно будет делать progress в отдельном окне. Почему бы не поучиться у других?
Однако критика.
Вызывает большое сомнение правомерность строчкиSendMessage(FhWindow, WM_PAINT, Integer(Self), 0);
в методе DrawProgress. Ибо MSDN по поводу WM_PAINT говорит:
>>The WM_PAINT message is generated
>>by the system and should not be
>>sent by an application.
Наверное это неспроста написано?
Я тут переписал немного - использую InvalidateRect, вместо явной посылки WM_PAINT. Вот, посмотри, если интересно http://ifolder.ru/4608234.
Думаю, что так будет правильней :)
← →
Loginov Dmitry © (2007-12-18 13:00) [11]
> Ну и цветовая схема... Win3.11?
Не знаю :) Для фона используется clBtnFace. Делал как можно проще, но с необходимой функциональностью.
> 2. если бегунок постепенно скрывается справа, то почему
> "резко" появляется слева?
Как-то не замечал этого :)
> 3. Основная форма "висит" :) несмотря на выкрутасы с потоками...
Ну а модуль-то здесь причем? :)
> 4. Если запускаю "долгий запрос" в доп потоке "Отмена" не
> канает но окошку ожидания уже конец
тут я ничего не скажу. Попросту ни разу не тестил! :)
> 5. Не проверено, но - Если ProgressMethod выполнится не
> вызвав принудительно Terminate прогреса, то прогресс будет
> прогрессировать до опупения!
Верно! Поэтому в нет необходимо вызывать Terminate!
> 6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить
> к некоторым "нестабильным" проблемам
У меня вообще Windows.MessageBox никак не работает! С Application.MessageBox проблем вроде нет :) Интересно, почему с Windows.MessageBox такой касяк?
> procedure TProgressViewer.AddStringInfo(LineNumber: Integer;
> AText: string;
> TextAlignment: TAlignment = taRightJustify; ALineBreak:
> Boolean = False;
> AFontColor: TColor = clBlack; AFontStyle: TFontStyles =
> [];
> AFontSize: Integer = 8; AFontName: string = "MS Sans Serif");
>
> Имхо лучше оформить передачу параметров в виде record, а
> то слишком много всего...
Добавлю для записей дополнительный метод.
> В DoCancelByUser, DrawProgress и Execute глухой except
А кто его будет обрабатывать в случае возникновения? Лучше уж заглушить, чем допустить вылет из Execute, имхо.
> у меня запуск IE перехватил на себя модальность Мессаж бокса
> с вытекающими отсюда последствиями:
> 1. активация месажбокса активирует IEApp.
> 2. Закрытие программы вызывает определенные траблы...
> 3. IE после этого остался "замодаленым" т.е. не принимал
> фокуса ввода
> 4. проверено несколько раз: результаты разные
Сейчас на это я могу одно сказать: не вызывай Windows.MessageBox при выполнении цикла :) А если серьезно, то необходимо разобраться, почему так происходит и найти способ обхода данной баги...
← →
Loginov Dmitry © (2007-12-18 13:03) [12]
> Вызывает большое сомнение правомерность строчки
>
> SendMessage(FhWindow, WM_PAINT, Integer(Self), 0);
Вроде не замечал никаких проблем с этим. По крайней мере до сих пор все работало :)
> Я тут переписал немного - использую InvalidateRect, вместо
> явной посылки WM_PAINT. Вот, посмотри, если интересно http:
> //ifolder.ru/4608234.
пишет типа "файл не найден" (
← →
Rouse_ © (2007-12-18 13:05) [13]
> А кто его будет обрабатывать в случае возникновения?
Как это кто? :) Программист :)
← →
Семен Сурков (2007-12-18 13:07) [14]2Автор
В доке сказано, надо выполнять.
Еще раз
http://ifolder.ru/4608338
← →
Loginov Dmitry © (2007-12-18 13:41) [15]
> В доке сказано, надо выполнять.
>
> Еще раз
> http://ifolder.ru/4608338
Спасибо! Не знал про такой подход! И при этом никакие глобальные списки становятся ненужными! :)
← →
Kerk © (2007-12-18 14:04) [16]Вот как раз в таком окошке можно рекламу показывать :))))))))))))))))
← →
clickmaker © (2007-12-18 14:10) [17]
> [16] Kerk © (18.12.07 14:04)
слабо замутить рекламную картинку, которая одновременно будет прогресс-индикатором? :)
← →
Slym © (2007-12-18 14:36) [18]Loginov Dmitry © (18.12.07 13:00) [11]
6. Вызов Windows.MessageBox(Handle,"1","1",0) может приводить
> к некоторым "нестабильным" проблемам
У меня вообще Windows.MessageBox никак не работает! С Application.MessageBox проблем вроде нет :) Интересно, почему с Windows.MessageBox такой касяк?
это косякwith TProgressViewer
:) я сам акарал :)
← →
Loginov Dmitry © (2007-12-18 15:40) [19]
> это косяк with TProgressViewer :) я сам акарал :)
Вашу машу! Угарно :)
Handle относится к TProgressViewer! :)
← →
Loginov Dmitry © (2007-12-23 14:58) [20]> [14] Семен Сурков (18.12.07 13:07)
К сожалению, предложенный Вами вариант не является надежным. Все дело в хакерской функции Classes.MakeObjectInstance. Она выполняет ряд подмен, в результате которых в качестве оконной процедуры будет вызван переданный метод. Данная функция не является потокобезопасной, т.к. изменяет ряд глобальных переменных без использования критической секции. Если одновременно с моим окном будет создана VCL-форма, то это может привести к краху программы.
← →
Семен Сурков (2007-12-25 10:21) [21]
> Loginov Dmitry © (23.12.07 14:58) [20]
> > [14] Семен Сурков (18.12.07 13:07)
> К сожалению, предложенный Вами вариант не является надежным.
ну-ну :)
вам, видимо, виднее.
← →
Семен Сурков (2007-12-25 12:29) [22]2автор
как-то у тебя неряшливо написано многое.
вот ты класс регистрируешь RegisterClass, результат не проверяешь.
а вообще говоря второй и далее разы дает ошибку, т.к. CreateNewWnd выполняется для каждой формы
← →
Loginov Dmitry © (2007-12-25 23:03) [23]> вот ты класс регистрируешь RegisterClass, результат не проверяешь.
> а вообще говоря второй и далее разы дает ошибку, т.к. CreateNewWnd
> выполняется для каждой формы
ценное замечание! Спасибо! Действительно, при текущем подходе в условиях многопоточности можно огрести проблемы. Не зная алгоритма работы функции RegisterClass, можно предположить, что вызвов функции CreateWindowEx для одного потока произойдет раньше, чем класс успеет зарегистрироваться (в другом потоке).
> как-то у тебя неряшливо написано многое.
так уж и многое!? ))
← →
Семен Сурков (2007-12-26 11:15) [24]
> > как-то у тебя неряшливо написано многое.
> так уж и многое!? ))
если честно, то почти все. без обид.
я не большой спец (вернее просто почти ламер) в winapi, но правильный и аккуратный код отличу, от кода с потенциальными ошибками :)
очень, кстати, советую посмотреть исходники Розыча http://rouse.drkb.ru, относящиеся к winapi. бери пример - аккуратно, и почти (ну я то всегда найду, что-то по сути :p) придраться не к чему.
← →
Ketmar_ (2007-12-26 12:14) [25]как это — «не к чему»? если Партия прикажет, мы и к begin end; придерёмся!
← →
Loginov Dmitry © (2007-12-26 12:52) [26]
> если честно, то почти все. без обид.
>
> я не большой спец (вернее просто почти ламер) в winapi,
> но правильный и аккуратный код отличу, от кода с потенциальными
> ошибками :)
Я с твоего пинка нашел тут еще несколько потенциально опасных мест ))
Позже выложу исправления.
← →
Loginov Dmitry © (2007-12-28 01:00) [27]Учтя все замечания и пожелания, изложенные в данной ветке, я внес в модуль соответствующие исправления. Обновленная версия доступна для скачиваний по тому же адресу.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.02.03;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.044 c