私は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』と 『手順、型なしポインタまたは型なしパラメーター』
」エラーメッセージを返し、私は私ことを意味するためにこれを取るにパラメータが間違っていると宣言しました。
この問題を解決するのに手伝ってもらえますか?私が上記のように追加のパラメータを渡すことは不可能であることが判明した場合、誰かがコードを少しきれいにする方法を提案できますか?
ありがとうございます。
1は、イベントとしてInventoryLabelClickを割り当てした場合 –
に私をビートTLabelではないコントロールのハンドラです。私はその可能性は低いことを知っている。心に留めておくだけのもの。 – mjn
はただ、これは潜在的に危険であることを指摘したいリークあなたが所有者としてnilを使用している場合は、メモリを避けるために、TLabelのインスタンスを解放することを忘れないでください明らか –