给 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小示列

stringgrid内置控件

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

C++ 快速排序法

  • 2012-08-11 19:11
  • 1.05MB
  • 下载

StringGrid

今天在书上看到了StringGrid的使用,写的例子很少,以前在做毕业设计时我也使用过这个控件,不过现在都很久没有使用这个控件了,所以都有点生疏了;其实一直以来我经常光顾的一个学习delphi的网站就...

StringGrid使用全书

StringGrid行列的增加和删除如何编写使StringGrid中的一列具有Check功能,和CheckBox效果一样StringGrid组件Cells内容分行显示在Tstringgrid.ondr...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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