procedure QuickSort(Grid: TStringGrid; iLo, iHi: Integer); var Lo, Hi : Integer; Mid: String ; begin Lo := iLo ; Hi := iHi ; Mid := Grid.Cells[ACol,(Lo + Hi) div 2]; repeat if Order and not NumOrStr then //按正序、字符排 begin while Grid.Cells[ACol,Lo] < Mid do Inc(Lo); while Grid.Cells[ACol,Hi] > Mid do Dec(Hi); end ; if not Order and not NumOrStr then //按反序、字符排 begin while Grid.Cells[ACol,Lo] > Mid do Inc(Lo); while Grid.Cells[ACol,Hi] < Mid do Dec(Hi); end; if NumOrStr then begin if Grid.Cells[ACol,Lo] = '' then Grid.Cells[ACol,Lo] := '0' ; if Grid.Cells[ACol,Hi] = '' then Grid.Cells[ACol,Hi] := '0' ; if Mid = '' then Mid := '0' ; if Order then begin //按正序、数字排 while StrToFloat(Grid.Cells[ACol,Lo]) < StrToFloat(Mid) do Inc(Lo); while StrToFloat(Grid.Cells[ACol,Hi]) > StrToFloat(Mid) do Dec(Hi); end else begin //按反序、数字排 while StrToFloat(Grid.Cells[ACol,Lo]) > StrToFloat(Mid) do Inc(Lo); while StrToFloat(Grid.Cells[ACol,Hi]) < StrToFloat(Mid) do Dec(Hi); end; end ; if Lo <= Hi then begin MoveStringGridData(Grid, Lo, Hi) ; Inc(Lo); Dec(Hi); end; until Lo > Hi; if Hi > iLo then QuickSort(Grid, iLo, Hi); if Lo < iHi then QuickSort(Grid, Lo, iHi); end;begin try QuickSort(Grid, Grid.FixedRows, Grid.RowCount - 1 ) ; except on E: Exception do Application.MessageBox(Pchar('系统在排序数据的时候遇到异常:'#13+E.message+#13'请重试,如果该问题依然存在请与程序供应商联系!'),'系统错误',MB_OK+MB_ICONERROR) ; end; end;
在原来系统的这个TSTRINGGRIG上不能实现这个功能。
procedure QuickSort(Grid: TStringGrid; iLo, iHi: Integer);
var
Lo, Hi : Integer;
Mid: String ;
begin
Lo := iLo ;
Hi := iHi ;
Mid := Grid.Cells[ACol,(Lo + Hi) div 2];
repeat
if Order and not NumOrStr then //按正序、字符排
begin
while Grid.Cells[ACol,Lo] < Mid do Inc(Lo);
while Grid.Cells[ACol,Hi] > Mid do Dec(Hi);
end ;
if not Order and not NumOrStr then //按反序、字符排
begin
while Grid.Cells[ACol,Lo] > Mid do Inc(Lo);
while Grid.Cells[ACol,Hi] < Mid do Dec(Hi);
end; if NumOrStr then
begin
if Grid.Cells[ACol,Lo] = '' then Grid.Cells[ACol,Lo] := '0' ;
if Grid.Cells[ACol,Hi] = '' then Grid.Cells[ACol,Hi] := '0' ;
if Mid = '' then Mid := '0' ;
if Order then
begin //按正序、数字排
while StrToFloat(Grid.Cells[ACol,Lo]) < StrToFloat(Mid) do Inc(Lo);
while StrToFloat(Grid.Cells[ACol,Hi]) > StrToFloat(Mid) do Dec(Hi);
end else
begin //按反序、数字排
while StrToFloat(Grid.Cells[ACol,Lo]) > StrToFloat(Mid) do Inc(Lo);
while StrToFloat(Grid.Cells[ACol,Hi]) < StrToFloat(Mid) do Dec(Hi);
end;
end ;
if Lo <= Hi then
begin
MoveStringGridData(Grid, Lo, Hi) ;
Inc(Lo);
Dec(Hi);
end;
until Lo > Hi;
if Hi > iLo then QuickSort(Grid, iLo, Hi);
if Lo < iHi then QuickSort(Grid, Lo, iHi);
end;begin
try
QuickSort(Grid, Grid.FixedRows, Grid.RowCount - 1 ) ;
except
on E: Exception do
Application.MessageBox(Pchar('系统在排序数据的时候遇到异常:'#13+E.message+#13'请重试,如果该问题依然存在请与程序供应商联系!'),'系统错误',MB_OK+MB_ICONERROR) ;
end;
end;
我没有看完他的程序
我的意思是在:标题的click里面写代码
让该列的sort换成升或者降就ok了, 只有7、8行代码就oik了
if(nSortCol != Column->Index)
{
nSortCol = Column->Index;
bAscend = true;
}
else
bAscend = !bAscend;
if ( Column->Index != 0 )
lstvWarning->CustomSort(NULL, 0);
else
{
struct SortParam Param; Param.nCol = Column->Index;
Param.IsAsc = bAscend; //true为升序,false为降序
lstvWarning->CustomSort(MySortProc, (long)&Param);
}
在OnCompare事件中
try
{
if(nSortCol == -1)
Compare = 0; // 不排序
else if(nSortCol == 0)
{
Compare = CompareStr(Item1->Caption, Item2->Caption);
}else
Compare = CompareStr(Item1->SubItems->Strings[nSortCol-1],
Item2->SubItems->Strings[nSortCol-1]);
if(!bAscend)
Compare = -Compare; // 降序排列
}
catch(...)
{}刚从bcb转到delphi,请各位指教...
不好意思看错,这个是TListview跟搂主的不搭边_^_.