2011-01-07 9 views
2

私はA2コンピューティングプロジェクトをDelphiでやっていて、イベントプロシージャにパラメータを追加する際に問題が発生しました。Delphiのデフォルトの "Sender:TObject"に加えて、OnClickイベントにパラメータを追加することはできますか?

私はいくつかのラベル(TLabelオブジェクト)を作成し、それらをメインフォーム "form1"の下に配列として格納しています。

これは私が現在持っているものです。

**ラベルの配列の宣言と(送信者:TObjectを)規格に対応したClickEvent手順パラメータが渡されました。

public 
    InventoryLabel : array [0..23] of TLabel; 
    procedure InventoryLabelClick(Sender: TObject); 

**これは、上で宣言したものと一致するClickEventの手順です。 (手続きの内容は非常に厄介ですが、質問に関連していると私は現在で取得するために使用していますものです。)

Procedure TForm1.InventoryLabelClick(Sender: TObject); 
begin 
if sender = InventoryLabel[0] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[0]].cardpic); 
if sender = InventoryLabel[1] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[1]].cardpic); 
if sender = InventoryLabel[2] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[2]].cardpic); 
if sender = InventoryLabel[3] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[3]].cardpic); 
if sender = InventoryLabel[4] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[4]].cardpic); 
if sender = InventoryLabel[5] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[5]].cardpic); 
if sender = InventoryLabel[6] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[6]].cardpic); 
if sender = InventoryLabel[7] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[7]].cardpic); 
if sender = InventoryLabel[8] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[8]].cardpic); 
if sender = InventoryLabel[9] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[9]].cardpic); 
if sender = InventoryLabel[10] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[10]].cardpic); 
if sender = InventoryLabel[11] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[11]].cardpic); 
if sender = InventoryLabel[12] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[12]].cardpic); 
if sender = InventoryLabel[13] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[13]].cardpic); 
if sender = InventoryLabel[14] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[14]].cardpic); 
if sender = InventoryLabel[15] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[15]].cardpic); 
if sender = InventoryLabel[16] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[16]].cardpic); 
if sender = InventoryLabel[17] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[17]].cardpic); 
if sender = InventoryLabel[18] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[18]].cardpic); 
if sender = InventoryLabel[19] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[19]].cardpic); 
if sender = InventoryLabel[20] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[20]].cardpic); 
if sender = InventoryLabel[21] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[21]].cardpic); 
if sender = InventoryLabel[22] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[22]].cardpic); 
if sender = InventoryLabel[23] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[23]].cardpic); 
end; 

**これは、ラベルを作成し、それらに彼らを与えるコードのビットであります属性。

for I := 0 to 23 do 
    begin 
    InventoryLabel[i] := TLabel.Create(nil); 
     with InventoryLabel[i] do 
     begin 
      Parent := Inventory; 
      left := 8; 
      OnClick := InventoryLabelClick; 
      visible := false; 
     end; 
end; 

これは、すべての非常によくして作品(ISH)は、しかし、私はラベルが押されたのリファレンスになります。この場合、変数「I」に「InventoryLabelClick」プロシージャを呼び出すときに、パラメータを渡したいです。これにより、 "if sender = inventorylabel [x]"(xは上記の数字のいずれか)をすべて削除し、代わりに2番目のビット "imgInvItem.Picture.LoadFromFile(redcarddeck [redcardpositionsofinventory [I]]だけで置き換えることができます。 cardpic); "数値 "x"(上記と同じ)の代わりにパラメータ "I"を使用します。

次の編集を試してみましょう。

**

Public 
    procedure InventoryLabelClick(Sender: TObject; I: Integer); 

は**実装の手順のためにそれを変更する宣言で、それを変更し

Procedure TForm1. InventoryLabelClick(Sender: TObject; I: Integer); 

**続いたときに、それはオブジェクト

for I := 0 to 23 do 
    begin 
    InventoryLabel[i] := TLabel.Create(nil); 
     with InventoryLabel[i] do 
     begin 
      Parent := Inventory; 
      left := 8; 
      OnClick := InventoryLabelClick; 
      visible := false; 
     end; 
end; 
に割り当てられたイベント

**送信者パラメータはデフォルトであるため、最初のケースで宣言する必要はありません。しかし、複数のパラメータがある場合は、両方を要求します。

実行が、これは「

E2010互換性のないタイプ: 『TNotifyEvent』と 『手順、型なしポインタまたは型なしパラメーター』

」エラーメッセージを返し、私は私ことを意味するためにこれを取るにパラメータが間違っていると宣言しました。

この問題を解決するのに手伝ってもらえますか?私が上記のように追加のパラメータを渡すことは不可能であることが判明した場合、誰かがコードを少しきれいにする方法を提案できますか?

ありがとうございます。

答えて

7

TLabelのTagプロパティで "i" の値を保存します。あなたはこのようにそれをしないのはなぜ

Procedure TForm1.InventoryLabelClick(Sender: TObject); 
    begin 
    imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[TLabel(Sender).Tag]].cardpic); 
    end; 
+0

1は、イベントとしてInventoryLabelClickを割り当てした場合 –

+0

に私をビートTLabelではないコントロールのハンドラです。私はその可能性は低いことを知っている。心に留めておくだけのもの。 – mjn

+1

はただ、これは潜在的に危険であることを指摘したいリークあなたが所有者としてnilを使用している場合は、メモリを避けるために、TLabelのインスタンスを解放することを忘れないでください明らか –

2

TNotifyEventの署名を変更することはできません。追加のパラメータを受け入れる独自のOnClickイベントでカスタムラベルコントロールを作成する必要があります。これはおそらく、学校のプロジェクトで保証されている以上に多くの仕事であり、一般的に私はあなたに他の選択肢がない限りカスタムコントロールを書くことをお勧めしません。

しかし、より簡単な方法があります。

Procedure TForm1.InventoryLabelClick(Sender: TObject); 
var 
    I: Integer; 
begin 
    for I := Low(InventoryLabel) to High(InventoryLabel)do 
    if Sender = InventoryLabel[I] then 
     imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[I]].cardpic); 
end; 
+0

[高]を使用している場合、[低]も使用しないでください。それはあなたが常に正しいことを保証できる組み込み関数を持っているときに下限を想定しないことをお勧めします...また、0からHigh-1ではなくLowからHighにループする必要があります。 – HeartWare

+0

ポイントを獲得しました。私はいくつかの言語で作業していて、ちょうどC#から来たので、ギアを切り替えるのに時間がかかりました。 –

3

TLabelにあなたのOnClickイベント、型キャストの送信者で次に
for I := 0 to 23 do begin 
    InventoryLabel[i] := TLabel.Create(nil); 
    with InventoryLabel[i] do begin 
    Parent := Inventory; 
    Tag := i; 
    left := 8; 
    OnClick := InventoryLabelClick; 
    visible := false; 
    end; 
end; 

、およびラベルを取得するためにタグ値を読み取るには、をクリックしましたか?もちろん

Procedure TForm1.InventoryLabelClick(Sender: TObject); 
var i : integer; 
begin 
    for i := 0 to 23 do 
    if sender = InventoryLabel[i] then imgInvItem.Picture.LoadFromFile(redcarddeck[redcardpositionsofinventory[i]].cardpic); 
end; 

、あなたが行うことができますので、InventoryLabelないTLabelが、TLabelとLOADPICTURE方法をcapsulatesカスタムクラスを作成することです最善の方法:

Procedure TForm1.InventoryLabelClick(Sender: TObject); 
begin 
    Sender.LoadPicture; 
end; 

しかし、これはとなりますもう少し仕事があります。

関連する問題