最近的工程中出现个问题:
  程序在运行时使用触摸屏,没有鼠标、键盘等输入设备。我就想着做个“小键盘”,在用户需要在Edit中输入数值的时候就弹出这个“小键盘”进行输入。
  我的构想是:Form1中有几个Edit控件,新建立一个无边框Form2,做成小键盘样式(只有0~9,小数点,退格,负号,回车这些键),在鼠标点击Form1中的Edit控件时,Form2出现,在输入需要输入的数字时,在焦点的Edit中实时输入,点击回车后,“小键盘”Form2消失,输入完成。  现在遇到的问题是:在点击“小键盘”Form2上的按钮,输入数字的时候,应该如何将相应的数字写到Form1的焦点Edit里边去?
  
  焦点控件我用 ActiveControl 的方式取得,但是这里没有ActiveControl.Text这个属性……
  
  请教各位大大,该如何完成?

解决方案 »

  1.   

    设置一个全局的变量
    然后用timer时时获取
    这样就OK了
      

  2.   


    简单的问题不要想复杂了。看得有点晕。是不是要下面的效果: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.
    解决办法不只这一种(发送消息)。
      

  3.   

    说一下上面代码的思路:单击Form1.Edit时,Form2.Show,同时传递Form1.Edit的句柄到Form2,这样,点击Form2.Button时,就发送消息到这个句柄窗口完成输入字符。其实,也可以Form2.Show时传递Form1.Edit的指针到Form2,然后通过下面的语句实现传递“按键”:  TEdit(P).Text := TEdit(P).Text + '字符';
      

  4.   

    {闲来无事,给楼主写了完整实现(除无边框未设置,其他基本按楼主要求实现),其他功能你要自己加了}{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;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.
    ^_^
      

  5.   


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

  6.   

    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;
      

  7.   

    感谢楼上所有大大帮助,
    尤其要感谢 lihuasof, keiy, JeffChung几位。感谢 lihuasof ,按照你的办法,顺利解决主要问题,剩下的小功能已经补充完毕;JeffChung提供的方法是我刚开始自己想要的方式,谢谢,又学到一个方法。以前在学C的时候有类型强制转换,在这里给忘了,呵呵Keiy的办法也可行,但是存在一个问题:点了这个按钮之后,这个窗口就不见了……