如何扩展方法的参数列表(即OnClick)并使用它?

时间:2010-02-11 09:14:26

标签: delphi events delphi-2009

我正在开发具有输入字段的应用程序,每当用户进入控件时,都会使用按钮生成额外的面板。

按钮的标题代表特殊符号,如度数,希腊符号。

按下该按钮时,应在输入字段 TEdit 现有文本中添加相应的特殊字符。

表单上有许多输入字段。因此,在 TEdit 的每个 OnEnter 事件中,它会生成特殊符号选择面板,并且 OnExit 事件将释放面板。

我想以某种方式告诉按钮 TEdit 他应该在按下时添加符号。

procedure TForm1.SpecSimboliai(Parent: TWinControl; Edit: TEdit);
var
    pSpec: TPanel;
    oClose: TPanelEx;
    sTekstas: TLabel;
    oButton: TPanelEx;
begin
    pSpec := TPanel.Create(Self);
    pSpec.Parent := Parent;
    pSpec.Align := alBottom;
    pSpec.Height := 38;
    pSpec.Name := 'spec';
    pSpec.Caption := '';
    pSpec.ParentBackground := false;

    sTekstas := TLabel.Create(Self);
    sTekstas.Parent := pSpec;
    sTekstas.Left := 10;
    sTekstas.Top := 12;
    sTekstas.Caption := 'Specialūs simboliai:';

    oClose := TPanelEx.Create(Self);
    oClose.Parent := pSpec;
    ...
    oClose.Top := 2;
    oClose.Anchors := [akTop,akRight];
    oClose.OnClick := UzdarytiSpec;

    oButton := TPanelEx.Create(Self);
    oButton.Parent := pSpec;
    oButton.Width := 14;
    oButton.Height := 14;
    oButton.CenterText := true;
    oButton.Caption := #$00B0;
    oButton.OnClick := AddSpecSymbol;

    ... //several other buttons
end;

此过程在TEdit.OnEnter事件上运行,该事件看起来像

..InputEnter(Sender: TObject);
begin
    SpecSimboliai(TEdit(Sender).Parent,TEdit(Sender));
end;

因此,在上面的代码中创建了面板,标签,关闭按钮和度数标志按钮。

我想将编辑参数传递给按钮,以便他知道他正在使用哪种控件,但是,我不知道如何执行此操作,因为oButton.OnClick事件只是预期一个参数,即Sender: TObject

我想要的是我想要的东西:

oButton.OnClick := AddSpecSymbol(Edit);

所以听起来像:oButton.OnClick(Sender: TObject)AddSpecSymbol(Sender: TObject; Edit: TEdit)具有相同的参数发件人,它们在事件发生时使用,但参数编辑是额外的一个已经手工分配并且应该由 AddSpecSymbol 使用。

好吧,我希望我写的所有内容都可以理解,如果不是,请告诉我,我会尝试编辑。

谢谢

3 个答案:

答案 0 :(得分:4)

您可以在表单中引入一个指定当前TEdit的字段。进入字段时将其设置为TEdit(发件人),并在离开字段时将其设置为nil。然后,OnClick事件可以使用此字段访问正确的TEdit。

答案 1 :(得分:4)

一种可能的,但“混乱”的方法是使用Tag属性来保存按钮对象强制转换为Integer

oButton := TPanelEx.Create(Self);
oButton.Parent := pSpec;
oButton.Width := 14;
oButton.Height := 14;
oButton.CenterText := true;
oButton.Caption := #$00B0;
oButton.Tag := Integer(Edit);
oButton.OnClick := AddSpecSymbol;

调用AddSpecSymbol时,将Tag转换回TEdit

var
  Edit : TEdit;
begin
  Edit := TEdit((Sender as TButton).Tag);

答案 2 :(得分:1)

另一种选择是创建一个新类型TSpecialSymbolPanel = class(TCustomForm)。您可以使用按钮创建面板,并在该类型中进行OnClick处理。由于它是一种新类型,它可以有其他属性,其中一个可以是链接的TEdit。我相信这将代码移出您的主要形式将被视为适当的重构。

为此,请在项目中添加新表单。像面板一样调整大小并将所有按钮放在上面。

然后你可以添加一个私有变量:   FLinkedEdit:TEdit; 和公共财产,如:   property LinkedEdit TEdit读取FLinkedEdit写入FLinkedEdit; 在每个按钮的OnClick中执行以下操作:   FLinkedEdit.Text:= FLinkedEdit.Text +'特殊字符';

在您的主表单中,将此新单元添加到您的uses子句中。

然后添加一个私有变量:   FSpecialSymbolPanel:TSpecialSymbolPanel;

在FormCreate中初始化面板如下:

FSpecialSymbolPanel:= TSpecialSymbolPanel.Create(Self);   用FSpecialSymbolPanel做   开始     BorderIcons:= [];     BorderStyle:= bsNone;     父:= - 父组件 - ;     可见:=假;   端;

然后在编辑控件的OnEnter中,您可以执行以下操作:

使用FSpecialSymbolPanel做   开始     上:= TEdit(发件人)。顶部;     左:= TEdit(发件人).Left + TEdit(发件人).Width;     可见:=真;     LinkedEdit:= TEdit(发件人);   端

在OnExit中隐藏面板:   FSpecialSymbolPanel.Visible:= False;

干杯, 贝