Форма портится. Как исправить?
P.S.: Программить под Винды стал недавно совсем, так что не судите строго...
Приведите тот кусок кода, в котором начинается, производится и заканчивается загрузка данных, а также тот, где перерисовывается ProgressBar.
Все необходимые события и без того ловятся и обрабатываются (если, конечно, форма нормально перерисовывается до и после загрузки данных). Просто до их обработки дело не доходит.
Приведите тот кусок кода, в котором начинается, производится и заканчивается загрузка данных, а также тот, где перерисовывается 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, прорисовывается до и после нормально.
Т.е., если я вас правильно понял, сделать ничего нельзя без существенного замедления копирования данных, т.к. обработка события откладывается до конца копирования?
Для того, чтобы обработать WM_PAINT во время длительной операции, в процедуре TForm1::CopyToBuffer() в цикле после cg->Progress=int(++ppp*100.0/ccc) вызовите Application->ProcessMessages(). Она всё сделает.
Другой вариант - длительную операцию вынести в отдельный поток (TThread), и синхронизировать с основным потоком VCL. Подробности в справке и в примерах, идущих вместе с билдером.
Ну, производится длительная операция (в цикле идёт заполнение узлов дерева из базы данных). Пока идёт эта операция, сообщения Windows поступают в очередь, но не обрабатываются, т.о. не происходит обновления окна.
Для того, чтобы обработать WM_PAINT во время длительной операции, в процедуре TForm1::CopyToBuffer() в цикле после cg->Progress=int(++ppp*100.0/ccc) вызовите Application->ProcessMessages(). Она всё сделает.
Другой вариант - длительную операцию вынести в отдельный поток (TThread), и синхронизировать с основным потоком VCL. Подробности в справке и в примерах, идущих вместе с билдером.
Спасибо! Попробую.