Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Форма портится. Как исправить?

621
09 августа 2004 года
Бешеный кролик
151 / / 23.03.2004
При загрузке большого объема данных из базы у меня на экране появляется красивый ProgressBar (я его размещаю на панельке, которую в нужный момент визуализирую или скрываю. Панелька в свою очередь размещена на форме, о которой речь пойдет дальше). Так вот, если в момент копирования вызвать другую программу (Norton, например),которая "пересечет" окно моей программы, а потом закрыть его (Norton), то до конца копирования все изображение в этом окне портится (становится белым, т.е. я так понимаю окно не перерисовывается), виден тольк ProgressBar, т.к. он при каждой итерации перерисовывается. Подскажите - какое событие ловить, чтобы перерисовать форму в нужный момент.

P.S.: Программить под Винды стал недавно совсем, так что не судите строго...
310
09 августа 2004 года
fellow
853 / / 17.03.2003
Все необходимые события и без того ловятся и обрабатываются (если, конечно, форма нормально перерисовывается до и после загрузки данных). Просто до их обработки дело не доходит.
Приведите тот кусок кода, в котором начинается, производится и заканчивается загрузка данных, а также тот, где перерисовывается ProgressBar.
621
09 августа 2004 года
Бешеный кролик
151 / / 23.03.2004
Цитата:
Originally posted by fellow
Все необходимые события и без того ловятся и обрабатываются (если, конечно, форма нормально перерисовывается до и после загрузки данных). Просто до их обработки дело не доходит.
Приведите тот кусок кода, в котором начинается, производится и заканчивается загрузка данных, а также тот, где перерисовывается ProgressBar.



В процедуре void __fastcall TForm1::CopyToBuffer()
имеется след код

........................

ShowProgress("Подождите, идет копирование узлов в буфер...");


TreeView1->Items->BeginUpdate();

EmptyBuffer();

MyQuery->SQL->Text="Insert into buff select * from tree where tree.idx=:i";
for (i=0;i<SNodes->Count;i++)
{
ttn=(TTreeNode *)SNodes->Items;
if (ttn->getNextSibling()) kk=ttn->getNextSibling()->AbsoluteIndex;
else kk=TreeView1->Items->Count;
for (j=ttn->AbsoluteIndex;j<kk;j++)
{
MyQuery->ParamByName("i")->AsFloat=*(int *)TreeView1->Items->Item[j];
MyQuery->ExecSQL();
cg->Progress=int(++ppp*100.0/ccc);
}
}
delete SNodes;
HideProgress();
TreeView1->Items->EndUpdate();

..............................

ProgressBar (cg) перерисовывается каждый раз след строчкой: cg->Progress=int(++ppp*100.0/ccc);

Процедура ShowProgress выглядит так:

void __fastcall TForm1::ShowProgress(AnsiString txt)
{
Capt->Caption=txt;
prg->Visible=true;
cg->Progress=0;
prg->Repaint();
}

(prg - панелька, на которой расположен ProgessBar, она в свою очередь расположена на Form1)

а HideProgress() выглядит вот так:

void __fastcall TForm1::HideProgress()
{
prg->Visible=false;
}


Форма Form1, прорисовывается до и после нормально.
Т.е., если я вас правильно понял, сделать ничего нельзя без существенного замедления копирования данных, т.к. обработка события откладывается до конца копирования?

310
09 августа 2004 года
fellow
853 / / 17.03.2003
Ну, производится длительная операция (в цикле идёт заполнение узлов дерева из базы данных). Пока идёт эта операция, сообщения Windows поступают в очередь, но не обрабатываются, т.о. не происходит обновления окна.
Для того, чтобы обработать WM_PAINT во время длительной операции, в процедуре TForm1::CopyToBuffer() в цикле после cg->Progress=int(++ppp*100.0/ccc) вызовите Application->ProcessMessages(). Она всё сделает.
Другой вариант - длительную операцию вынести в отдельный поток (TThread), и синхронизировать с основным потоком VCL. Подробности в справке и в примерах, идущих вместе с билдером.
621
09 августа 2004 года
Бешеный кролик
151 / / 23.03.2004
Цитата:
Originally posted by fellow
Ну, производится длительная операция (в цикле идёт заполнение узлов дерева из базы данных). Пока идёт эта операция, сообщения Windows поступают в очередь, но не обрабатываются, т.о. не происходит обновления окна.
Для того, чтобы обработать WM_PAINT во время длительной операции, в процедуре TForm1::CopyToBuffer() в цикле после cg->Progress=int(++ppp*100.0/ccc) вызовите Application->ProcessMessages(). Она всё сделает.
Другой вариант - длительную операцию вынести в отдельный поток (TThread), и синхронизировать с основным потоком VCL. Подробности в справке и в примерах, идущих вместе с билдером.



Спасибо! Попробую.

621
09 августа 2004 года
Бешеный кролик
151 / / 23.03.2004
Докладываю: ProcessMessages работу процедуры не замедлила (т.е. на глаз замедления не видно), что и требовалось. Еще раз спасибо!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог