Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка TListView в виртуальном режиме. [D7]


Fr ©   (2009-06-18 14:00:00) 

Как его отсортировать по клику на заголовке колонки?


Fr   (2009-06-18 17:17:00) [1]


> Сергей М. ©   (18.06.09 16:55) [18]

После этих изменений "Access violation" перестало выскакивать.
Хочется понять - почему оно появлялось до этого.


Сергей М.   (2009-06-18 16:55:00) [2]


> помогло


> Но осталась непонятка все-таки с "Access violation"


Тогда что же и в чем тебе "помогло", если AV как было так и осталось ?


Fr   (2009-06-18 16:55:00) [3]


> нету проверки на выход за строку

здесь это несущественно, т.к. длина s, начиная с х гораздо больше 8


Fr   (2009-06-18 16:50:00) [4]


> Сергей М. ©   (18.06.09 15:57) [12]

Спасибо, вроде, помогло. Вставил это и убрал
lvViewList.OwnerData:=false;
lvViewList.OwnerData:=true;
lvViewList.Items.Count:=tmpSL.Count;


Но осталась непонятка все-таки с "Access violation" ...


clickmaker   (2009-06-18 16:47:00) [5]

> s1:=Copy(s,x+7,y);
> s1:=Copy(s,x+8,y);

нету проверки на выход за строку


Fr   (2009-06-18 16:37:00) [6]


> а как выглядит обработчик OnData?


procedure TfrmViewList.lvViewListData(Sender: TObject;
 Item: TListItem);
var
 s,s1 : string;
 x,y: integer;
begin
 s:=tmpSL[item.Index];
 y:=Length(s);
 x:=Pos('..."',s);
 if x>0 then begin
   s1:=Copy(s,x+7,y);
   item.Caption:=Copy(s1,1,Pos('"',s1)-1);
 end
 else item.Caption:='';

 x:=item.Index;
 item.Caption:=IntToStr(x+1)+'. '+item.Caption;

 x:=Pos('..."',s);
 if x>0 then begin
   s1:=Copy(s,x+8,y);
   item.SubItems.Add(Copy(s1,1,Pos('"',s1)-1));
 end
 else item.SubItems.Add('');
end;


clickmaker   (2009-06-18 16:13:00) [7]

> происходит "Access violation" и Делфи останавливается на
> строчке с ShowModal (запускаю из среды).

а как выглядит обработчик OnData?


Сергей М.   (2009-06-18 15:57:00) [8]

lvViewList. Items.BeginUpdate;
lvViewList. Items.EndUpdate;


Fr   (2009-06-18 15:56:00) [9]


> Тогда я не понял, как вяжется...

Сначала работает первая процедура главной формы. По ShowModal она нормально отображает форму с виртуальным списком. Когда я кликаю по заголовку колонки TListView в этой модальной форме, то операторы во второй процедуре отрабатывают все, но после выхода из этой процедуры происходит "Access violation" и Делфи останавливается на строчке с ShowModal (запускаю из среды).


> lvViewList.BeginUpdate;
> lvViewList.EndUpdate;

не срабатывает, т.к. "Undeclared identifier: 'BeginUpdate'"


Dennis I. Komarov   (2009-06-18 15:49:00) [10]


> вирт.режиме

упс...


Сергей М.   (2009-06-18 15:33:00) [11]


> Dennis I. Komarov ©   (18.06.09 15:29) [7]


CustomSort не работает в вирт.режиме


Сергей М.   (2009-06-18 15:32:00) [12]

Тогда я не понял, как вяжется


> Форма .. нормально показывается по ShowModal


с


> Access violation..." на строчке frmViewList.ShowModal;


procedure TfrmViewList.lvViewListColumnClick(Sender: TObject;
Column: TListColumn);
begin
..
  lvViewList.BeginUpdate;
  // ... здесь делаешь сортировку списка
  lvViewList.EndUpdate;
..
end;


Dennis I. Komarov   (2009-06-18 15:29:00) [13]

ListView.CustomSort


Fr   (2009-06-18 15:23:00) [14]

Почему не успел кликнуть на колонке?
Форма с заполненным ListView нормально показывается по ShowModal до моего клика по заголовку колонки.
После этого данные сортируются и при выходе из процедуры lvViewListColumnClickвылетает ошибка ...

Если убрать строчки lvViewList.OwnerData:=false;и lvViewList.OwnerData:=true;, то сортировка списка нормально происходит, но не отображаются никакие изменения, пока я, например, не сверну/разверну форму frmViewList


Сергей М.   (2009-06-18 15:15:00) [15]


> Список из которого я подгружаю данные отсортировал


Как же ты умудрился его отсортировать, если ты даже на колонке листвью не успел кликнуть, потому что форма, на которой твой листвью размещен, еще невидима, а первая же попытка сделать ее видимой приводит к исключению ?)


Fr   (2009-06-18 15:05:00) [16]


> А сортировка в вирт.режиме сводится к сортировке (любым
> требуемым удобным способом) массива (или списка), к которому
> обращаются обработчики OnData,

Список из которого я подгружаю данные отсортировал. Но возникла другая проблема:

Procedure ...
begin
// ...
   tmpSL:=TStringList.Create;
       frmViewList:=TfrmViewList.Create(Application);
       try
         frmViewList.lvViewList.OwnerData:=true;
         // ... здесь заполняю tmpSL значениями
         frmViewList.lvViewList.Items.Count:=tmpSL.Count;
         frmViewList.ShowModal;
       finally
         frmViewList.Free;
         tmpSL.Free;
       end;
// ...
end;

procedure TfrmViewList.lvViewListColumnClick(Sender: TObject;
 Column: TListColumn);
begin
 if Column=lvViewList.Column[0] then begin
   tmpSL.Sorted:=false;
   lvViewList.OwnerData:=false;
   // ... здесь делаю нужную сортировку списка
   tmpSL.Sort;
   lvViewList.OwnerData:=true;
   lvViewList.Items.Count:=tmpSL.Count;
 end;
end;


при выходе из процедуры ColumnClickполучаю "Access violation..." на строчке frmViewList.ShowModal;

Что я делаю не так?


Сергей М.   (2009-06-18 14:28:00) [17]

Тогда зачем приплел "по клику на заголовке колонки" ?
И колонки и клики на них одинаковы, что в обычном что в вирт.режиме..

А сортировка в вирт.режиме сводится к сортировке (любым требуемым удобным способом) массива (или списка), к которому обращаются обработчики OnData, OnDataFind, OnDataHint и OnDataStateChange .


Fr   (2009-06-18 14:20:00) [18]


> Сергей М. ©   (18.06.09 14:02) [1]

да :)


Сергей М.   (2009-06-18 14:02:00) [19]

А в обычном режиме умеешь ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо