Я выполняю свой вычислительный проект A2 в Delphi и столкнулся с проблемой, когда дело доходит до добавления дополнительных параметров в процедуру обработки события.
Я создаю несколько меток (объект TLabel) и сохраняю их в массиве под моей основной формой "form1".
Вот что у меня сейчас:
** Объявление массива меток и соответствующей процедуры ClickEvent с переданным стандартным параметром (Sender: TObject).
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;
Это все очень хорошо и работает (иш), однако я хочу передать параметр, когда я вызываю процедуру «InventoryLabelClick», в этом случае переменную «I», которая будет ссылкой на нажатую метку. Это позволит мне удалить все «if sender = inventorylabel [x]» (x - любое из чисел, указанных выше) и вместо этого заменить только вторым битом «imgInvItem.Picture.LoadFromFile (redcarddeck [redcardpositionsofinventory [I]]). cardpic);» но с параметром «I» вместо числа «x» (как указано выше).
Я попробовал следующие изменения, чтобы посмотреть, сработает ли это.
** Измените его в объявлении
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;
** параметр sender является значением по умолчанию, поэтому нет необходимости объявлять его в первом случае. Однако, когда есть несколько параметров, он запрашивает оба.
При запуске возвращается сообщение об ошибке "
E2010 Несовместимые типы: «TNotifyEvent» и «процедура, нетипизированный указатель или нетипизированный параметр»
"Я понимаю, что это означает, что я объявил параметры неверными.
Кто-нибудь может помочь мне решить эту проблему? Если окажется, что невозможно передать дополнительный параметр, как я пытался сделать выше, кто-нибудь может предложить способ сделать код немного более аккуратным?
Заранее спасибо.