关于自由Pascal的程序

关于自由Pascal的程序,pascal,lazarus,freepascal,Pascal,Lazarus,Freepascal,我对Pascal比较陌生,虽然我对该语言有相当的了解,但仍有一些东西我不知道如何实现。我遇到了这个问题,在我自己尝试了几个小时并在互联网上寻找类似的案例后,我没有发现任何东西。我希望这个问题是公平的,因为,老实说,我不知道如何解决这个问题 事情是这样的 我有一个应用程序,它可以动态创建文本框(本例中为文本编辑),并将它们添加到面板中进行显示。问题是,我需要对新创建的元素执行一些过程。我在我的应用程序中添加了一个新过程(仅用于解释): 然后,我继续在表单的“实现”部分下面“开发”我的程序 proc

我对Pascal比较陌生,虽然我对该语言有相当的了解,但仍有一些东西我不知道如何实现。我遇到了这个问题,在我自己尝试了几个小时并在互联网上寻找类似的案例后,我没有发现任何东西。我希望这个问题是公平的,因为,老实说,我不知道如何解决这个问题

事情是这样的

我有一个应用程序,它可以动态创建文本框(本例中为文本编辑),并将它们添加到面板中进行显示。问题是,我需要对新创建的元素执行一些过程。我在我的应用程序中添加了一个新过程(仅用于解释):

然后,我继续在表单的“实现”部分下面“开发”我的程序

procedure Demo_Procedure(i: integer, a: String);
begin
      ShowMessage(a, '  ' ,i);
end;
现在,对于我动态创建的元素,我正在尝试设置“OnKeyDow”事件来运行我的新过程(这是我不知道是否可以做的事情,或者如何做的事情)

我得到不同的错误取决于我如何调用我的过程。例如:

如果我这样做:演示程序(5,“Hi”),它会说:

错误:不兼容的类型:获取了对象的过程变量类型(TObject、var Word、TShiftState);寄存器>“

现在,我四处研究发现,有些人在调用方法之前加了一个“@”,唯一的区别是这次没有说“非类型化”,而是说它得到了“过程变量类型的过程(AnsiString,LONGENT)的对象”,并且它期望与以前一样(过程(TObject,var>Word,Tshift…等等)


有人能帮我吗?我真的迷路了,所以非常感谢您的帮助。提前谢谢:)

您的代码中有错误:

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;
其中,对象的
表示事件处理程序必须是类方法。
因此,不能将任何过程分配给事件,只能将具有类型声明中提供的参数的类方法分配给事件

下面是简单的代码:

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.

您只能指定“方法”,即“对象”的过程。请参阅。在Object Pascal中,没有内置的语言结构可用于简单创建
lambda
函数,而这些函数又可能与其他
一起用作一级公民。。。对象的类型
函数。你想要抓住的可能是感谢你的帮助!所以,没有办法对控件的事件(如OnKeyDown或OnClick)使用我自己的参数执行过程?抱歉,如果我听起来很笨,这是Pascal的新手:/@OscarValdezEsquea刚刚替换
ShowMessage(格式('键代码为%d',[Key])通过您的过程调用<代码>演示程序(5,“Hi”)在您的示例中
TKeyEvent = procedure(Sender: TObject; var Key: Word; Shift: TShiftState) 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.