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