procedure TForm1.Button1Click(Sender: TObject); var I: Integer; begin SendMessage(DBGrid1.Handle, WM_LBUTTONDOWN, 0, $00200020); SendMessage(DBGrid1.Handle, WM_LBUTTONUP, 0, $00200020); DBGrid1.EditorMode := True; for I := 0 to DBGrid1.ComponentCount - 1 do if DBGrid1.Components[I] is TCustomEdit then begin TEdit(DBGrid1.Components[I]).SelStart := 0; Break; end; end;
把主要的代码贴出来吧主窗体中调用子窗体并显示的代码。 procedure TfrmMain.Action13Execute(Sender: TObject); begin if not assigned(frmbase) then begin frmBase := TfrmBase.create(application,(sender as TAction).groupindex); frmBase.Caption := '基础档案——' + (Sender as TAction).Caption; end; end; 子窗体中部分变量和函数声明如下 private fbaseindex : integer; { Private declarations } public constructor Create(Aowner : TComponent;bindex : integer);overload; published property Baseindex : integer read fBaseindex write fBaseindex; end; 底下是代码: constructor Tfrmbase.Create(Aowner : TComponent;bindex : integer); begin inherited create(AOwner); fBaseindex := bindex; end; procedure TfrmBase.FormShow(Sender: TObject); begin tabBase.TabIndex := fBaseindex; tabBase.OnChange(tabBase); end;procedure TfrmBase.tabBaseChange(Sender: TObject); var i : integer; begin dm.tbbase.active := false; case tabBase.TabIndex of 0: dm.tbBase.TableName := 'tb_anyou'; 1: dm.tbBase.TableName := 'tb_cbbm'; 2: dm.tbBase.TableName := 'tb_cbr'; 3: dm.tbBase.TableName := 'tb_wzzj'; 4: dm.tbBase.TableName := 'tb_pztj'; 5: dm.tbBase.TableName := 'tb_zwmc'; 6: dm.tbBase.TableName := 'tb_tzsl'; 7: dm.tbBase.TableName := 'tb_dcxwdd'; 8: dm.tbBase.TableName := 'tb_clyj'; end; try dm.tbbase.active := true; for i := 0 to grd.Columns.Count -1 do grd.Columns[i].Title.alignment := taCenter; SendMessage(grd.Handle, WM_LBUTTONDOWN,0,0); SendMessage(grd.Handle, WM_LBUTTONUP,0,0); grd.EditorMode := true; for i:=0 to grd.ComponentCount-1 do if grd.Components[i] is TInplaceEdit then begin TInplaceEdit(grd.Components[i]).SelStart := 0 ; TInplaceEdit(grd.Components[i]).Brush.Color := clinfobk; break; end; except application.MessageBox('数据表打开失败!','提示',mb_ok + mb_iconInformation); end; end;
1、参考帮助 WM_LBUTTONDOWN fwKeys = wParam; // key flags xPos = LOWORD(lParam); // horizontal position of cursor yPos = HIWORD(lParam); // vertical position of cursor lParam为表示坐标,前两个字节表示X,后两个字节表示Y $0000 0000 如果你是每次都重新打开,那么就不需要定位了,默认就是在首行首列~~2、SetFocus之前最好做CanFocus的判断 这类问题不要问,你自己测试一下不就知道了,何必费口舌~~3、同上 //参考代码~~ procedure TForm1.TabControl1Change(Sender: TObject); var I: Integer; begin Table1.Close; case TTabControl(Sender).TabIndex of 0: Table1.TableName := 'biolife.db'; 1: Table1.TableName := 'animals.dbf'; end; Table1.Open; if DBGrid1.CanFocus then DBGrid1.SetFocus; DBGrid1.EditorMode := True; for I := 0 to DBGrid1.ComponentCount - 1 do if DBGrid1.Components[I] is TCustomEdit then begin TEdit(DBGrid1.Components[I]).SelStart := 0; Break; end; end;procedure TForm1.FormShow(Sender: TObject); begin TabControl1Change(TabControl1); end;
var
I: Integer;
begin
SendMessage(DBGrid1.Handle, WM_LBUTTONDOWN, 0, $00200020);
SendMessage(DBGrid1.Handle, WM_LBUTTONUP, 0, $00200020);
DBGrid1.EditorMode := True;
for I := 0 to DBGrid1.ComponentCount - 1 do
if DBGrid1.Components[I] is TCustomEdit then
begin
TEdit(DBGrid1.Components[I]).SelStart := 0;
Break;
end;
end;
以后我天天上CSDN来。
1。SendMessage(DBGrid1.Handle, WM_LBUTTONDOWN, 0, $00200020);
$00200020是什么意思?如果是$00200020,则运行效果是光标停到第二列。
如果改成0,则实现效果。
2。 for I := 0 to DBGrid1.ComponentCount - 1 do
if DBGrid1.Components[I] is TCustomEdit then
begin
TEdit(DBGrid1.Components[I]).SelStart := 0;
TEdit(DBGrid1.Components[I]).Setfocus;//这样写为什么不行?
Break;
end;
3。如果这段代码放在form.onshow事件中,执行是有效果的,但是我由于实际需要,把这段代码放在了TTabcontrol的onchange事件中,而在窗体show的时候让TTabcontrol触发onchange事件,结果就看不到效果。真的是很奇怪。代码如下。
procedure TfrmBase.FormShow(Sender: TObject);
begin
tabBase.TabIndex := fBaseindex; //fBaseindex是别的窗体传进的参数。
tabBase.OnChange(tabBase);
grd.DefaultDrawing := false;
grd.Options := [dgediting,dgTitles,dgColumnResize,dgColLines,
dgRowLines,dgTabs,dgConfirmDelete,dgCancelOnExit];
end;procedure TfrmBase.tabBaseChange(Sender: TObject);
var i : integer;
begin
dm.tbbase.active := false;
case tabBase.TabIndex of
0:
dm.tbBase.TableName := 'tb_anyou';
1:
dm.tbBase.TableName := 'tb_cbbm';
2:
dm.tbBase.TableName := 'tb_cbr';
3:
dm.tbBase.TableName := 'tb_wzzj';
4:
dm.tbBase.TableName := 'tb_pztj';
5:
dm.tbBase.TableName := 'tb_zwmc';
6:
dm.tbBase.TableName := 'tb_tzsl';
7:
dm.tbBase.TableName := 'tb_dcxwdd';
8:
dm.tbBase.TableName := 'tb_clyj';
end;
try
dm.tbbase.active := true;
for i := 0 to grd.Columns.Count -1 do
grd.Columns[i].Title.alignment := taCenter;
SendMessage(grd.Handle, WM_LBUTTONDOWN,0,0);
SendMessage(grd.Handle, WM_LBUTTONUP,0,0);
grd.EditorMode := true;
for i:=0 to grd.ComponentCount-1 do
if grd.Components[i] is TInplaceEdit then
begin
TInplaceEdit(grd.Components[i]).SelStart := 0 ;
TInplaceEdit(grd.Components[i]).Brush.Color := clinfobk;
break;
end;
self.caption := '基础档案——' + tabBase.Tabs[tabBase.tabindex];
except
application.MessageBox('数据表打开失败!','提示',mb_ok + mb_iconInformation);
end;
end;
tabBase.TabIndex := fBaseindex;
tabBase.OnChange(tabBase);
如果这段代码放在主窗口的Onshow中,一切OK,一点问题都没有。如果DBGrid在子窗口上, 要实现光标停留在第一行第一列的第一个字符的位置,这段代码放在Onshow中是没效果的,可以看到第一行第一列背景变成黄色,但是得不到焦点。这里面肯定有猫腻,谁又能来给我开开窍呢?
procedure TfrmMain.Action13Execute(Sender: TObject);
begin
if not assigned(frmbase) then
begin
frmBase := TfrmBase.create(application,(sender as TAction).groupindex);
frmBase.Caption := '基础档案——' + (Sender as TAction).Caption;
end;
end;
子窗体中部分变量和函数声明如下
private
fbaseindex : integer;
{ Private declarations }
public
constructor Create(Aowner : TComponent;bindex : integer);overload;
published
property Baseindex : integer read fBaseindex write fBaseindex;
end;
底下是代码:
constructor Tfrmbase.Create(Aowner : TComponent;bindex : integer);
begin
inherited create(AOwner);
fBaseindex := bindex;
end;
procedure TfrmBase.FormShow(Sender: TObject);
begin
tabBase.TabIndex := fBaseindex;
tabBase.OnChange(tabBase);
end;procedure TfrmBase.tabBaseChange(Sender: TObject);
var i : integer;
begin
dm.tbbase.active := false;
case tabBase.TabIndex of
0:
dm.tbBase.TableName := 'tb_anyou';
1:
dm.tbBase.TableName := 'tb_cbbm';
2:
dm.tbBase.TableName := 'tb_cbr';
3:
dm.tbBase.TableName := 'tb_wzzj';
4:
dm.tbBase.TableName := 'tb_pztj';
5:
dm.tbBase.TableName := 'tb_zwmc';
6:
dm.tbBase.TableName := 'tb_tzsl';
7:
dm.tbBase.TableName := 'tb_dcxwdd';
8:
dm.tbBase.TableName := 'tb_clyj';
end;
try
dm.tbbase.active := true;
for i := 0 to grd.Columns.Count -1 do
grd.Columns[i].Title.alignment := taCenter;
SendMessage(grd.Handle, WM_LBUTTONDOWN,0,0);
SendMessage(grd.Handle, WM_LBUTTONUP,0,0);
grd.EditorMode := true;
for i:=0 to grd.ComponentCount-1 do
if grd.Components[i] is TInplaceEdit then
begin
TInplaceEdit(grd.Components[i]).SelStart := 0 ;
TInplaceEdit(grd.Components[i]).Brush.Color := clinfobk;
break;
end;
except
application.MessageBox('数据表打开失败!','提示',mb_ok + mb_iconInformation);
end;
end;
WM_LBUTTONDOWN
fwKeys = wParam; // key flags
xPos = LOWORD(lParam); // horizontal position of cursor
yPos = HIWORD(lParam); // vertical position of cursor
lParam为表示坐标,前两个字节表示X,后两个字节表示Y $0000 0000
如果你是每次都重新打开,那么就不需要定位了,默认就是在首行首列~~2、SetFocus之前最好做CanFocus的判断
这类问题不要问,你自己测试一下不就知道了,何必费口舌~~3、同上
//参考代码~~
procedure TForm1.TabControl1Change(Sender: TObject);
var
I: Integer;
begin
Table1.Close;
case TTabControl(Sender).TabIndex of
0: Table1.TableName := 'biolife.db';
1: Table1.TableName := 'animals.dbf';
end;
Table1.Open; if DBGrid1.CanFocus then DBGrid1.SetFocus;
DBGrid1.EditorMode := True;
for I := 0 to DBGrid1.ComponentCount - 1 do
if DBGrid1.Components[I] is TCustomEdit then
begin
TEdit(DBGrid1.Components[I]).SelStart := 0;
Break;
end;
end;procedure TForm1.FormShow(Sender: TObject);
begin
TabControl1Change(TabControl1);
end;
你的代码放在主窗体中执行是没问题的。
但是我的程序是MDI,这段代码是放在子窗体中运行的。子窗体中是看不到效果的,可以看到第一行第一列背景变成黄色,但是得不到焦点。我现在就是搞不明白为什么会这样,也许效果的实现并不是目的,搞清原理才是最主要的。
//人设计出来的东西没这样多原理可讲~~procedure TForm2.FormShow(Sender: TObject);
begin
if CanFocus then SetFocus;
TabControl1Change(TabControl1);
end;