Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
9-77704
Antichacker
2003-01-31 10:21
2003.07.24
Существует ли какая-либо документация по GLScene?(Eng)


14-78098
Milz
2003-07-07 12:29
2003.07.24
Восстановление Win XP


7-78172
Nucl
2003-05-16 13:19
2003.07.24
2 монитора


3-77806
werus
2003-06-29 04:49
2003.07.24
Как программно создать псевдоним BDE?


14-78057
Andryk
2003-07-09 15:22
2003.07.24
Письмо Пьера Безухова :о)))





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский