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

Вниз

Сортировка TListView   Найти похожие ветки 

 
Jumbo   (2003-07-13 13:13) [0]

Как отсортировать TListView например по второму столбцу?


 
Семен Сорокин ©   (2003-07-13 15:24) [1]

ListView_SortItems в CommCtrl


 
Jumbo   (2003-07-13 22:08) [2]

Не нашел этой функции :(


 
Ученик ©   (2003-07-13 22:31) [3]

>Jumbo (13.07.03 13:13)

procedure TForm1.ListView1Compare(Sender: TObject; Item1, Item2: TListItem;
Data: Integer; var Compare: Integer);
begin
if Item1.SubItems.Count <= Data then
Compare := -1
else if Item2.SubItems.Count <= Data then
Compare := 1
else
Compare := CompareText(Item1.SubItems[Data], Item2.SubItems[Data])
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListView1.CustomSort(nil, 0) // для второй колонки - 0
end;

Может быть можно проще :-)


 
RepIn   (2003-07-14 00:13) [4]

Вот тебе еще процедурка :)

{
Сортировать начиная со строки FirstRow и до строки LastRow, по значениям колонки Column
Do sort since a line FirstRow and up to a line LastRow, on values of a column Column
}

procedure QuickSortListViewByInterval(var ListView : TListView;
Column : integer; // По этой колонке сортировать / Do sort by this column
FirstRow : integer; // С этой строки начать / From this line to begin
LastRow : integer; // На этой закончить / On this to complete
TypeCol : integer); // Тип данных в сортируемой кол-ке / Type of data in sorted column
// 1 - integer; other - string (ASC sort);
var li : TListItem;
item : string;
Data : pointer;
procedure switchIT(i, j : integer);
var ACol : integer;
begin
item := ListView.Items[i].Caption;
Data := ListView.Items[i].Data;
ListView.Items[i].Caption := ListView.Items[j].Caption;
ListView.Items[j].Caption := item;
ListView.Items[i].Data := ListView.Items[j].Data;
ListView.Items[j].Data := Data;
for ACol := 0 to ListView.Columns.Count - 2 do
begin
try
item := ListView.Items[i].SubItems[ACol];
ListView.Items[i].SubItems[ACol] := ListView.Items[j].SubItems[ACol];
ListView.Items[j].SubItems[ACol] := item;
except
end
end;

end;
function GetIntegerFromRowCol(Col, Row : integer) : integer;
begin
if Col = 0 then Result := StrToIntDef(ListView.Items[Row].Caption, 0)
else Result := StrToIntDef(ListView.Items[Row].SubItems[Column-1], 0)
end;
function GetstringFromRowCol(Col, Row : integer) : string;
begin
if Col = 0 then Result := ListView.Items[Row].Caption
else Result := ListView.Items[Row].SubItems[Column-1];
end;

procedure QuickSortListViewAsNumeric(L, R : integer);
var
i, j : integer;
key : integer;
begin
repeat
i := L; j := R;
key := GetIntegerFromRowCol(Column, (L + R) shr 1);
repeat
while GetIntegerFromRowCol(Column, i) < key do inc(i);
while key < GetIntegerFromRowCol(Column, j) do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsNumeric(L, j);
L := i;
until i >= R;
end;
procedure QuickSortListViewAsstring(L, R : integer);
var
i, j : integer;
key : string;
begin
repeat
i := L; j := R;
key := GetstringFromRowCol(Column, (L + R) shr 1);
repeat
// для сортировки в обратном порядке / For sorting in the inverse order
// следует поменять знак < на > / have to change sign < on >
// в след-х двух строчках / in the next two lines
while AnsiStrIComp(PChar(GetstringFromRowCol(Column, i)), PChar(key)) < 0 do inc(i);
while AnsiStrIComp(PChar(key), PChar(GetstringFromRowCol(Column, j))) < 0 do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsstring(L, j);
L := i;
until i >= R;
end;


begin
try
Screen.Cursor := crHourGlass;
if (LastRow > ListView.Items.Count - 1) then LastRow := ListView.Items.Count - 1;
if (FirstRow < 0) then FirstRow := 0;
case TypeCol of
1 : QuickSortListViewAsNumeric(FirstRow, LastRow );
else
QuickSortListViewAsstring(FirstRow, LastRow);
end;

finally
Screen.Cursor := crDefault;
end;
end;


 
Alex Repin   (2003-07-14 00:13) [5]

Вот тебе еще процедурка :)

{
Сортировать начиная со строки FirstRow и до строки LastRow, по значениям колонки Column
Do sort since a line FirstRow and up to a line LastRow, on values of a column Column
}

procedure QuickSortListViewByInterval(var ListView : TListView;
Column : integer; // По этой колонке сортировать / Do sort by this column
FirstRow : integer; // С этой строки начать / From this line to begin
LastRow : integer; // На этой закончить / On this to complete
TypeCol : integer); // Тип данных в сортируемой кол-ке / Type of data in sorted column
// 1 - integer; other - string (ASC sort);
var li : TListItem;
item : string;
Data : pointer;
procedure switchIT(i, j : integer);
var ACol : integer;
begin
item := ListView.Items[i].Caption;
Data := ListView.Items[i].Data;
ListView.Items[i].Caption := ListView.Items[j].Caption;
ListView.Items[j].Caption := item;
ListView.Items[i].Data := ListView.Items[j].Data;
ListView.Items[j].Data := Data;
for ACol := 0 to ListView.Columns.Count - 2 do
begin
try
item := ListView.Items[i].SubItems[ACol];
ListView.Items[i].SubItems[ACol] := ListView.Items[j].SubItems[ACol];
ListView.Items[j].SubItems[ACol] := item;
except
end
end;

end;
function GetIntegerFromRowCol(Col, Row : integer) : integer;
begin
if Col = 0 then Result := StrToIntDef(ListView.Items[Row].Caption, 0)
else Result := StrToIntDef(ListView.Items[Row].SubItems[Column-1], 0)
end;
function GetstringFromRowCol(Col, Row : integer) : string;
begin
if Col = 0 then Result := ListView.Items[Row].Caption
else Result := ListView.Items[Row].SubItems[Column-1];
end;

procedure QuickSortListViewAsNumeric(L, R : integer);
var
i, j : integer;
key : integer;
begin
repeat
i := L; j := R;
key := GetIntegerFromRowCol(Column, (L + R) shr 1);
repeat
while GetIntegerFromRowCol(Column, i) < key do inc(i);
while key < GetIntegerFromRowCol(Column, j) do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsNumeric(L, j);
L := i;
until i >= R;
end;
procedure QuickSortListViewAsstring(L, R : integer);
var
i, j : integer;
key : string;
begin
repeat
i := L; j := R;
key := GetstringFromRowCol(Column, (L + R) shr 1);
repeat
// для сортировки в обратном порядке / For sorting in the inverse order
// следует поменять знак < на > / have to change sign < on >
// в след-х двух строчках / in the next two lines
while AnsiStrIComp(PChar(GetstringFromRowCol(Column, i)), PChar(key)) < 0 do inc(i);
while AnsiStrIComp(PChar(key), PChar(GetstringFromRowCol(Column, j))) < 0 do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsstring(L, j);
L := i;
until i >= R;
end;


begin
try
Screen.Cursor := crHourGlass;
if (LastRow > ListView.Items.Count - 1) then LastRow := ListView.Items.Count - 1;
if (FirstRow < 0) then FirstRow := 0;
case TypeCol of
1 : QuickSortListViewAsNumeric(FirstRow, LastRow );
else
QuickSortListViewAsstring(FirstRow, LastRow);
end;

finally
Screen.Cursor := crDefault;
end;
end;


 
void1987   (2003-07-14 00:14) [6]

Вот тебе еще процедурка :)

{
Сортировать начиная со строки FirstRow и до строки LastRow, по значениям колонки Column
Do sort since a line FirstRow and up to a line LastRow, on values of a column Column
}

procedure QuickSortListViewByInterval(var ListView : TListView;
Column : integer; // По этой колонке сортировать / Do sort by this column
FirstRow : integer; // С этой строки начать / From this line to begin
LastRow : integer; // На этой закончить / On this to complete
TypeCol : integer); // Тип данных в сортируемой кол-ке / Type of data in sorted column
// 1 - integer; other - string (ASC sort);
var li : TListItem;
item : string;
Data : pointer;
procedure switchIT(i, j : integer);
var ACol : integer;
begin
item := ListView.Items[i].Caption;
Data := ListView.Items[i].Data;
ListView.Items[i].Caption := ListView.Items[j].Caption;
ListView.Items[j].Caption := item;
ListView.Items[i].Data := ListView.Items[j].Data;
ListView.Items[j].Data := Data;
for ACol := 0 to ListView.Columns.Count - 2 do
begin
try
item := ListView.Items[i].SubItems[ACol];
ListView.Items[i].SubItems[ACol] := ListView.Items[j].SubItems[ACol];
ListView.Items[j].SubItems[ACol] := item;
except
end
end;

end;
function GetIntegerFromRowCol(Col, Row : integer) : integer;
begin
if Col = 0 then Result := StrToIntDef(ListView.Items[Row].Caption, 0)
else Result := StrToIntDef(ListView.Items[Row].SubItems[Column-1], 0)
end;
function GetstringFromRowCol(Col, Row : integer) : string;
begin
if Col = 0 then Result := ListView.Items[Row].Caption
else Result := ListView.Items[Row].SubItems[Column-1];
end;

procedure QuickSortListViewAsNumeric(L, R : integer);
var
i, j : integer;
key : integer;
begin
repeat
i := L; j := R;
key := GetIntegerFromRowCol(Column, (L + R) shr 1);
repeat
while GetIntegerFromRowCol(Column, i) < key do inc(i);
while key < GetIntegerFromRowCol(Column, j) do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsNumeric(L, j);
L := i;
until i >= R;
end;
procedure QuickSortListViewAsstring(L, R : integer);
var
i, j : integer;
key : string;
begin
repeat
i := L; j := R;
key := GetstringFromRowCol(Column, (L + R) shr 1);
repeat
// для сортировки в обратном порядке / For sorting in the inverse order
// следует поменять знак < на > / have to change sign < on >
// в след-х двух строчках / in the next two lines
while AnsiStrIComp(PChar(GetstringFromRowCol(Column, i)), PChar(key)) < 0 do inc(i);
while AnsiStrIComp(PChar(key), PChar(GetstringFromRowCol(Column, j))) < 0 do dec(j);
if i <= j then
begin
// Exchange
switchIT(i,j);
inc(i); dec(j);
end;
until i > j;
if L < j then QuickSortListViewAsstring(L, j);
L := i;
until i >= R;
end;


begin
try
Screen.Cursor := crHourGlass;
if (LastRow > ListView.Items.Count - 1) then LastRow := ListView.Items.Count - 1;
if (FirstRow < 0) then FirstRow := 0;
case TypeCol of
1 : QuickSortListViewAsNumeric(FirstRow, LastRow );
else
QuickSortListViewAsstring(FirstRow, LastRow);
end;

finally
Screen.Cursor := crDefault;
end;
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
14-78057
Andryk
2003-07-09 15:22
2003.07.24
Письмо Пьера Безухова :о)))


14-78105
Soft
2003-07-08 13:27
2003.07.24
Как вы относитесь к рабству?


4-78191
evvcom
2003-05-21 16:32
2003.07.24
LoadLibrary и LoadLibraryEx


6-78023
Fiend
2003-05-19 17:25
2003.07.24
Письма и вложения


1-77940
SergeyI
2003-07-10 16:33
2003.07.24
TQuickRep как с ним работать ?