delphi7 stringgrid 点列头排序
最近在做stringgrid的项目, 下面delphi7 正常使用,均摘抄网路,但做过细微调整才能正常使用
首先排序的过程
procedure Quicksort(Grid: TStringGrid; var List: array of integer; min, max, sortcol, datatype: Integer);
{List is a list of rownumbers in the grid being sorted}
var
med_value: integer;
hi, lo, i: Integer;
function compare(val1, val2: string): integer;
var
int1, int2: integer;
float1, float2: extended;
errcode: integer;
begin
case datatype of
0:
result := ANSIComparetext(val1, val2);
1:
begin
int1 := strtointdef(val1, 0);
int2 := strtointdef(val2, 0);
if int1 > int2 then
result := 1
else if int1 < int2 then
result := -1
else
result := 0;
end;
2:
begin
val(val1, float1, errcode);
if errcode <> 0 then
float1 := 0;
val(val2, float2, errcode);
if errcode <> 0 then
float2 := 0;
if float1 > float2 then
result := 1
else if float1 < float2 then
result := -1
else
result := 0;
end;
else
result := 0;
end;
end;
begin
{If the list has <= 1 element, it's sorted}
if (min >= max) then
Exit;
{Pick a dividing item randomly}
i := min + Trunc(Random(max - min + 1));
med_value := List[i];
List[i] := List[min]; { Swap it to the front so we can find it easily}
{Move the items smaller than this into the left
half of the list. Move the others into the right}
lo := min;
hi := max;
while (True) do
begin
// Look down from hi for a value < med_value.
while compare(Grid.cells[sortcol, List[hi]], grid.cells[sortcol, med_value]) >= 0 do
(*ANSIComparetext(Grid.cells[sortcol,List[hi]]
,grid.cells[sortcol,med_value])>=0 do*)
begin
hi := hi - 1;
if (hi <= lo) then
Break;
end;
if (hi <= lo) then
begin {We're done separating the items}
List[lo] := med_value;
Break;
end;
// Swap the lo and hi values.
List[lo] := List[hi];
inc(lo); {Look up from lo for a value >= med_value}
while Compare(grid.cells[sortcol, List[lo]], grid.cells[sortcol, med_value]) < 0 do
begin
inc(lo);
if (lo >= hi) then
break;
end;
if (lo >= hi) then
begin {We're done separating the items}
lo := hi;
List[hi] := med_value;
break;
end;
List[hi] := List[lo];
end;
{Sort the two sublists}
Quicksort(Grid, List, min, lo - 1, sortcol, datatype);
Quicksort(Grid, List, lo + 1, max, sortcol, datatype);
end;
//datatype 0:按字符排序 1:按整型排序 2:按浮点型排序
procedure Tfrmbase.Sortgrid(var Grid : TStringGrid; sortcol,datatype:integer);
var
i : integer;
tempgrid:tstringGrid;
list:array of integer;
begin
screen.cursor:=crhourglass;
tempgrid:=TStringgrid.create(nil);
with tempgrid do
begin
rowcount:=grid.rowcount;
colcount:=grid.colcount;
fixedrows:=grid.fixedrows;
end;
setlength(list,Grid.rowcount-Grid.fixedrows);
for i:= Grid.fixedrows to Grid.rowcount-1 do
begin
list[i-Grid.fixedrows]:=i;
tempgrid.rows[i].AddStrings(grid.rows[i]);
end;
quicksort(Grid, list,0,Grid.rowcount-Grid.fixedrows-1,sortcol,datatype);
for i:=0 to Grid.rowcount-Grid.fixedrows-1 do
begin
Grid.rows[i+Grid.fixedrows].Text := '';
Grid.rows[i+Grid.fixedrows].AddStrings(tempgrid.rows[list[i]]);
end;
Grid.row:=Grid.fixedrows;
tempgrid.free;
setlength(list,0);
screen.cursor:=crdefault;
end;
列头排序
procedure Tfrmtranstat.StringGrid1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
c: integer;
w: integer;
Grid: TStringGrid;
begin //单击排序
Grid := Sender as TStringGrid;
with Grid do
if y <= rowheights[0] then
begin
c := 0;
w := colwidths[0];
while (c < colcount) and (w <= x) do
begin
inc(c);
w := w + colwidths[c] + gridlinewidth;
end;
sortgrid(Grid, c, 0);
end;
end;
http://blog.csdn.net/y281252548/article/details/52527807
delphi7 stringgrid 点列头排序的更多相关文章
- easyui datagrid 点击列表头排序出现错乱的原因
之前我的导师,也就是带我的同事,使用datagrid,发现点击列表头排序出现乱序,按理说只有顺序和逆序两种排序结果.因为他比较忙,当时没解决,把排序禁掉了,后来又要求一定要排序,所以他交给我. 一开始 ...
- [WPF]ListView点击列头排序功能实现
[转] [WPF]ListView点击列头排序功能实现 这是一个非常常见的功能,要求也很简单,在Column Header上显示一个小三角表示表示现在是在哪个Header上的正序还是倒序就可以了. ...
- Delphi7中ClientDataSet的排序
http://eteda.iteye.com/blog/1141312 Delphi7中ClientDataSet的排序 博客分类: Delphi 1.控件ClientDataSet的属性Inde ...
- MFC listcontrol 分列 添加行数据 点击列头排序
适用于 对话框程序 1.在工具箱中拖出 ListControl,然后右键-属性,view-Report 让你的ListControl变成这幅模样! 2.添加ListControl控件的control类 ...
- 交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配、varchar2转化为nvarchar2字符缺失、case when else后的字符类型要一致
在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下. 设计的数据库的表结构如图1所示: 图1 要处出来student_name_,s.grade_,s.subject_name_,这三个属性, ...
- C++ 简单实现MFC ListControl 点击列头排序
说明: SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID ...
- MFC CListControl 点击列头排序的实现
SetItemData可以为每一行绑定一个DWORD类型的变量.用GetItemData可以获得这个变量.举个例子,假设CListCtrl中你需要显示某个数据表中的记录,该表有个流水号主键ID,一般这 ...
- DataWindow.NET 控件 实现点击列头排序
1.定义字段 Boolean ib_SetSort = true; string is_SortType = " ...
- 点击Listview列头排序
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader) ListView1.Sorted = ...
随机推荐
- ssh远程无法连接VM中的Ubuntu问题
Ubuntu ssh远程无法连接问题 1. 检查sudo ps -e|grep ssh 查看是否有ssh进程服务,如果没有的话,需要下载安装 sudo apt-get install openss ...
- XMPP之ios即时通讯客户端开发-配置XMPP基本信息之工程代码(五)
登录功能完成以后包含以下代码文件: AppDelegate.h AppDelegate.m LoginViewController.h LoginViewController.m LoginUser. ...
- 检索 04 --Stack栈 Queue队列 Hashtable哈希表
//Stack 先进后出 没有索引 Stack st = new Stack(); st.Push(12); st.Push(11); st.Push(22); st.Push(34); st.Pus ...
- 【bzoj3555】[Ctsc2014]企鹅QQ 简单哈希
传送门 题目分析 题意即求有多少对字符串只相差一个字符,枚举删除每个字符后的哈希, 看有多少相等即可. 比如有如下字符串:$Sd123$,其中S部分的哈希值为H,删除的是d,则原字符串的哈希值为$$( ...
- Android中使用JUnit测试
package com.meritit.lottery.test; import java.util.List; import android.test.AndroidTestCase; import ...
- [!!**!F6782A84A3BECEAADDB11DAC0C4E6346AC07E5344100738DAF4C6DA639D9081F!!**!]
testt 版权声明:本文博主原创文章,博客,未经同意不得转载.
- repo/git Android/CyanogenMod srouce code
For getting the whole Android/CM rom source code, 1. get the repo first.2. make sure the git is inst ...
- ios7 左右searchbar在设置cancelButton的title属性
经 [searchBarsetShowsCancelButton:YES];设置之后默认是"cancel",想改为中文的 在stackoverflow上參考了非常多方法都没用 这里 ...
- 从JDBC到commons-dbutils
1.前言 玩过Java web的人应该都接触过JDBC,正是有了它,Java程序才能轻松地访问数据库.JDBC很多人都会,但是为什么我还要写它呢?我曾经一度用烂了JDBC,一度认为JDBC不过如此,后 ...
- matlab 工具函数 —— normalize(归一化数据)
function x = normalize(x, mu, sigma) x = bsxfun(@minus, x, mu); x = bsxfun(@rdivide, x, sigma); end ...