一个简单的问题,如何在一个录入界面中敲回车由一个录入框到下一个录入框。(50分)

  • 主题发起人 主题发起人 xxwxd
  • 开始时间 开始时间
X

xxwxd

Unregistered / Unconfirmed
GUEST, unregistred user!
如何在我按TAB键时按我的顺序,使录入界面的各个录入框切换?
另外如何在我按回车时,使录入界面的一个录入框切换到另一个录入框?

 
第一个问题:设置录入框的TAB属性.
第二个问题:在KEYPRESS事件中写
IF KEY=#13 THEN
控件.SETFOCUS;
 
来晚了,同意楼上
 
key=#13会引起系统发出默认声音,应加一句key:=#0,然后在控件.setfocus;
 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_return then
edit2.SetFocus;
end;
 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=vk_return then
key:=vk_TAB;
end;
 
procedure SetFocusToNext(Form: TObject; Key: Word);
begin
with Form as TForm do
case Key of
VK_Return://响应回车键。
begin
if not (ActiveControl is TDBGrid) and not (ActiveControl is TMemo) then
begin
PerForm(WM_NEXTDLGCTL, 0, 0);
end
else if (ActiveControl is TDBGrid) then
with TDBGrid(ActiveControl) do
if selectedIndex < (FieldCount - 1) then
selectedIndex := selectedIndex + 1
else
selectedIndex := 0;
end;
VK_ESCape://响应ESC键。
begin
if application.MessageBox('是否关闭当前窗口?', 'RelTest', MB_YesNo + MB_ICONQUESTION) = id_yes then
Close;
end;
44 {VK_Print}://响应打印键。
if application.MessageBox('打印当前窗口吗?', 'RelTest', MB_YesNo + MB_ICONQUESTION) = id_yes then
begin
Print;
end;
end;
end;

procedure TParentForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
action := cafree;
end;

procedure TParentForm.FormCreate(Sender: TObject);
begin
Scaled := true;
if (screen.width <> orignwidth) then begin//实现分辨率的自适应。
height := longint(height) * longint(screen.height) div orignheight;
width := longint(width) * longint(screen.width) div orignwidth;
scaleby(screen.width, orignwidth);
end;
end;

procedure TParentForm.FormKeyUp(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if Key = 13 then //回车实现焦点的移动。
SetFocusTonext(Sender as Tform, Key);
end;

procedure TParentForm.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if ActiveControl is TMemo then
HideCaret(ActiveControl.handle);

end;
把一个窗体作为父窗体,以后都
TMonitorW = class(TParentForm)
 
我这里加入FUNCTION,功能是面板控件焦点转移
procedure TThe_AB_NoMenuFrm2.EditKeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
var
I,cur:integer;
begin
Cur := 0 ;
IF Key=$0d Then Begin
For I := 0 to Panel3.ControlCount-1 do
IF (Panel3.Controls.Name = TControl(Sender).Name) then begin
Cur := I ;
Break ;
End ;

Cur := Cur + 1 ;

For I :=Cur to Panel3.ControlCount-1 Do
IF (Panel3.controls is TDBEdit ) then begin
TDBEdit(Panel3.Controls[Cur]).setfocus;
Break ;
end;
End;
end;
 
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key=13 then
edit2.SetFocus;
end;
 
对于第一个问题,你把各个输入框的TabOrder属性按顺序编号,这样你按Tab 键就顺着走了
 
全回答完了?
结贴!
 
只需定义一个编辑框的keypress事件,其他编辑框都调用这个事件
if key=#13 then selectNext(ActiveControl,true,true);
当然如墨剑所说,要把taborder按顺序编号,这样按enter或tab键都能顺着走。
 
有为类控件,DOSMove 功能不错,为何不用用?
很早以前我们也写过这类控件,
但写的不太好。
 
procedure Tform1.edit11KeyPress(Sender: TObject;
var Key: Char);
begin
if key=#13 then
selectnext((sender as twincontrol),true,true);
end;
 
吃了这么多了,可以买单了吧!
 
原来方法有这么多!
 
赶快结束此贴!
 
解決你的問題的最好方法:
1.在Form1中按鼠標右鍵,選擇Tab Order....再選擇你需要的順序就ok了

2. 先將Form1的KeyPreview屬性設成True
再在Form1的OnKeyPress事件中這樣寫道
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
perform(WM_NEXTDLGCTL,0,0);
end;
 
天啊,太多了,真没想到,但哪种方法是最优的呢???光在这里罗列也不是事呀!
 
我来总结一下
if key=vk_return then
edit2.SetFocus;
这种方法要在每一个edit上都写事件
不好处理
而且容易发生冲突
修改麻烦

而在些又太复杂
感觉到在这里有些大材小用
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
perform(WM_NEXTDLGCTL,0,0);
end;
这个方法当然是最简洁的了!
对你的应用来说正好合适!
当然你还可以把
perform(WM_NEXTDLGCTL,0,0);
改成
SelectNext(Self,True,True);
效果一样的!
 
后退
顶部