Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.08.16;
Скачать: CL | DM;

Вниз

Сортировка TListView в виртуальном режиме.   Найти похожие ветки 

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

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


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

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


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


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

да :)


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

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

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


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


> А сортировка в вирт.режиме сводится к сортировке (любым
> требуемым удобным способом) массива (или списка), к которому
> обращаются обработчики 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 15:15) [5]


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


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


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

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

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


 
Dennis I. Komarov ©   (2009-06-18 15:29) [7]

ListView.CustomSort


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

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


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


с


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


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


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


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


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


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


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

упс...


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


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

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


> lvViewList.BeginUpdate;
> lvViewList.EndUpdate;

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


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

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


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

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

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


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


> а как выглядит обработчик 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:47) [15]

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

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


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


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

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


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


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


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

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


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


> помогло


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


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


 
Fr   (2009-06-18 17:17) [19]


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

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



Страницы: 1 вся ветка

Текущий архив: 2009.08.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
2-1245237512
TheEd
2009-06-17 15:18
2009.08.16
Как принудительно "убить" InplaseEditor в StringGride


15-1244884195
Kerk
2009-06-13 13:09
2009.08.16
Как переводится chode?


15-1245079850
Cyrax
2009-06-15 19:30
2009.08.16
В каких случаях...


15-1245438799
Johnnnnn
2009-06-19 23:13
2009.08.16
Доступ к книге excel на сервере?


2-1245537180
Нойвам
2009-06-21 02:33
2009.08.16
Обработка чекбоксов