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

Ваш аккаунт

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

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

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

ListView тормозит :'(

471
11 мая 2005 года
_MC_
178 / / 13.01.2005
Подскажите что я не так делаю!
Заполняю ListView
 
Код:
SendMessage(lList->Handle, LVM_SETITEMCOUNT, ADOQuery->RecordCount, LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);
while(!ADOQuery->Eof)
 {TListItem *Item;
  Item=lList->Items->Add();
  Item->Caption="";
  Item->SubItems->Add("");
  ADOQuery->Next();}


При большом ADOQuery->RecordCount загрузка вешает программу, что не есть гуд.
При 3000 записях минут на пять про программу можно забыть. :'(
4.2K
11 мая 2005 года
Крыс
98 / / 06.05.2005
Почему не пользуешься DBList-ом или DBLookUPList-ом?
10
11 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by _MC_

while(!ADOQuery->Eof)
{TListItem *Item;
Item=lList->Items->Add();
Item->Caption="";
Item->SubItems->Add("");
ADOQuery->Next();}
[/code]


lList->Items->BeginUpdate в начале и EndUpdate в конце делаешь?

471
13 мая 2005 года
_MC_
178 / / 13.01.2005
Цитата:
Originally posted by Freeman
lList->Items->BeginUpdate в начале и EndUpdate в конце делаешь?



Не помогает!

10
13 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by _MC_
Не помогает!


Знач, пользуйтся нормальными DB-компонентами, как предлагали выше. Они сами будут запрашивать данные при прорисовке on demand.

471
13 мая 2005 года
_MC_
178 / / 13.01.2005
Цитата:
Originally posted by Freeman
Знач, пользуйтся нормальными DB-компонентами, как предлагали выше. Они сами будут запрашивать данные при прорисовке on demand.



Дя это не есть гуд. С нормальными тоже не летает, ADO тормоз!

6.4K
13 мая 2005 года
MerlinWind
52 / / 01.05.2005
Цитата:
Originally posted by _MC_
Дя это не есть гуд. С нормальными тоже не летает, ADO тормоз!


ADO - не тормоз. Очень удобная технология. С какой
БД работаешь?

4.2K
13 мая 2005 года
Крыс
98 / / 06.05.2005
Если база достаточно большая есть смысл подгружать ее частями, используя фильты например
10
13 мая 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by Крыс
Если база достаточно большая есть смысл подгружать ее частями, используя фильты например


Стандартные фильтры Borland (свойства Filter и Filtered у наследников DataSet) выполняются на стороне клиента и часто не очень эффективно, поэтому являются еще большими тормозами.

4.2K
14 мая 2005 года
Крыс
98 / / 06.05.2005
Цитата:
Originally posted by Freeman
Стандартные фильтры Borland (свойства Filter и Filtered у наследников DataSet) выполняются на стороне клиента и часто не очень эффективно, поэтому являются еще большими тормозами.


Это конечно если сетевая база... А если локальная?

И кстати можно в самом запросе оганичения поставить наверно...
Кстати грамотно сделаные индексы лишними не будут

6.4K
15 мая 2005 года
MerlinWind
52 / / 01.05.2005
Цитата:
При большом ADOQuery->RecordCount загрузка вешает программу, что не есть гуд.

Цитата:
Дя это не есть гуд. С нормальными тоже не летает, ADO тормоз!




ADOQuery – хороший, удобный компонент. Провел эксперемент: добавляю в базу access
3000 записей - >5сек; а потом значение полей записей добавляю в ListView->4сек.
Какие 5 минут?

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        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);
}
246
15 мая 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by MerlinWind
ADO - не тормоз. Очень удобная технология. С какой
БД работаешь?


Еще какой тормоз.

6.4K
15 мая 2005 года
MerlinWind
52 / / 01.05.2005
Цитата:
Originally posted by GIZMO
Еще какой тормоз.


Хотелось бы более аргументированных доводов;).
А чем пользуетесь вы, и чем это, по вашему, удобней?

471
17 мая 2005 года
_MC_
178 / / 13.01.2005
Цитата:
Originally posted by MerlinWind
ADOQuery – хороший, удобный компонент. Провел эксперемент: добавляю в базу access
3000 записей - >5сек; а потом значение полей записей добавляю в ListView->4сек.
Какие 5 минут?
 
Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
     
}



Не знаю у меня грузиться, вечером проверю у себя еще раз. И отвечу :(

259
17 мая 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by _MC_
Не знаю у меня грузиться, вечером проверю у себя еще раз. И отвечу :(


ADO создает временный курсор всей таблице в tmp директории. Т.е. при первоначальной загрузке это может занять определенное время (5 мин ????). Но там есть возможности буфферизации. И по моему необходимо обязательно использовать ADOConnection.

6.4K
17 мая 2005 года
MerlinWind
52 / / 01.05.2005
Цитата:
Originally posted by AlexandrVSmirno
ADO создает временный курсор всей таблице в tmp директории. Т.е. при первоначальной загрузке это может занять определенное время (5 мин ????). Но там есть возможности буфферизации. И по моему необходимо обязательно использовать ADOConnection.


Не обязательно. Помоему в ADOConnection есть смысл только при использовании большого количества других ADO компонентов.

259
17 мая 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by MerlinWind
Не обязательно. Помоему в ADOConnection есть смысл только при использовании большого количества других ADO компонентов.


Но он еще и позволяет управлять подключением к базе. Скажем если его сунуть в DataModule, то если и будет тормоз, то при старте приложения, а не при первом выполнении запроса, что не так страшно. Кроме того в задаче явно больше чем один компонент работающий с БД.

471
17 мая 2005 года
_MC_
178 / / 13.01.2005
Цитата:
Originally posted by AlexandrVSmirno
Но он еще и позволяет управлять подключением к базе. Скажем если его сунуть в DataModule, то если и будет тормоз, то при старте приложения, а не при первом выполнении запроса, что не так страшно. Кроме того в задаче явно больше чем один компонент работающий с БД.



Нет в задаче один единственный ADOQuery!

259
17 мая 2005 года
AlexandrVSmirno
1.4K / / 03.12.2004
Цитата:
Originally posted by _MC_
Нет в задаче один единственный ADOQuery!


Ну да и бог с ним. Попробуйте создать DataModule. Разместите в нем ADOConnection, а в ADOQuery вместо конкретной строки задайте ADOConnection. Я думаю результат юудет более приемлимый.

246
18 мая 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by _MC_
Подскажите что я не так делаю!
Заполняю ListView
Код:
SendMessage(lList->Handle, LVM_SETITEMCOUNT, ADOQuery->RecordCount, LVSICF_NOINVALIDATEALL | LVSICF_NOSCROLL);
 
Так-так начал неплохо, а дальше...
Цитата: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="";)?

Код:
void __fastcall TForm1::ListViewOnData(TObject *Sender, TListItem *Item)
{
    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;
}
471
18 мая 2005 года
_MC_
178 / / 13.01.2005
Цитата:
Originally posted by GIZMO
Так-так начал неплохо, а дальше...

Если уж взялся за API так может и продолжить в том же духе? И зачем добавлять пустые Item-ы(Item->Caption="";)?
Код:
void __fastcall TForm1::ListViewOnData(TObject *Sender, TListItem *Item)
{
    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 заполнял, что-то тормознул :) Надо переделать, спасибо за подсазку. ;)

А кепшены не пустые, там тоже из базы данных, я просто не написал.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог