TlistView 의 Column 을 클릭할때마다 소팅이 되도록 구현하였습니다.
일단 데이타들은 TCollection 객체에 들어있고요..
TCollection 에 있는 놈들은 TList 에 전부다 Add 되어 있는 상태입니다.
ListPositions 는 TListView고요
FPositions 는 TList 입니다.
<!--CodeS-->
ListPositions.Items.Count:= FPositions.Count;
ListPositions.Refresh;
<!--CodeE-->
그리고 Column 을 클릭했을 때 이벤트에 다음과 같이 연결했습니다.
<!--CodeS-->
var
iAccorDec : Integer = 1;
iColIndex : Integer = 0;
function CompareList(Item1, Item2:Pointer):Integer;
var
aItem1, aItem2 : TPositionItem;
stValue1, stValue2 : String;
// inner Function
function ValueCompare(Value1, Value2: Double): Integer; overload;
begin
if Value1 > Value2 then Result:= 1
else if Value1 < Value2 then Result := -1
else Result:= 0;
end;
function ValueCompare(Value1, Value2: Integer): Integer; overload;
begin
if Value1 > Value2 then Result:= 1
else if Value1 < Value2 then Result := -1
else Result:= 0;
end;
begin
// TypeCast
aItem1:= TPositionItem(Item1);
aItem2:= TPositionItem(Item2);
case iColIndex of
0 :
begin
if Pos(aItem1.Desc[1], 'F') > 0 then
Result := -1
else if Pos(aItem2.Desc[1], 'F') > 0 then
Result := 1
else
Result := CompareStr(aItem1.Desc, aItem2.Desc);
end;
1 :
begin
Result := CompareStr(stValue1, stValue2);
if Result = 0 then
Result:= ValueCompare(aItem1.Count, aItem2.Count);
end;
2 : Result:= ValueCompare(aItem1.Count, aItem2.Count);
3 : Result:= ValueCompare(aItem1.PrevCount, aItem2.PrevCount);
end;
Result:= Result * iAccorDec;
end;
procedure TVCCForm.ListPositionsColumnClick(Sender: TObject;
Column: TListColumn);
var
i, iSelect : Integer;
aItem : TListItem;
stSelect : String;
begin
iColIndex := Column.Index;
iSelect := ListPositions.SelCount;
if iSelect > 0 then
begin
aItem := ListPositions.Selected;
stSelect := aItem.Caption;
end;
// 아이콘 변경
for i:= 0 to ListPositions.Columns.Count-1 do
begin
if (i=Column.Index) then Continue;
ListPositions.Columns[i].ImageIndex:= -1;
end;
if ListPositions.Columns[Column.Index].ImageIndex < 0 then
begin
ListPositions.Columns[Column.Index].ImageIndex:= 1;
iAccorDec:= -1;
end
else
begin
ListPositions.Columns[Column.Index].ImageIndex:=
1 - ListPositions.Columns[Column.Index].ImageIndex;
iAccorDec:= 0 - iAccorDec;
end;
FPositions.Sort(CompareList);
ListPositions.Items.Count := FPositions.Count;
if iSelect > 0 then
begin
for i:=0 to ListPositions.Items.Count-1 do
begin
aItem := ListdPositions.Items.Item[i];
if CompareStr(stSelect, aItem.Caption) = 0 then
begin
ListPositions.Selected := aItem;
break;
end;
end;
end;
ListPositions.Refresh;
end;
<!--CodeE-->
그런데 이놈이 ListView 에 표시되는 항목이 하나만 있는 경우 에러가 발생하는데요.
왜 그런지 봤더니 Sort 시 CompareList 함수안에 들어갈때,
Item1에 해당하는 부분이 이상한 주소값으로 넘어와서 메모리 접근 에러가 발생하는겁니다.
도대체 왜 그럴까요?? 혹시 아시는분 계시면 좀 알려주세요 ㅠ.ㅠ