急求:焦点控件问题

hongss 2008-09-11 05:09:18
最近的工程中出现个问题:
程序在运行时使用触摸屏,没有鼠标、键盘等输入设备。我就想着做个“小键盘”,在用户需要在Edit中输入数值的时候就弹出这个“小键盘”进行输入。
我的构想是:Form1中有几个Edit控件,新建立一个无边框Form2,做成小键盘样式(只有0~9,小数点,退格,负号,回车这些键),在鼠标点击Form1中的Edit控件时,Form2出现,在输入需要输入的数字时,在焦点的Edit中实时输入,点击回车后,“小键盘”Form2消失,输入完成。

现在遇到的问题是:在点击“小键盘”Form2上的按钮,输入数字的时候,应该如何将相应的数字写到Form1的焦点Edit里边去?

焦点控件我用 ActiveControl 的方式取得,但是这里没有ActiveControl.Text这个属性……

请教各位大大,该如何完成?
...全文
133 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongss 2008-09-13
  • 打赏
  • 举报
回复
感谢楼上所有大大帮助,
尤其要感谢 lihuasof, keiy, JeffChung几位。

感谢 lihuasof ,按照你的办法,顺利解决主要问题,剩下的小功能已经补充完毕;

JeffChung提供的方法是我刚开始自己想要的方式,谢谢,又学到一个方法。以前在学C的时候有类型强制转换,在这里给忘了,呵呵

Keiy的办法也可行,但是存在一个问题:点了这个按钮之后,这个窗口就不见了……
aniugee 2008-09-12
  • 打赏
  • 举报
回复
Hook也可以做到
柯本 2008-09-11
  • 打赏
  • 举报
回复
lihuasoft 真是热心啊!
我用另外的方法,用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;


JeffChung 2008-09-11
  • 打赏
  • 举报
回复

{加个强制转换就有text属性了}
if Form1.ActiveControl is TEdit then
TEdit(Form1.ActiveControl).Text := 'a';
{(Form1.ActiveControl as TEdit).Text := 'b'; // 两种方式都可以}

lihuasoft 2008-09-11
  • 打赏
  • 举报
回复


{闲来无事,给楼主写了完整实现(除无边框未设置,其他基本按楼主要求实现),其他功能你要自己加了}

{Form1、Form2全部由Application自动创建}

{Form1上放了四个Edit供测试,Form2上有你说的14个按钮}

program Project1;

uses
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;

interface

uses
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;

implementation

uses 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;

interface

uses
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.


^_^
lihuasoft 2008-09-11
  • 打赏
  • 举报
回复
说一下上面代码的思路:

单击Form1.Edit时,Form2.Show,同时传递Form1.Edit的句柄到Form2,这样,点击Form2.Button时,就发送消息到这个句柄窗口完成输入字符。

其实,也可以Form2.Show时传递Form1.Edit的指针到Form2,然后通过下面的语句实现传递“按键”:

TEdit(P).Text := TEdit(P).Text + '字符';
lihuasoft 2008-09-11
  • 打赏
  • 举报
回复

简单的问题不要想复杂了。看得有点晕。是不是要下面的效果:



unit Unit1;

interface

uses
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;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Edit1Click(Sender: TObject);
begin
Form2.hEdit := Edit1.Handle;
Form2.Show;
end;

end.

{=================================================}

unit Unit2;

interface

uses
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.


解决办法不只这一种(发送消息)。
fangsp 2008-09-11
  • 打赏
  • 举报
回复
设置一个全局的变量
然后用timer时时获取
这样就OK了

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧