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

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间
强烈建议编辑出在D2006下的安装版本呵
 
1、如果有Footer,会自动在Footer的第一列上写上总记录条数值;

请问这个功能是怎么实现的?
 
帮顶!

╭=========================================╮

http://www.source520.com

站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载

http://www.source520.com/search/search.asp

"编程.站长"论坛搜索引擎-----为中国站长注入动力!
╰=========================================╯
 
这叫旷世难题。。。。。。。倒。。。。。
 
ActiveRecord 铁定不是 RecNo,JZX的说法是错误的。另外不要随便操作datalink,哪怕是
读数,会影响表格的其他操作的。
 
来自:kinneng, 时间:2006-1-22 21:23:57, ID:3337894
ActiveRecord 铁定不是 RecNo,JZX的说法是错误的。另外不要随便操作datalink,哪怕是
读数,会影响表格的其他操作的。

恩,不大同意DBGrid方面的专家kinneng的话,jzx通过重载来实现的话,用DataLink.ActiveRecord的确是不妥的,不过如果是在DBGrid.OnDrawColumnCell里面来取ActiveRecord的值,如我上面贴的笔记中的那样,作为行号的显示,那么应该是可以的

procedure TCustomDBGrid.DrawCell(ACol, ARow: Longint; ARect: TRect; AState: TGridDrawState);
begin
...
if (gdFixed in AState) and (ACol < 0) then
begin
...
end
else with Canvas do
begin
DrawColumn := Columns[ACol];
if not DrawColumn.Showing then Exit;
if not (gdFixed in AState) then
begin
Font := DrawColumn.Font;
Brush.Color := DrawColumn.Color;
end;
if ARow < 0 then
DrawTitleCell(ACol, ARow + FTitleOffset, DrawColumn, AState)
else if (FDataLink = nil) or not FDataLink.Active then
FillRect(ARect)
else
begin
Value := '';
OldActive := FDataLink.ActiveRecord;
try
FDataLink.ActiveRecord := ARow; // 设置DataLink.ActiveRecord=行号
...
if FDefaultDrawing then
WriteText(Canvas, ARect, 2, 2, Value, DrawColumn.Alignment,
UseRightToLeftAlignmentForField(DrawColumn.Field, DrawColumn.Alignment));
if Columns.State = csDefault then
DrawDataCell(ARect, DrawColumn.Field, AState);
DrawColumnCell(ARect, ACol, DrawColumn, AState); // 触发OnDrawColumnCell事件
finally
FDataLink.ActiveRecord := OldActive;
end;
...
end;
end;
...
end;
 
我只是信我见到的事实,我见到的事实是除非将数据库全部数据放进内存,否则的话
ActiveRecord跟数据库行号毫无关系。ActiveRecord是内存缓冲器的指针,不是DBGrid
专用的,内存缓冲器第一行数据刚巧是数据库第一行,那么ActiveRecord与RecNo等值,
否则,就不是等值,换言之,DBGrid显示数据库第一页的时候有效,翻了页或者第一行
上滚之后就失效,这种现象就是因为ActiveRecord与RecNo不是一回事,再次提醒,所
有对DataLink的操作,都必须慎重,否则会影响其它操作,导致出现莫名其妙的情况,
如果对数据集没有深究的话,也发现不出问题,动态调试,不会跳进错误的位置,推荐
多读点书,不是技巧类的书,是手册类的书,例如清大出版的Delphi高级类参考详解这
样的书,比一知半解便上马要强得多。
 
旷世难题?!
請樓主Delphi Help看一下Aggregates的用法,很輕松的實現!
Dbgrid------>DataSource-------->ClientDataSet(Aggregates)
我想我講的清楚了,
我寫程序時,遇到一個表需要序號時,都是這樣實現的,相信很多人,甚至那些大蝦們,可能有更好的方法!
 
这比用计算字段的获得序号的方法还差一些。
 
关注,晚上我来贴我的方法。
 
老大门做一个delphi 2006版的放上来好吗!
 
帮顶!

http://www.source520.com

站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载

http://www.source520.com/search/search.asp

"编程.站长"论坛搜索引擎-----为中国站长注入动力!
 
EhGrid支持Delphi2006的方法,共2处修改:

1、在EhLib.Inc文件尾部添加:
{$IFDEF VER180} { Borland Delphi 10.0 }
// {$DEFINE EH_LIB_35}
// {$DEFINE EH_LIB_4}
{$DEFINE EH_LIB_5}
{$DEFINE EH_LIB_6}
{$DEFINE EH_LIB_7}
{$DEFINE EH_LIB_8}
{$DEFINE EH_LIB_9}
{$ENDIF}

2、修改文件DbUtilsEh.pas,添加后几种的类型支持 找到STFldTypeMapEh替换掉旧可以了。

STFldTypeMapEh: array[TFieldType] of TSTOperandTypeEh = (
botNon, botString, botNumber, botNumber, botNumber,
botBoolean, botNumber, botNumber, botNumber, botDateTime, botDateTime, botDateTime,
botNon, botNon, botNumber, botNon, botString, botNon, botString,
botNon, botNon, botNon, botNon, botString, botString,
botNumber, botNon, botNon, botNon, botNon
{$IFDEF EH_LIB_5}
,botNon, botNon, botNon, botNon, botNon, botString
{$ENDIF}
{$IFDEF EH_LIB_6}, botDateTime, botNumber{$ENDIF}
{$IFDEF VER180},botNon,botString,botDateTime,botNon {$ENDIF}
);
 
楼:
我是楼主,我现在的DBGridEh已经用到了目前公司的一个大项目上,软件正在测试中。
客户发现一个问题,如下图:
http://bbs.2ccc.com/attachments/2006/qingyun_200631320455.jpg

就是在 Grid的第一行的某个字段上输入查询条件后,鼠标焦点再转到其它字段上,查询条件会自动复制,这样其实不符合一般人的操作习惯。


我想把这个自动复制功能去除掉,不知道该如何实现,希望大家能够和我一起探讨探讨.
 
试一试原版的DBGridEh是不是这样?
 
楼主的这份控件源码是在 Ehlib3.6 的基础上修改的吗?
能不能做出一份可以用在D2006下面的?
或者也可以写成继承DBGridEh的控件

我在网上找到一份继承自DBGridEh的控件,但是在D2006+Ehlib4.0修改版下用不了。
 
楼主的这份控件源码是在 Ehlib3.6 的基础上修改的吗?
能不能做出一份可以用在D2006下面的?
或者也可以写成继承DBGridEh的控件

我在网上找到一份继承自DBGridEh的控件,但是在D2006+Ehlib4.0修改版下用不了。
 
约有五百条的数据,刚好显示11条数据,Insert的时候,行号显示明显有误。
请强人楼主看看呀,有没有办法解决?

不过,如果实在没什么好法子的话,一直用Append也是可以的。其实现在一直就是用Append的。
 
还有,楼主能不能把其中修改的内容列出来呢,因为这个版本是基于3.4修改的
而现在已经有了4.0版本了
我的很多程序都是基于3.6,少数基于4.0的
真诚地谢谢楼主!希望把修改的方法告诉我们大家吧!
 
我已经不指望修改DBGrid和DBGridEh上就能正确显示行号,特别是Append和Insert,DBGrid(Eh)有时会上滚一行,有时又不会,是它父亲Grid自作多情搞出来的,没有理由修改Grid,这样会使其它Grid类控件混乱,但从DBGrid(Eh)无法得知这种界面调整。
 

Similar threads

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