关于Free Pascal的程序

时间:2014-09-03 21:11:41

标签: pascal lazarus freepascal

我对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 ......等等)

任何人都可以帮助我吗?我真的很失落所以任何帮助都会非常感激。在此先感谢:)

1 个答案:

答案 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.