ListView тормозит :'(
Заполняю ListView
while(!ADOQuery->Eof)
{TListItem *Item;
Item=lList->Items->Add();
Item->Caption="";
Item->SubItems->Add("");
ADOQuery->Next();}
При большом ADOQuery->RecordCount загрузка вешает программу, что не есть гуд.
При 3000 записях минут на пять про программу можно забыть. :'(
while(!ADOQuery->Eof)
{TListItem *Item;
Item=lList->Items->Add();
Item->Caption="";
Item->SubItems->Add("");
ADOQuery->Next();}
[/code]
lList->Items->BeginUpdate в начале и EndUpdate в конце делаешь?
lList->Items->BeginUpdate в начале и EndUpdate в конце делаешь?
Не помогает!
Не помогает!
Знач, пользуйтся нормальными DB-компонентами, как предлагали выше. Они сами будут запрашивать данные при прорисовке on demand.
Знач, пользуйтся нормальными DB-компонентами, как предлагали выше. Они сами будут запрашивать данные при прорисовке on demand.
Дя это не есть гуд. С нормальными тоже не летает, ADO тормоз!
Дя это не есть гуд. С нормальными тоже не летает, ADO тормоз!
ADO - не тормоз. Очень удобная технология. С какой
БД работаешь?
Если база достаточно большая есть смысл подгружать ее частями, используя фильты например
Стандартные фильтры Borland (свойства Filter и Filtered у наследников DataSet) выполняются на стороне клиента и часто не очень эффективно, поэтому являются еще большими тормозами.
Стандартные фильтры Borland (свойства Filter и Filtered у наследников DataSet) выполняются на стороне клиента и часто не очень эффективно, поэтому являются еще большими тормозами.
Это конечно если сетевая база... А если локальная?
И кстати можно в самом запросе оганичения поставить наверно...
Кстати грамотно сделаные индексы лишними не будут
ADOQuery – хороший, удобный компонент. Провел эксперемент: добавляю в базу access
3000 записей - >5сек; а потом значение полей записей добавляю в ListView->4сек.
Какие 5 минут?
{
ADOQuery1->SQL->Text="delete * from table1";
ADOQuery1->ExecSQL();
String t1=DateTimeToStr(Now());
for(int i=0; i<3000; i++)
{
ADOQuery1->SQL->Text="insert into table1(f2,f3,f4) values (100,200,300)";
ADOQuery1->ExecSQL();
}
String t2=DateTimeToStr(Now());
ShowMessage("начало: "+t1+" конец: "+t2);
ADOQuery1->SQL->Text="select f2,f3,f4 from table1";
ADOQuery1->Open();
ADOQuery1->First();
t1=DateTimeToStr(Now());
ListView1->Items->BeginUpdate();
for(int i=0; i<3000; i++)
{
ListView1->AddItem(ADOQuery1->FieldByName("f2")->AsString,this);
ListView1->AddItem(ADOQuery1->FieldByName("f3")->AsString,this);
ListView1->AddItem(ADOQuery1->FieldByName("f4")->AsString,this);
ADOQuery1->Next();
}
ListView1->Items->EndUpdate();
ADOQuery1->Close();
t2=DateTimeToStr(Now());
ShowMessage("начало: "+t1+" конец: "+t2);
}
ADO - не тормоз. Очень удобная технология. С какой
БД работаешь?
Еще какой тормоз.
Еще какой тормоз.
Хотелось бы более аргументированных доводов;).
А чем пользуетесь вы, и чем это, по вашему, удобней?
ADOQuery – хороший, удобный компонент. Провел эксперемент: добавляю в базу access
3000 записей - >5сек; а потом значение полей записей добавляю в ListView->4сек.
Какие 5 минут?
{
}
Не знаю у меня грузиться, вечером проверю у себя еще раз. И отвечу :(
Не знаю у меня грузиться, вечером проверю у себя еще раз. И отвечу :(
ADO создает временный курсор всей таблице в tmp директории. Т.е. при первоначальной загрузке это может занять определенное время (5 мин ????). Но там есть возможности буфферизации. И по моему необходимо обязательно использовать ADOConnection.
ADO создает временный курсор всей таблице в tmp директории. Т.е. при первоначальной загрузке это может занять определенное время (5 мин ????). Но там есть возможности буфферизации. И по моему необходимо обязательно использовать ADOConnection.
Не обязательно. Помоему в ADOConnection есть смысл только при использовании большого количества других ADO компонентов.
Не обязательно. Помоему в ADOConnection есть смысл только при использовании большого количества других ADO компонентов.
Но он еще и позволяет управлять подключением к базе. Скажем если его сунуть в DataModule, то если и будет тормоз, то при старте приложения, а не при первом выполнении запроса, что не так страшно. Кроме того в задаче явно больше чем один компонент работающий с БД.
Но он еще и позволяет управлять подключением к базе. Скажем если его сунуть в DataModule, то если и будет тормоз, то при старте приложения, а не при первом выполнении запроса, что не так страшно. Кроме того в задаче явно больше чем один компонент работающий с БД.
Нет в задаче один единственный ADOQuery!
Нет в задаче один единственный ADOQuery!
Ну да и бог с ним. Попробуйте создать DataModule. Разместите в нем ADOConnection, а в ADOQuery вместо конкретной строки задайте ADOConnection. Я думаю результат юудет более приемлимый.
Подскажите что я не так делаю!
Заполняю ListView
Так-так начал неплохо, а дальше...
Цитата:Originally posted by _MC_
while(!ADOQuery->Eof)
{TListItem *Item;
Item=lList->Items->Add();
Item->Caption="";
Item->SubItems->Add("");
ADOQuery->Next();}
При большом ADOQuery->RecordCount загрузка вешает программу, что не есть гуд.
При 3000 записях минут на пять про программу можно забыть. :'(
Если уж взялся за API так может и продолжить в том же духе? И зачем добавлять пустые Item-ы(Item->Caption="";)?
{
Item->Caption = ADOQuery->FieldByName("Field1")->AsString;
Item->SubItems->Add(ADOQuery->FieldByName("Field2")->AsString);
ADOQuery->Next();
}
//------------------------------------------
void __fastcall TForm1::AddClick(TObject *Sender)
{
ListView1->Items->BeginUpdate();
ListView1->Items->Clear();
ListView1->Items->EndUpdate();
ADOQuery->First();
ListView1->OnData = ListViewOnData;
ListView1->OwnerData = true;
ListView1->Items->Count = ADOQuery->RecordCount;
}
Так-так начал неплохо, а дальше...
Если уж взялся за API так может и продолжить в том же духе? И зачем добавлять пустые Item-ы(Item->Caption="";)?
{
Item->Caption = ADOQuery->FieldByName("Field1")->AsString;
Item->SubItems->Add(ADOQuery->FieldByName("Field2")->AsString);
ADOQuery->Next();
}
//------------------------------------------
void __fastcall TForm1::AddClick(TObject *Sender)
{
ListView1->Items->BeginUpdate();
ListView1->Items->Clear();
ListView1->Items->EndUpdate();
ADOQuery->First();
ListView1->OnData = ListViewOnData;
ListView1->OwnerData = true;
ListView1->Items->Count = ADOQuery->RecordCount;
}
Черт побери я не так ownerdata заполнял, что-то тормознул :) Надо переделать, спасибо за подсазку. ;)
А кепшены не пустые, там тоже из базы данных, я просто не написал.