c++ - Собственная функция вместо ButtonClick


2

C++ Builder 2006. Имеется БД Access, подключенная к Builder C++ через ADOConnection, ADOTable и DataSource. Необходимо вывести базу данных на форму не используя компонент dbgrid. То есть оформить вывод так как я хочу.

Логично, что нужно динамически генерировать элементы и в них записывать значения из полей таблицы. Часть того как я делаю:

for (int i = 1; i <= ADOTable1->RecordCount; i++) {
    Btn[i] = new TButton(UserMain);
    Btn[i]->Parent = UserMain;
    Btn[i]->Left = 240 + (220 * (i - 1)) * c;
    Btn[i]->Top = k * 270;
    Btn[i]->Name = "Button" + IntToStr(i);
    Btn[i]->Caption = "Подробнее";
}

В цикле так же генерируются и прочие элементы, но меня интересует именно Button Количество этих кнопок меняется в зависимости от БД. Как на них навесить обработчик события клика, чтобы при этом выводилось разное сообщение в зависимости от кнопки?

Пробую сделать через обычную функцию, для проверки в качестве параметра передаю просто индекс:

void showAbout(int i) {
    ShowMessage(i);
}
//и в предыдущем цикле такое:
Btn[i]->OnClick = showAbout(i);

Но это выдает ошибку [C++ Error] Unit2.cpp(73): E2109 Not an allowed type

Источник
  •  59
  •  1
  • 16 янв 2018 2018-01-16 18:46:42

1 ответ

2

При создании пометьте во вспомогательном поле - какой индекс имеет кнопка

Btn[i]->Tag = i;

Назначьте всем кнопкам один обработчик (обычную функцию нельзя - это должен быть метод объекта, соответствующий прототипу)

Btn[i]->OnClick = DynButtonClick;

А уже внутри обработчика смотрите Tag Sender-а и в зависимости от него что-то делайте

P.S. Вообще идея генерировать набор контролов на каждую запись БД - сомнительная. StringGrid-ом или TListView нельзя обойтись?

  • 17 янв 2018 2018-01-17 02:50:05
А еще я получаю ошибку [C++ Error] Unit2.cpp(87): E2316 _fastcall TUserMain::DynButtonClick(TObject *) is not a member of TUserMain и она в принципе логична — 17 янв 20182018-01-17 05:37:21.000000
Табличные компоненты же и придуманы, чтобы не создавать миллион отдельных контролов. В общем-то, и в гриде и в ListView можно и картинки, и кнопки сделать (в гриде с кнопками немного сложнее - их можно просто рисовать) — 17 янв 20182018-01-17 05:33:38.000000
Если определенный текст - строка в памяти, то её адрес можно занести в Tag (с приведением типа). C выборкой же из таблицы - лучше отдельный вопрос сделать. — 17 янв 20182018-01-17 05:31:48.000000
Мне нужно оформить данные из БД в виде карточек как в Интернет-магазинах. Изображение товара - заголовок - кнопка "Подробнее", при клике по которой отображается описание товара на новой форме. Поэтому и не пользуюсь StringGrid-ом или ListView. — 17 янв 20182018-01-17 05:21:06.000000
Решение мне частично подходит. Только вот индекс я привел в качестве примера(плохой пример), в идеале мне нужно чтобы каждая кнопка была привязана к определенному тексту. Или же можно передавать индекс, но потом как-то выбрать запись с ADOTable с этим индексом — 17 янв 20182018-01-17 05:20:49.000000