如何得到当前获得焦点的表、字段名称? ( 积分: 200 )

  • 主题发起人 主题发起人 zhouyujie238
  • 开始时间 开始时间
Z

zhouyujie238

Unregistered / Unconfirmed
GUEST, unregistred user!
窗体里面有些ADOQuery,DataSource,标准数据显示控件,cxDB系列控件。
窗体下方放一个statusbar,我想在这个statusbar上适时显示当前获得焦点的ADOQuery名称与字段名。
 
没时间,给你个思路
procedure TForm1.Timer1Timer(Sender: TObject);
var
p: tpoint;
h: thandle;
pname: pchar;
begin
GetCursorPos(p);
h:= WindowFromPoint(p);
if h>0 then
begin
new(pname);
try
GetClassName(h,pname,20);
if (pname = 'TDBGrid')and(ActiveControl is TDBGrid) then
begin
Edit1.Text:= TDBGrid(ActiveControl).DataSource.DataSet.Name;
exit;
end
else
begin
Edit1.Text:= 'nothing';
end;
finally
dispose(pname);
end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:= true;
end;
 
要是能抓到所以的TField的setfucus()事件就好了
用Timer感觉会比较消耗资源,可以凑合着实现需求了,谢谢啦。有没有那位还有更好的方法?谢谢啦
 
procedure TForm1.DBGrid1Enter(Sender: TObject);
begin
StatusBar1.Panels[0].Text := 'adoquery名:'+DBGrid1.DataSource.DataSet.Name ;
StatusBar1.Panels[1].Text := '字段名:'+DBGrid1.SelectedField.Name;
end;

在每一个dbgrid的焦点进入事件中
 
谢谢楼上的,Grid的Enter事件不好使的,Grid只有一个,但是一个Grid有那么多字段,字段之间切换时并不会触发这个事件。。。。
一个窗体上的数据控件,除了Grid之外,还会有tree,DbText等等。。。

继续等待
 
沙发的我已经给了你思路了,具体实现,嘿嘿....
你也太....了
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
showmessage(Column.FieldName+';'+Column.Field.DataSet.Name);
end;
 
这个好象没那么难吧,ONCHANGE可以解决
 
是指datasource里面的ONCHANGE事件吗?他只有在修改的时候才触发,不是在字段获得焦点的时候触发。
 
...
...
...

procedure DBGrid1CellClick(Column: TColumn);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
procedure ActiveControlChanged(Sender: TObject);
procedure ShowStatus(DataSource: TObject; Field: string);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses
TypInfo;

{$R *.dfm}

procedure TForm1.ActiveControlChanged(Sender: TObject);
var
Obj: TObject;
Field: string;
begin
Obj := nil;
Field := '';
if Screen.ActiveControl <> nil then
begin
if GetPropInfo(Screen.ActiveControl, 'DataSource', [tkClass]) <> nil then
Obj := GetObjectProp(Screen.ActiveControl, 'DataSource', TDataSource);
if GetPropInfo(Screen.ActiveControl, 'DataField', [tkString, tkLString]) <> nil then
Field := GetStrProp(Screen.ActiveControl, 'DataField');
end;
ShowStatus(Obj, Field);
end;

procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
ShowStatus(Column.Grid.DataSource, Column.FieldName);
end;

procedure TForm1.ShowStatus(DataSource: TObject; Field: string);
begin
if (DataSource is TDataSource) and
(TDataSource(DataSource).DataSet is TADOQuery) then
StatusBar1.Panels[0].Text := '当前Query:' + TDataSource(DataSource).DataSet.Name
else
StatusBar1.Panels[0].Text := '';
if Field <> '' then
StatusBar1.Panels[1].Text := '当前字段:' + Field
else
StatusBar1.Panels[1].Text := '';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Screen.OnActiveControlChange := ActiveControlChanged;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Screen.OnActiveControlChange := nil;
end;

...
...
...
TDBGrid就用OnCellClick事件,其它标准数据感知控件就用Screen.OnActiveControlChange
用TApplication.OnIdle事件应该也可以
 
谢谢高手
 

Similar threads

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