[续] 旷世难题(实现Dbgrid第一列为序号的方法 )(5分)

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
以前的帖子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2960059
太长了,所以新开一个帖子继续

如今我又增加了写功能,主要是:
1、如果有Footer,会自动在Footer的第一列上写上总记录条数值;
2、如果Cell内的字不能全部显示,grid会自动通过hint提示;

新控件下载地址:
http://bbs.2ccc.com/attachments/2006/qingyun_2006110123538.rar
 
我先跟进
 
好东西啊,向楼主学习!!
 
我用BDE, Recno都是 -1 啊!!真要命!
 
请教 青云! 我安装上去设计模式下数据可以显示的,但是编译的时候提示:
Project Project1.exe raised exception class EReadError with message 'PROPERTY ShowSeriaNo does not exist' process stopped Use Step or run to continue
请教问题在那里?
 
显示行号你得从dbgrid继承一个你自己的表格控件,然后在draw方法里操作datalin的activerecord,取得它的值,这个东西就是记录的行号,只要把这个行号draw出来就ok了
 
千万不能用recno属性,否则你写一次就回触发一次scroll事件,如果你作的是三层开发,那麻烦可就大了,只能用我的方法
 
楼上的jzx 朋友,谢谢您的提醒,我现在用的就是recno。

你说的 “在draw方法里操作datalin的activerecord”我不太明白,

能否把你实现的主要代码贴出来,我完善一下。希望能够更好的服务于大家。
 
不好意思,敲错了,
DBGrid都有一个DataLink对象的,这个DataLink对象就是一个“观察者”,它负责把所有的数据集事件转发给表格控件,如果数据集变了,DataLink会通知表格做出改变。在DataLink里的ActiveRecord属性就是调用的数据集的保护属性ActiveRecord,这就是记录的行号,数据集的recno是对这个ActiveRecord进行的封装,只是recno封装的代码里面还会触发Scroll事件,这么说就明白了吧

//代码是我直接敲的,不一定对,总之就是这么个意思
TMyGrid = class(TDBGrid)
protected
procedure DrawCell(ACol, ARow : Integer; AState : TColumnState); override;
end;
....

TMyGrid.DrawCell(ACol, ARow : Integer; AState : TColumnState);
var
r : TRect;
begin
if ARow = 0 then Exit;//跳过表头
if ACol = 0 then//第一列显示行号
begin
R = Self.CellRect(ACol, ARow);//获取单元格的RECT
Canvas.TextOut(R, IntToStr(DataLink.ActiveRecord));//显示行号
end;
end;

基本就是这个意思
 
楼上的jzx朋友,你提供的方法不错,
我把DbGridEh.pas里第 10717 行的程序:
//append 状态
if Column.Field.Dataset.State = dsInsert then
begin
if self.FooterRowCount = 0 then
i := MouseCoord(Rect.Left + 1, Rect.Top + 1).Y +
DataSource.Dataset.RecordCount - VisibleRowCount
else
i := MouseCoord(Rect.Left + 1, Rect.Top + 1).Y +
DataSource.Dataset.RecordCount - VisibleRowCount + 1 + FooterRowCount;
if not Self.STFilter.Visible then
i := i + 1;
str := Format('%d', );
end
else if (SumList.RecNo > 0) then
Str := Format('%d', [SumList.RecNo]);

替换成下面这句话,

Str := Format('%d', [DataLink.ActiveRecord + 1]);
这样确实效果会更好点。而且在 Insert的情况下也能够显示正常。
 
我從Wwdbgrid繼承過來,自己寫了一個排序功能,但是我點擊Title時那個三角圖標只顯示一下就不見了,問問大家是InforPower的問題還是我寫的不對.
unit DBGridXP;

interface

uses
SysUtils, Classes, Controls, Grids, DB, ADODB, Wwdbigrd, Wwdbgrid, DBGrids,
Graphics, Types;

type
TDBGridXP = class(TwwDBGrid)
private

protected
procedure DoTitleButtonClick(AFieldName: string); override;//排序
public
Bmp: TBitmap;
imgUpDown: TImageList;
constructor Create(AOwner: TComponent); override;
published

end;


implementation

{ TDBGridXP }
{$R other.RES}

constructor TDBGridXP.Create(AOwner: TComponent);
begin
inherited;
Bmp := TBitmap.Create;
Bmp.LoadFromResourceName(HInstance, 'UP');
imgUpDown := TImageList.CreateSize(Bmp.Width, Bmp.Height);
imgUpDown.AddMasked(Bmp, clFuchsia);
Bmp.LoadFromResourceName(HInstance, 'DOWN');
imgUpDown.AddMasked(Bmp, clFuchsia);
end;

procedure TDBGridXP.DoTitleButtonClick(AFieldName: string);
var
ColumnFieldName: string;
begin
inherited;
With DataSource.DataSet.FindField(AFieldName) do
begin
if not (FieldKind in [fkData,fkLookup]) then exit;
if FieldKind =fkData then
ColumnFieldName := UpperCase(AFieldName)
else
ColumnFieldName := UpperCase(KeyFields);
end;
with TADODataSet(DataSource.DataSet) do
begin
DisableControls;
if (Pos(ColumnFieldName,Sort) > 0) then
begin
if (Pos('ASC',Sort) > 0) then
Sort := ColumnFieldName +' DESC'
else
Sort := ColumnFieldName +' ASC'
end
else
Sort := ColumnFieldName +' ASC';
EnableControls;
end;
if Pos('ASC',TADODataSet(DataSource.DataSet).Sort) <> 0 then
imgUpDown.Draw(Canvas, DrawCellInfo.Rect.Right - 16, 1, 0)
else
imgUpDown.Draw(Canvas, DrawCellInfo.Rect.Right - 16, 1, 1);
end;

end.
 
to 青云,
采用 Str := Format('%d', [DataLink.ActiveRecord + 1]); 好像有问题,数据集记录多,下移记录,行号就不对了!
 
多谢楼上xdd_pyx朋友的测试,我也发现了同样的问题,现在代码还原原样了。同时也非常感谢jzx朋友提供的建议。估计是我没有能够正确地引用。
 
用StringGrid不就行了,要这么死脑筋干什么.StringGrid实现起来太简单了,只要用Cells[0,RowNum] := IntToStr(RowNum)就行了
 
帮顶!

-------------------------------------
站长开发推广同盟 关注网站,关注技术!

海量源代码下载,二次开发绝佳站点

网址: http://www.source520.com
http://www.source520.net
 
1、如果有Footer,会自动在Footer的第一列上写上总记录条数值;

请问这个功能是怎么实现的?
 
TO: 青云
请问怎么在delphi2005中安装呢. 各位.........
 
不错,已经在D7中安装了,好用,就是保存为Excel文件时,有点慢。
 
http://www.delphibbs.com/keylife/iblog_show.asp?xid=19587
直接处理TDBGrid类,不需要继承派生一个新的组件并安装的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部