最近的工程中出现个问题:
程序在运行时使用触摸屏,没有鼠标、键盘等输入设备。我就想着做个“小键盘”,在用户需要在Edit中输入数值的时候就弹出这个“小键盘”进行输入。
我的构想是:Form1中有几个Edit控件,新建立一个无边框Form2,做成小键盘样式(只有0~9,小数点,退格,负号,回车这些键),在鼠标点击Form1中的Edit控件时,Form2出现,在输入需要输入的数字时,在焦点的Edit中实时输入,点击回车后,“小键盘”Form2消失,输入完成。 现在遇到的问题是:在点击“小键盘”Form2上的按钮,输入数字的时候,应该如何将相应的数字写到Form1的焦点Edit里边去?
焦点控件我用 ActiveControl 的方式取得,但是这里没有ActiveControl.Text这个属性……
请教各位大大,该如何完成?
程序在运行时使用触摸屏,没有鼠标、键盘等输入设备。我就想着做个“小键盘”,在用户需要在Edit中输入数值的时候就弹出这个“小键盘”进行输入。
我的构想是:Form1中有几个Edit控件,新建立一个无边框Form2,做成小键盘样式(只有0~9,小数点,退格,负号,回车这些键),在鼠标点击Form1中的Edit控件时,Form2出现,在输入需要输入的数字时,在焦点的Edit中实时输入,点击回车后,“小键盘”Form2消失,输入完成。 现在遇到的问题是:在点击“小键盘”Form2上的按钮,输入数字的时候,应该如何将相应的数字写到Form1的焦点Edit里边去?
焦点控件我用 ActiveControl 的方式取得,但是这里没有ActiveControl.Text这个属性……
请教各位大大,该如何完成?
然后用timer时时获取
这样就OK了
简单的问题不要想复杂了。看得有点晕。是不是要下面的效果:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
procedure Edit1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.Edit1Click(Sender: TObject);
begin
Form2.hEdit := Edit1.Handle;
Form2.Show;
end;end.{=================================================}unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
hEdit: hWnd;
end;var
Form2: TForm2;implementation
uses Unit1;
{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
begin
Button1.Caption := '1';
end;procedure TForm2.Button1Click(Sender: TObject);
begin
SendMessage(hEdit, WM_Char, ord('1'), 0);
end;end.
解决办法不只这一种(发送消息)。
Forms,
Unit1 in 'Unit1.pas' {Form1},
Unit2 in 'Unit2.pas' {Form2};{$R *.res}begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.{**************************************************}unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure EdtClick(Sender: TObject);
end;var
Form1: TForm1;implementationuses Unit2;{$R *.dfm}procedure TForm1.EdtClick(Sender: TObject);
begin
Form2.Visible := not((Form2.Visible) and (Form2.pEdit=TEdit(Sender)));
Form2.pEdit := TEdit(Sender);
end;procedure TForm1.FormCreate(Sender: TObject);
var
I : integer;
begin
for I := Self.ComponentCount-1 downto 0 do
if Self.Components[I] is TEdit then
TEdit(Self.Components[I]).OnClick := Self.EdtClick;
end;end.{**************************************************}unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
Button11: TButton;
Button12: TButton;
Button13: TButton;
Button14: TButton;
procedure FormCreate(Sender: TObject);
procedure Button13Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure Button14Click(Sender: TObject);
procedure Button12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
pEdit: TEdit;
procedure BtnNumClick(Sender: TObject);
end;var
Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
var
I : integer;
begin
for I := 1 to 9 do begin
TButton(Self.FindComponent('Button'+InttoStr(I))).Caption := InttoStr(I);
TButton(Self.FindComponent('Button'+InttoStr(I))).OnClick := Self.BtnNumClick;
end;
Self.Button10.Caption := '0';
Button10.OnClick := Self.BtnNumClick;
Self.Button11.Caption := '.';
Button11.OnClick := Self.BtnNumClick;
Self.Button12.Caption := '-';
Self.Button12.OnClick := Self.Button12Click;
Self.Button13.Caption := '退格';
Self.Button13.OnClick := Self.Button13Click;
Self.Button14.Caption := '回车';
Self.Button14.OnClick := Self.Button14Click;
end;procedure TForm2.BtnNumClick(Sender: TObject);
begin
pEdit.Text := pEdit.Text + TButton(Sender).Caption;
Self.Button14.SetFocus;
end;procedure TForm2.Button13Click(Sender: TObject);
begin
pEdit.Text := Copy(pEdit.Text, 1, Length(pEdit.Text)-1);
Self.Button14.SetFocus;
end;procedure TForm2.FormShow(Sender: TObject);
begin
Self.Button14.SetFocus;
end;procedure TForm2.Button14Click(Sender: TObject);
begin
Self.Hide;
end;procedure TForm2.Button12Click(Sender: TObject);
begin
pEdit.Text := '-';
end;end.
^_^
{加个强制转换就有text属性了}
if Form1.ActiveControl is TEdit then
TEdit(Form1.ActiveControl).Text := 'a';
{(Form1.ActiveControl as TEdit).Text := 'b'; // 两种方式都可以}
我用另外的方法,用keybd_event,很多游戏修改器的按键精灵就用它,这是一个测试,LS可参考:procedure TForm1.Button1Click(Sender: TObject);
var
h:thandle;
begin
h:=FindWindow(0,'TESTF'); //目标form的Caption
if(h=0) then
begin
ShowMessage('TESTF not find!');
exit;
end;
SetForegroundWindow(h); //激活目标窗口
keybd_event(VkKeyScan('1'),1,1,0); //按下1键
keybd_event(VkKeyScan('1'),1,KEYEVENTF_KEYUP,0); //松开1键
end;
尤其要感谢 lihuasof, keiy, JeffChung几位。感谢 lihuasof ,按照你的办法,顺利解决主要问题,剩下的小功能已经补充完毕;JeffChung提供的方法是我刚开始自己想要的方式,谢谢,又学到一个方法。以前在学C的时候有类型强制转换,在这里给忘了,呵呵Keiy的办法也可行,但是存在一个问题:点了这个按钮之后,这个窗口就不见了……