![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка 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]А в обычном режиме умеешь ?