Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
ВнизКак вывести картинку "Please wait..." ? Найти похожие ветки
← →
igorium © (2011-12-13 00:36) [0]Всем привет.
Есть 3 картинки:
1) программа еще не работала
2) программа работает сейчас
3) программа выполнила работу и ждет реакции пользователя
Соответственно все 3 картинки одинакового размера и находятся в одном месте. В зависимости от ситуации одна картинка становится видимой, остальные - невидимыми.
При запуске программы замечательно показывается 1-я картинка.
После окончания всех подсчетов 3-я картинка отлично рисуется.
У меня проблема со средней картинкой.
Сразу после нажатия на кнопку RUN, по сути программа подвисает на несколько минут (время расчетов) и сразу выдает 3-ю картинку.
Если ставил смену картинок на событие onClick кнопки - у меня исчезала
сама кнопка на время работы программы.
Если ставил смену картинок на событие onMouseUp кнопки - у меня исчезала уже картинка на время работы программы.
Под "исчезновением" я понимаю замещение объекта белым пятном.
Пробовал использовать sleep - результат такой же. Только программа останавливалась на пару секунд.
Вообщем все перепробовал и ничего не работает :(
Изначально хотел делать гифку (через RxLib), сейчас был бы рад и обычному image.
Очень надеюсь на помощь.
← →
KilkennyCat © (2011-12-13 00:44) [1]Application.processMessages - вместо sleep
← →
KilkennyCat © (2011-12-13 00:45) [2]а ваще, если оно что-то там долго циклит и не реагирует и нет кнопки отмены - это очень нехорошо.
← →
Германн © (2011-12-13 00:52) [3]Либо KilkennyCat © (13.12.11 00:44) [1],
Либо доппоток, но нужно правильно определить что выполнять в доппотоке, что в основном.
Детали - после уточнения задачи.
← →
Anatoly Podgoretsky © (2011-12-13 09:43) [4]Какие потоки, когда он код не в состоянии привести.
← →
sniknik © (2011-12-13 10:01) [5]потоки нафиг, тут простого таймера для переключения достаточно.
← →
igorium © (2011-12-13 10:37) [6]
> KilkennyCat © (13.12.11 00:44) [1]
> Application.processMessages - вместо sleep
Спасибо ОГРОМНОЕ.
Все работает.
PS Насчет кнопки отмена - подумаю. Спасибо за идею.
> Anatoly Podgoretsky © (13.12.11 09:43) [4]
> Какие потоки, когда он код не в состоянии привести.
Ну зачем так категорично?
У меня программа сканирует все файлы и подпапки от заданной, ищет все файлы Jpeg, каждый файл открывает...
Всего у меня ~17000 файлов данного типа...
← →
Anatoly Podgoretsky © (2011-12-13 11:07) [7]> igorium (13.12.2011 10:37:06) [6]
Ну вот и опять код не привел
Зато недовольный
← →
igorium © (2011-12-13 11:13) [8]
> Anatoly Podgoretsky © (13.12.11 11:07) [7]
> > igorium (13.12.2011 10:37:06) [6]
>
> Ну вот и опять код не привел
> Зато недовольный
Почему недовольный - очень даже довольный - результат то получил какой надо.
Ну если код нужен, пожалста:
procedure TmyForm.FIND_JPEGS(StartDir: string);
var SearchRec: TSearchRec;
begin
if (StartDir[Length(StartDir)] <> "\") then StartDir := StartDir + "\";
// Сначала находим и печатаем все файлы из главной папки
if FindFirst(StartDir + "*.jpg", faAnyFile, SearchRec) = 0 then Repeat
if(SearchRec.Attr and faDirectory) <> faDirectory then
READ_FILE(StartDir + SearchRec.Name);
Until FindNext(SearchRec) <> 0;
// Теперь находим все подпапки и продолжаем в них поиск
if FindFirst(StartDir + "*.*", faAnyFile, SearchRec) = 0 then Repeat
if((SearchRec.Attr and faDirectory) = faDirectory) and ((SearchRec.Name <> "..") and (SearchRec.Name <> "."))then
FIND_JPEGS(StartDir + SearchRec.Name+ "\");
Until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
А процедура READ_FILE читает каждый файл, находит там данные и заносит в базу данных.
Или вам весь код надо на 1757 строк? :)
← →
Anatoly Podgoretsky © (2011-12-13 11:24) [9]Да уже не нужно, хороша ложка к обеду.
← →
OW © (2011-12-13 12:20) [10]CancelClick := false;
..
application.procecmesage;
Until (FindNext(SearchRec) <> 0) or (CancelClick);
...
OnButtonCancelClick
CancelClick := true;
← →
igorium © (2011-12-13 15:08) [11]OW Спасибо!
← →
KilkennyCat © (2011-12-13 21:02) [12]
> OW © (13.12.11 12:20) [10]
не учи плохому, аппросмессадж в теле цикла - можно видеофильм вместо плизвэйта ставить.
← →
igorium © (2011-12-14 08:42) [13]
> KilkennyCat © (13.12.11 21:02) [12]
> > OW © (13.12.11 12:20) [10]
> не учи плохому, аппросмессадж в теле цикла - можно видеофильм
> вместо плизвэйта ставить.
А что не так в этом примере?
У меня вроде все работает как надо?
← →
OW © (2011-12-14 09:40) [14]
> KilkennyCat © (13.12.11 21:02) [12]
а что посоветовать? Потоками заняться?
Нормально для начала и так будет.
Имхо, пусть так пока сделает, а потом научится и потоки пускать, если нужно будет / станет интересно.
> igorium © (14.12.11 08:42) [13]
> А что не так в этом примере?
application.ProcessMessage; в теле цикла.
Каждый раз дает приложению обработать сообщения, которые оно не обрабатывает, пока занимается твоим кодом.
И твой код от этого выполняется медленнее и потенциально может еще что-то работать
Собственно смотрим
function TApplication.ProcessMessage(var Msg: TMsg): Boolean;
var
Handled: Boolean;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
begin
Result := True;
if Msg.Message <> WM_QUIT then
begin
Handled := False;
if Assigned(FOnMessage) then FOnMessage(Msg, Handled);// тут например
if not IsHintMsg(Msg) and not Handled and not IsMDIMsg(Msg) and
not IsKeyMsg(Msg) and not IsDlgMsg(Msg) then
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end
else
FTerminate := True;
end;
end;
> У меня вроде все работает как надо?
ты сейчас кого спросил?
:)
← →
KilkennyCat © (2011-12-14 10:15) [15]
> OW © (14.12.11 09:40) [14]
> а что посоветовать? Потоками заняться?
ну да. я сам вначале предложил процмессадж, но увидев, что в программе 1757 строк кода уже, думаю, что время для потоков явно пришло.
← →
Anatoly Podgoretsky © (2011-12-14 10:58) [16]> KilkennyCat (14.12.2011 10:15:15) [15]
Он же умрет, так и не начав.
Если он не знает про ProcessMessages, то что он знает про потоки?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2012.04.01;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.017 c