在线急等,DBGRID的焦点问题(300分)

  • 主题发起人 deardragon_2002
  • 开始时间
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
原始需求:查询结果框中,选中某条记录后,以高亮条显示,当鼠标点击滚动条滑动或者鼠标滚轮滑动时,高亮条不跟随变动;
选中记录高亮显示 没问题,问题是,如何控制滚动条滑动时,高亮条不跟随变动(选中的记录还是原来的那条)?
 
X

xuhongxinghome

Unregistered / Unconfirmed
GUEST, unregistred user!
将DBGRID1 的 OPTIONS 属性中的 DGMULTISELECT 设为 true 试一下,是不是你要求的
效果?
 
J

jmh521

Unregistered / Unconfirmed
GUEST, unregistred user!
Z

zhuzhi129

Unregistered / Unconfirmed
GUEST, unregistred user!
你这样说别人不太清楚的,你把代码发过来,让大家看看。
 
T

thjksh

Unregistered / Unconfirmed
GUEST, unregistred user!
代码贴出来。
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
没源码,就是不知道怎么做,才在这里请教各位大哥的。
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, unregistred user!
你可以试试拦截滚动条的消息后作出处理,给你一段代码参考:
type
{$IFDEF WIN32}
WParameter = LongInt;
{$else
}
WParameter = Word;
{$ENDIF}
LParameter = LongInt;

var
OldWindowProc: Pointer;

function NewWindowProc(WindowHandle: hWnd;
TheMessage: WParameter;
ParamW: WParameter;
ParamL: LParameter): LongInt
{$IFDEF WIN32} stdcall;
{$else
};
export;
{$ENDIF}
var
TheRangeMin: integer;
TheRangeMax: integer;
TheRange: integer;
begin

if TheMessage = WM_VSCROLL then
//纵向
begin

GetScrollRange(WindowHandle, SB_HORZ, TheRangeMin, TheRangeMax);
TheRange := GetScrollPos(WindowHandle, SB_VERT);

if TheRange < TheRangeMin then
TheRange := TheRangeMin
else
if TheRange > TheRangeMax then
TheRange := TheRangeMax;

SetScrollPos(WindowHandle, SB_HORZ, TheRange, True);
end;

if TheMessage = WM_HSCROLL then
//横向
begin

GetScrollRange(WindowHandle, SB_VERT, TheRangeMin, TheRangeMax);
TheRange := GetScrollPos(WindowHandle, SB_HORZ);
if TheRange < TheRangeMin then
TheRange := TheRangeMin
else
if TheRange > TheRangeMax then
TheRange := TheRangeMax;

SetScrollPos(WindowHandle, SB_VERT, TheRange, True);
end;

NewWindowProc := CallWindowProc(OldWindowProc, WindowHandle, TheMessage, ParamW, ParamL);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

OldWindowProc := Pointer(SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(@NewWindowProc)));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

SetWindowLong(ScrollBox1.Handle, GWL_WNDPROC, LongInt(OldWindowProc));
end;
还有,可能还要处理鼠标的滚动消息。
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
楼上大哥的方法貌似没有效果,郁闷。。。
 

*呆客*

Unregistered / Unconfirmed
GUEST, unregistred user!
换个控件就可以了,用cxgrid,测试过了,不会随滚动条变动
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
大哥,你能把cxgrid 的代码发给我一份吗?我试试,谢谢。
这里最多300分,我搞定,另开帖子让你去领分。呵呵。
我邮箱 zhangqiujun2002@163.com
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, unregistred user!
呵呵,cxgrid你要自己去下载的,下载后再安装,去网上搜一下,这个控件包很有名,也很大,可能安装时也比较麻烦,你要小心,祝你好运。[:)]
 
D

delphi大男孩

Unregistered / Unconfirmed
GUEST, unregistred user!
cxgrid是个控件。装上就ok了
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
请问cxgrid能和datasource绑定吗?
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, unregistred user!
你试试高亮显示后把DBGrid的属性设为只读看看是否有效,待到需要时再改回来。
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
准备结帖了,这个需求不做了。
因为我们的grid是增量查询的,只有焦点定位到屏幕的最后一条记录,才会去取后续包
需求和这样的实现有冲突
各位高手,有什么看法?
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, unregistred user!
我觉得这种需求还是合理地,也不难实现。
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
需求是合理,不过和我们的系统框架取后续包有点冲突。
看了看,cxgrid也确实已经实现了,不过这控件移植不容易,它不是从customDBgrid继承,而是从customgrid继承而来。
 
S

szhcracker

Unregistered / Unconfirmed
GUEST, unregistred user!
还可以用TAdvStringGrid来实现,也是从customgrid继承而来的
现在用Delphi自带的DBGrid来开发的已经不多了吧?功能太简单,我现在就用TAdvStringGrid来开发,觉得很不错
 
D

deardragon_2002

Unregistered / Unconfirmed
GUEST, unregistred user!
好的,谢谢,各位,尤其是*呆客* 和 szhcracker 大哥。
 

Similar threads

D
回复
0
查看
722
DelphiTeacher的专栏
D
D
回复
0
查看
725
DelphiTeacher的专栏
D
D
回复
0
查看
685
DelphiTeacher的专栏
D
顶部