Перейти к содержанию
Fire Monkey от А до Я
  • 0

Как получить доступ к наследнику TListBoxItem при вызове события из стиля


Alexey Lovchikov

Вопрос

Здравствуйте,

 

Есть следующий класс, наследник от TListBoxItem и свой стиль questionnaireitem

TQuestionnaireItem = class(TListBoxItem)
  private
    FQuestionnaireId: Integer;
    procedure SetDozsait(const Value: string);
    procedure SetOnEditClick(const Value: TNotifyEvent);
    procedure SetOnDeleteClick(const Value: TNotifyEvent);
  public
    constructor Create(AOwner: TComponent); override;
    property QuestionnaireId: Integer read FQuestionnaireId write FQuestionnaireId;
    property Dozsait: string write SetDozsait;
    property OnEditClick: TNotifyEvent write SetOnEditClick;
    property OnDeleteClick: TNotifyEvent write SetOnDeleteClick;
  end;

{ TQuestionnaireItem }

constructor TQuestionnaireItem.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  StyleLookup := 'questionnaireitem';
  Height := 220;
end;

procedure TQuestionnaireItem.SetDozsait(const Value: string);
begin
  Self.StylesData['lbdozsait.Text'] := Value;
end;

procedure TQuestionnaireItem.SetOnDeleteClick(const Value: TNotifyEvent);
begin
  Self.StylesData['btdelete.OnClick'] := TValue.From<TNotifyEvent>(Value);
end;

procedure TQuestionnaireItem.SetOnEditClick(const Value: TNotifyEvent);
begin
  Self.StylesData['btedit.OnClick'] := TValue.From<TNotifyEvent>(Value);
end;

В стиле questionnaireitem есть две кнопки событие которых присваивается через OnDeleteClick и OnEditClick

 

Ниже пример построения элементов 

procedure TfrJournalQuestionnaire.InitList;
var
  Index: Integer;
  AItem: TQuestionnaireItem;
begin
  lbJournalQuestionnaire.Items.Clear;

  for Index := 1 to 5 do
  begin
    AItem := TQuestionnaireItem.Create(lbJournalQuestionnaire);
    AItem.QuestionnaireId := Index;
    AItem.Dozsait := 'Дозорый сайт '+ Index.ToString;
    AItem.OnEditClick := ClickQuestionnaireEdit;
    AItem.OnDeleteClick := ClickQuestionnaireDelete;

    lbJournalQuestionnaire.AddObject(AItem);
  end;
end;

Визуально выглядит так

 

 post-749-0-09248400-1420649642.png

 
На событие клика кнопки присваиваются процедуры  ClickQuestionnaireEdit и ClickQuestionnaireDelete
 
Теперь вопрос, как получить из процедур ClickQuestionnaireEdit и ClickQuestionnaireDelete объект TQuestionnaireItem, необходимо получить значение свойств QuestionnaireId и Dozsait
У процедур есть Sender но это ссылка на кнопку стиля
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Ну вот, отвечаю опять на свой вопрос сам.

procedure TfrJournalQuestionnaire.ClickQuestionnaireEdit(Sender: TObject);

  function GetItem(AControl: TControl): TQuestionnaireItem;
  begin
    while not (AControl.Parent is TQuestionnaireItem) do
      AControl := TControl(AControl.Parent);

    Result := TQuestionnaireItem(AControl.Parent);
  end;

begin
  ShowMessage(
    GetItem(TControl(Sender)).QuestionnaireId.ToString
  );
end;
Ссылка на комментарий
  • 0
  • Администраторы

На всякий случай. Аналогичный ответ был дан раньше здесь: Как узнать из какого ListBoxItem был вызван обработчик

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...