我对Pascal来说相对较新,虽然我对语言有一个公平的理解,但仍有一些东西我无法弄清楚如何实现。我遇到了这个问题,在我自己尝试了几个小时并在互联网上寻找类似案例之后,我还没有找到任何东西。我希望这个问题是公平的,因为老实说,我不知道如何解决这个问题。
这就是事情。
我有一个动态创建TextBoxes(本例中为TextEdits)的应用程序,并将它们添加到面板中进行显示。事实上,我需要对新创建的元素执行一些过程。我在我的应用程序中添加了一个新程序(这仅用于解释目的):
procedure Demo_Procedure(i: integer, a: String);
然后我继续在表格的“实施”部分下面“开发”我的程序。
procedure Demo_Procedure(i: integer, a: String);
begin
ShowMessage(a, ' ' ,i);
end;
现在,对于我动态创建的元素,我试图设置“OnKeyDow”事件来运行我的新程序(这是我不知道 - 如果它可以做或B-如何做到这一点)
NewlyButton.OnClick:= Demo_Procedure(5, 'Hi');
我得到不同的错误取决于我如何调用我的程序。例如:
如果我这样做:Demo_Procedures(5,'嗨'),它说:
错误:不兼容的类型:得到“无类型”的预期“对象的过程变量类型的过程(TObject,var Word,TShiftState);注册>”
现在,围绕我研究发现有些人在调用方法之前放了'@',唯一的区别是这次不是说“无类型”,而是说它有“过程变量类型对象的过程(AnsiString,LongInt),并且它与之前一样(过程(TObject,var> Word,Tshift ......等等)
任何人都可以帮助我吗?我真的很失落所以任何帮助都会非常感激。在此先感谢:)
答案 0 :(得分:3)
您的代码中存在错误:
procedure Demo_Procedure(i: integer, a: String); // Wrong
procedure Demo_Procedure(i: integer; a: String); // Right, use semicolon as parameters delimiter
ShowMessage(a, ' ' ,i); // Wrong, ShowMessage takes only one string parameter
ShowMessage(Format('%s %d', [a, i])); // Right, %s means string value and %d means decimal value, see help about Format function
事件是一个程序变量,因此它们有自己的类型。例如,OnKeyDown
事件的类型为
TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) of Object;
其中of Object
表示您的事件处理程序必须是类方法。
因此,您不能将任何过程分配给事件,而只能分配类型声明中提供参数的类方法。
以下是简单的代码:
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
e: TEdit;
begin
e := TEdit.Create(Self); // Create new TEdit control
e.Parent := Self; // Place control onto the form
e.Left := 10; // Set control coordinates
e.Top := 10;
e.OnKeyDown := @EditKeyDown; // Assign event handler
end;
procedure TForm1.EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
ShowMessage(Format('Key code is %d', [Key]));
end;
end.