自定义小键盘并将特定号码发送到活动文本框

时间:2011-01-27 13:34:31

标签: delphi user-interface custom-controls

我制作了一个带有数字的自定义小键盘。它是一个框架和按钮。我把这个组件放在表单上。现在我不知道如何捕获表单上的活动控件,然后将特定于该按钮的数字发送到该控件。

有人能帮助我吗?

3 个答案:

答案 0 :(得分:2)

IMO最简单的方法是在按钮的Tag属性中存储按钮标题的数字。然后,您可以对所有按钮使用相同的事件处理程序:

procedure TForm1.NumButtonClick(Sender: TObject);
var
  NumTyped: Integer;
begin
  NumTyped := TButton(Sender).Tag;
end;

另一个选择是在事件中读取标题,但是你必须从字符串转换为Integer,如果你不小心将没有数字标题的按钮分配给事件处理程序,它将会中断:

procedure TForm1.NumButtonClick(Sender: TObject);
var
  NumTyped: Integer;
begin
  NumTyped := StrToInt(TButton(Sender).Caption);
end;

请注意,这样您就不必关心您的组件是否是ActiveControl;您只需将事件处理程序分配给组件的每个按钮而不是其他任何内容,然后如果事件被触发,您就会知道活动控件是您的组件以及单击了哪个按钮。

编辑:根据下面的评论,问题还有一些问题,而不是它出现的问题。

如果您尝试将号码发送到TEdit(您的“文本框”),则必须执行其他一些操作。首先,不要使用TButtons或TBitBtns,因为它们会获得焦点并将焦点从编辑控件上移开。请改用TSpeedButton。将每个所需的标题设置为您希望将其放入TEdit中的数字。

其次,由于您希望将内容放在TEdit中,因此您无需为标记烦恼。将所有TSpeedButtons的事件处理程序设置为此(假设您的TEdit为Edit1):

procedure TForm1.NumButtonClick(Sender: TObject);
begin
  Edit1.SelText := TSpeedButton(Sender).Caption;
end;

这将TEdit Edit1中的任何选定文本替换为SpeedButton的标题,或将其添加到TEdit中当前的插入符号(编辑光标)位置。

如果你想把它放在许多TEdits中的任何一个中,那么稍微改变也会处理它:

procedure TForm1.NumButtonClick(Sender: TObject);
begin
  if ActiveControl is TEdit then
    TEdit(ActiveControl).SelText := TSpeedButton(Sender).Caption;
end;

如果这仍然不是您想要完成的,请编辑原始问题并添加更多信息,以便我们有机会帮助您获得答案。

答案 1 :(得分:1)

您没有提到您正在使用的Delphi版本,但如果它是Delphi 2010或更高版本,您可能需要使用调色板上提供的TTouchKeyboard组件并设置布局 NumPad的财产。

非常方便,因为它可以为您处理所有细节。

NumPad

答案 2 :(得分:0)

尝试使用表单的 ActiveControl TScreen 类的 ActiveControl 属性和 OnActiveControlChange 事件。