2014-09-03 76 views
1

對於Pascal來說,我相對較新,雖然我對語言有一個公正的理解,但仍然有些東西我不知道如何實現。我遇到了這個問題,在我花了幾個小時在網上尋找類似的案例之後,我沒有發現任何東西。我希望這個問題是公平的,因爲,老實說,我不知道如何解決這個問題。關於免費Pascal的程序

這是事情。

我有一個應用程序動態創建文本框(在這種情況下,文本編輯),並將它們添加到面板顯示。事情是,我需要對新創建的元素執行一些程序。我添加了一個新的程序在我的應用程序(這是僅用於解釋目的):

procedure Demo_Procedure(i: integer, a: String); 

然後我繼續「開發」我的程序表中的「執行」部分下方。現在

procedure Demo_Procedure(i: integer, a: String); 
begin 
     ShowMessage(a, ' ' ,i); 
end; 

,我的動態創建的元素我嘗試設置「OnKeyDow」事件來運行我的新程序(這是什麼我不知道A-如果可以做到或B-如何做到這一點)

NewlyButton.OnClick:= Demo_Procedure(5, 'Hi'); 

我得到不同的錯誤取決於我怎樣調用我的程序。例如:

如果我不喜歡這樣寫道:Demo_Procedures(5,「你好」),它說:

Error: Incompatible types: got "untyped" expected "procedure variable type of procedure(TObject,var Word,TShiftState) of object;Register>"

現在,研究圍繞我發現一些人把一個「@」之前調用方法,唯一的區別是這次不是說「無類型」,而是說它得到了「過程變量類型的過程(AnsiString,LongInt)」對象「並且它期望與之前一樣(過程(TObject,var> Word,Tshift ...等

任何人都可以幫我在這裏?我真的很失落,所以任何幫助將不勝感激。在此先感謝:)

+2

只能分配一個「方法」中,「對象」的一個過程。見[methods](http://www.freepascal.org/docs-html/ref/refse30.html#refsu26.html)。 – 2014-09-03 21:23:13

+0

在Object Pascal中沒有可用的內置語言構造,它可以簡單地創建'lambda'函數,這些函數又可以用作第一類公民以及其他'...對象'函數。你試圖抓住的東西可能是[GoF命令模式](http://delphipterns.blog.com/2011/03/28/command/) – xmojmr 2014-09-04 04:08:29

回答

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. 
+0

感謝您的幫助!因此,沒有辦法在控件的OnKeyDown或OnClick事件上使用我自己的參數執行過程?對不起,如果我聽起來啞巴,只是新的帕斯卡爾:/ – 2014-09-04 02:41:22

+2

@OscarValdezEsquea只需用您的過程調用'ShowMessage(格式('關鍵代碼是%d',[Key]));'。 'Demo_Procedure(5,'Hi');'在你的例子中 – Abelisto 2014-09-04 05:45:27