Форум: "Начинающим";
Текущий архив: 2009.08.16;
Скачать: [xml.tar.bz2];
ВнизСортировка 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.016 c