我制作一个添加记录的模块
该窗体上动态创建了label和maskedit控件
为了使用户使用时方便些,需要使用setfocus属性
例如:有两个动态创建的文本输入控件aa1,aa2
用户在aa1内添入文本后按下回车光标自动定位到aa2上。
如果窗体上本身就有的控件可以在该控件的keydown事件里定义setfocus
但是由于控件是动态建立的,也就是窗体显示的时候这些控件才生成,那要实现上面的功能,该怎么办呢?
该窗体上动态创建了label和maskedit控件
为了使用户使用时方便些,需要使用setfocus属性
例如:有两个动态创建的文本输入控件aa1,aa2
用户在aa1内添入文本后按下回车光标自动定位到aa2上。
如果窗体上本身就有的控件可以在该控件的keydown事件里定义setfocus
但是由于控件是动态建立的,也就是窗体显示的时候这些控件才生成,那要实现上面的功能,该怎么办呢?
解决方案 »
- connection to sys should be as sysdba or sysoper 咋办?
- 高手请进:(附源码),256色旋转算法速度问题:角度越大,速度越慢.(原因是内存颠簸造成,)
- 如何才能提高级别散分呀我的分数太多了
- 用过Microsoft Help Workshop制作帮助文件的朋友进来帮帮忙!
- 我要写一个程序在前台不需要运行后台运行可以:就像平时邮件服务品一样在前台不需要运行,而后台是提供服务的,要怎样来实现
- 以后会很少来了,真的要远离delphi了,以后估计很少用它了,工作需要,没办法。
- 求救!请问如何把".jpg"文件加到数据表的字段里去?
- 大家有没有用过DBExpress 组件来做多层,请介绍一下经验.
- 程序出错
- dxdbgrid如何实现动态添加行
- !关机系统!
- 如何监控一个目录,
Shift: TShiftState);
begin
if key=13 then
SelectNext(ActiveControl,True,True);
end;var edit:TEdit;
edit:=TEdit.Create(self);
edit.Parent:=self;
edit.OnKeyDown:=Edit1KeyDown;
不过,还有一种方法
即全局EnterToTab
不过这个,要设置控件的Tab是按顺序来的1
定义自己的keydown事件
procedure MyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
keydown事件的实现
procedure TForm1.MyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = VK_RETURN then
SelectNext(self, true, true);//
end;var
aa, bb: TEdit;
begin
aa := TEdit.Create(self);
aa.Top := 200;
aa.Left := 30;
aa.Parent := self;
aa.TabOrder := 0;
aa.Text := '0';
aa.OnKeyDown := MyKeyDown;//动态赋值keydown事件
Shift + Tabperform(WM_NEXTDLGCTL,0,0);这是向下移动,请问如何向上移动??????perform(WM_NEXTDLGCTL,1,0);即可向上移动为什么不看MSDN,不看HELP你当然不知道了。perform(WM_NEXTDLGCTL,0,1)控制焦点移动,还可以利用TWinControl.SelectNext()方法来做!*********************Form.KeyPreview := true; 在Form的KeyDown中if Key = VK_RETURN thenbeginif ActiveControl is TDBGrid or ... thenPostMessage(ActiveControl.Handle, WM_KEYDOWN, VK_TAB, 0);elsePostMessage(Handle, WM_KEYDOWN, VK_TAB, 0);Key := 0;end---------------procedure EnterToTab(aForm: TForm; var Key: Char);beginif Key = #13 thenbeginkey := #0;aForm.Perform(CM_DialogKey, VK_TAB, 0);end;end;***************或者拦截Application.OnMessage即可,添加代码:if Msg.Message = WM_KEYDOWN thenbeginif Msg.wParam = VK_RETURN thenKeybd_event(VK_TAB, 0, 0, 0);end; //if
这句提示undeclared identifier 'selectnext'
这句提示undeclared identifier 'selectnext'--use Controls;
要怎么写呢?
要怎么写呢?
--
aa.OnKeyDown := MyKeyDown;//动态赋值keydown事件,这其实就是函数指针,
这样赋之后当出发aa的onKeyDown事件时就会自动运行aa.mykeydown
这样赋之后当出发aa的onKeyDown事件时就会自动运行aa.mykeydown//可是我创建的是好多好多控件,不是一个呀
控件为数组型,控件名为ss[1],ss[2].......那aa.ondeydown要怎么写呢?
在引用窗体名时,例如:aa.showmodal
messagebox(sccxct.Handle,'该操作将删除所有条件,您真的要删除吗?','提示',mb_yesno)
都会发生错误,提示内存读写错误请问高手为什么呢?
控件为数组型,控件名为ss[1],ss[2].......
--一样赋值
你在创建ss[1],ss[2].......时,
把ss[1],ss[2].......的onKeyDown := MyKeyDown;就可以了
begin
if xgct_lab1.Caption='修改记录' then f1:=dm.Query1.Fields[i].AsString ;
zdz1[i]:=Tmaskedit.Create(self);
zdz1[i].Parent:=self;
zdz1[i].Text :=f1 ;
zdz1[i].Left :=ll; //ll,tt为控制控件位置的变量
zdz1[i].Top:=tt;
if (dm.Query1.Fields[i].DataType=ftdatetime) and (f1='') then
begin
zdz1[i].EditMask:='9999/99/00 90:00:00;1;_' ;
end;
tt:=tt+40;
if ((i+1) mod hang*lie )=0 then
begin
if (yu>0) and (yu<=2) then//控件生成时为二列或三列,yu 是字段个数除二或除三的余数。
begin
if xgct_lab1.Caption='修改记录' then f1:=dm.Query1.Fields[hang*lie].AsString ;
if (yu=1) and (f=true) then
begin
//f1:=dm.Query1.Fields[hang*lie].AsString ;
zdz1[hang*lie]:=Tmaskedit.Create(self);
zdz1[hang*lie].Parent:=self;
zdz1[hang*lie].Text:=f1;
zdz1[hang*lie].Left :=ll;
zdz1[hang*lie].Top :=tt;
f:=false;
end;
if (yu=2) and (f=true) then
begin
for j:=1 downto 0 do
begin
zdz1[hang*lie+j]:=Tmaskedit.Create(self);
zdz1[hang*lie+j].Parent:=self;
zdz1[hang*lie+j].Text :=f1;
zdz1[hang*lie+j].Left :=ll;
zdz1[hang*lie+j].Top :=tt;
ll:=ll+64+200;
end;
f:=false;
ll:=ll-528;
end;
end;
ll:=ll+64+200;
btt:=tt;
tt:=60;
end;
end;
zdz1[i]:=Tmaskedit.Create(self);
zdz1[i].Parent:=self;
zdz1[i].onKeyDown := MyKeyDown; //添加onKeyDown 事件-------------------------
zdz1[i].Text :=f1 ;
zdz1[i].Left :=ll; //ll,tt为控制控件位置的变量
zdz1[i].Top:=tt;