我正在开发具有输入字段的应用程序,每当用户进入控件时,都会使用按钮生成额外的面板。
按钮的标题代表特殊符号,如度数,希腊符号。
按下该按钮时,应在输入字段 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 使用。
谢谢
答案 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;
干杯, 贝