给 StringGrid 的 ACol 列快速法排序

转载 2007年09月12日 09:32:00
procedure TFrmDBDL.GridQuickSort(Grid: TStringGrid; ACol: Integer; Order,
  NumOrStr: Boolean);
(
*  函数功能:给 StringGrid 的 ACol 列快速法排序
(
*            Order: True 从小到大
(
*                 : False 从大到小
(
*        NumOrStr : true 值的类型是Integer
(
*                 : False 值的类型是String
(
*  函数说明:对于日期,时间等类型数据均可按字符方式排序, *)
  procedure MoveStringGridData(Grid: TStringGrid; Sou,Des :Integer );
  var
    TmpStrList: TStringList ;
    K : Integer ;
  begin
    TmpStrList :
=TStringList.Create() ;
    
try
      TmpStrList :
=TStringList.Create() ;
      TmpStrList.Clear ;
      
for K := Grid.FixedCols to Grid.ColCount -1 do
        TmpStrList.Add(Grid.Cells[K,Sou]) ;
      Grid.Rows [Sou] :
= Grid.Rows [Des] ;
      
for K := Grid.FixedCols to Grid.ColCount -1 do
        Grid.Cells [K,Des]:
= TmpStrList.Strings[K] ;
    
finally
      TmpStrList.Free ; 
    end;
  end; 

  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;
 

delphi stringGrid小示列

  • 2011年09月13日 16:01
  • 3KB
  • 下载

TStringGrid类的StringGrid用法

  • 2011年08月22日 17:32
  • 17KB
  • 下载

在StringGrid中每行添加一个选择框(checkbox)

StringGrid得实际使用中,经常会遇到这样的需求,用户想对每一行的记录作一个标记,想对做了标记的记录作特别的操作。例如想删除多条记录。     在网页中经常有类似的应用,例如在电子邮箱里,显示...
  • rznice
  • rznice
  • 2013年11月05日 15:53
  • 3969

C++ 快速排序法

  • 2012年08月11日 19:11
  • 1.05MB
  • 下载

stringgrid内置控件

unit Unit1;interfaceuses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,...

分治法快速排序算法QuickSort C++

  • 2013年11月04日 14:23
  • 12KB
  • 下载

分治法快速排序算法QuickSort

  • 2013年11月04日 14:28
  • 11KB
  • 下载

StringGrid使用全书

StringGrid行列的增加和删除如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样StringGrid组件Cells内容分行显示在Tstringgrid.ondr...

多种排序法,如插入,快速等

  • 2008年10月12日 00:49
  • 5KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给 StringGrid 的 ACol 列快速法排序
举报原因:
原因补充:

(最多只允许输入30个字)