Как кодировать компонент во время разработки, который будет создан только во время выполнения - PullRequest
0 голосов
/ 13 октября 2018

Недавно я спросил, как создавать динамические компоненты, которые каждый раз имеют разные имена, я получил чрезвычайно полезные ответы, и моя программа работала без сбоев

, это основная идея кода

* 1004.*

Однако я столкнулся с новой проблемой, я искал на этом форуме, а также во многих других источниках, но все, что я могу найти при поиске, - это как создавать динамические компоненты (что я знаю, как делать).Моя проблема заключается в следующем:

Когда панель (как показано выше) создается во время выполнения, я хочу, чтобы пользователь мог щелкнуть панель, а затем отобразится список информации, касающейся этой конкретной панели.,Я не могу просто написать код для pnlTemp, так как их будет много панелей, которые были созданы.

Я хочу знать, есть ли способ кодировать событие click для «pnlDisplay [i]», даже если этопанель технически еще не существует?

1 Ответ

0 голосов
/ 13 октября 2018

События являются свойствами, как и любые другие.Их обработчики могут быть назначены во время выполнения.Поэтому просто назначьте обработчик события OnClick для каждой создаваемой вами панели и используйте параметр Sender события, чтобы узнать, какая панель нажимается.

constructor TMyComponent.Create(AOwner: TComponent);
var
  pnlTemp: TPanel;
  iCountPanel: Integer;
begin
  inherited Create(AOwner);
  iCountPanel := 0;
  ...
  while iCountPanel < ... do
  begin
    pnlTemp := TPanel.Create(Self);
    pnlTemp.Parent := Self;
    pnlTemp.Name := 'pnlDisplay' + IntToStr(iCountPanel);
    pnlTemp.Tag := iCountPanel;
    // other properties as needed...
    pnlTemp.OnClick := PanelClicked; // <-- ADD THIS
    Inc(iCountPanel);
  end;
  ...
end;

procedure TMyComponent.PanelClicked(Sender: TObject);
var
  Panel: TPanel;
begin
  Panel := TPanel(Sender);
  // use Panel as needed...
end;
...