Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/76: Рейтинг темы: голосов - 76, средняя оценка - 4.91
 Аватар для roomer
1 / 1 / 0
Регистрация: 11.01.2009
Сообщений: 28

Динамическое создание кнопок

23.01.2009, 14:51. Показов 14588. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как создать кнопку, я примерно представляю:

C++
1
2
3
4
5
6
7
 TSpeedButton *lbl;
 
lbl=new TSpeedButton(this);
lbl->Parent=this;
lbl->Caption=AnsiString("Knopka")+AnsiString(i);
lbl->Top=30;
lbl->Left=10;
Но не знаю, как создать их динамически много и управлять ими. Вроде бы есть класс TList. Подскажите пожалуйста, как это сделать.

Добавлено через 7 минут 48 секунд
И ещё один вопрос.
Есть класс:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class cLinks
  {
  public:
    cLinks(void)
      {
      Count=0;
      TStringList *LinksList = new TStringList;
      TStringList *FileList = new TStringList;
      };
    int Count;
    TStringList *LinksList; 
    TStringList *FileList;  
    //HICON iconheader[1000];
 
    ~cLinks()
      {
      delete LinksList;
      delete FileList;
      };
  protected:
  private:
  };
Я его объявляю:
C++
1
2
3
4
void __fastcall TForm2::Button1Click(TObject *Sender)
{
cLinks Links;
Links.Count=56;
...
однако вылетает ошибка
Project raised exception class EACCESSViolation with message 'Access violation at adress ...'

В чем ошибка?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.01.2009, 14:51
Ответы с готовыми решениями:

Динамическое создание кнопок + функция
Доброго времени суток! К примеру в цикле формирую кучу кнопок, мне надо чтобы каждая выполняла свою задачу. И так подробнее: к...

Динамическое создание кнопок
Вот текст задачи Написать программу, добавляющую на форму кнопки. Кнопки добавляются в узлы прямоугольной сетки. Расстояния между...

Динамическое создание кнопок
Вот что мне надо осуществить. Имеется кнопка с лаконичным название "itbuttonnumber1mazafaka". При её нажатии должна создаваться...

24
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.01.2009, 14:59
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
// заголовочный файл:
#include <map>
 
using namespace std;
 
class TForm1 : public TForm
{
...
...
private:    // User declarations
        map <int, TImage*> ImMap; // индексированный контейнер для хранения указателей
        void __fastcall ImageDblClick (TObject *Sender); // самописная ф-я - событие для динамических компонентов
public:    
...
};
 
// в *.cpp модуле формы:
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *img;
  for (int i = 0; i < 10; i ++) // создаем 10 одинаковых объектов типа TImage
       {
          img = new TImage (this);
          img->Parent = this;
          img->Width = 100;
          img->Height = 100;
          img->Top = 100*i+10;
          img->Canvas->Rectangle(0,0, 100, 100); 
          img->OnDblClick = ImageDblClick; // присваиваем самописный обработчик события
       }
}
// --------------------------------------------------------------------------------------------
// свой обработчик события
void __fastcall TForm1::ImageDblClick(TObject *Sender)
{
   TImage *img = dynamic_cast<TImage*>(Sender); // приводим TObject *Sender к типу TImage 
   if (!img) return;
// делаем с img что угодно
}
// --------------------------------------------------------------------------------------------
// удаление динамических компонентов 
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  for (unsigned int j = 0; j<ImMap.size(); j++)
      delete ImMap[j];
  ImMap.clear();
}
меняешь TImage на TSpeedButton и готово
ЗЫ: std::map<> можно поменять на любой удобный контейнер
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
23.01.2009, 15:12
Цитата Сообщение от oxotnik Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *img;
  for (int i = 0; i < 10; i ++) // создаем 10 одинаковых объектов типа TImage
       {
          img = new TImage (this);
          img->Parent = this;
          img->Width = 100;
          img->Height = 100;
          img->Top = 100*i+10;
          img->Canvas->Rectangle(0,0, 100, 100); 
          img->OnDblClick = ImageDblClick; // присваиваем самописный обработчик события
       }
}
Вы уверены что здесь нет ошибки, и где img помещаеться в ImMap
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.01.2009, 15:31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  TImage *img;
  for (int i = 0; i < 10; i ++) // создаем 10 одинаковых объектов типа TImage
       {
          img = new TImage (this);
          img->Parent = this;
          img->Width = 100;
          img->Height = 100;
          img->Top = 100*i+10;
          img->Canvas->Rectangle(0,0, 100, 100); 
          img->OnDblClick = ImageDblClick; // присваиваем самописный обработчик события
          ImgMap[i] = img;
 
       }
}
0
 Аватар для roomer
1 / 1 / 0
Регистрация: 11.01.2009
Сообщений: 28
23.01.2009, 16:42  [ТС]
Спасибо, код с небольшими поправками работает.

А насчет класса не подскажите?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
23.01.2009, 16:49
это говорит исключение говорит об обращении к неинициализированной памяти...
я всегда делаю в билдере так:
C++
1
2
cLinks* Links = new cLinks();   
Links->Count=56;
, не знаю, о чем я думал, когда этот пост писал...
0
 Аватар для roomer
1 / 1 / 0
Регистрация: 11.01.2009
Сообщений: 28
23.01.2009, 17:03  [ТС]
Хм... Все равно ту же ошибку выдает.
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
23.01.2009, 17:23
Цитата Сообщение от roomer Посмотреть сообщение
Хм... Все равно ту же ошибку выдает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class cLinks
  {
  public:
    cLinks(void)
      {
      Count=0;
      LinksList = new TStringList;
      FileList = new TStringList;
      };
    int Count;
    TStringList *LinksList;
    TStringList *FileList;
    //HICON iconheader[1000];
 
    ~cLinks()
      {
      delete LinksList;
      delete FileList;
      };
  protected:
  private:
  };
ошибка была потому что в конструкторе создавались локальные (для конструктора) указатели, а удалялись (пытались удалиться) указатели которые являются членами класса
1
 Аватар для roomer
1 / 1 / 0
Регистрация: 11.01.2009
Сообщений: 28
27.01.2009, 07:25  [ТС]
И правда
Недосмотрел, спасибо.

Добавлено через 22 часа 11 минут 18 секунд
Еще вопросик, никак не могу понять.

Обработчик:
C++
1
2
3
4
5
6
7
// свой обработчик события
void __fastcall TForm1::ImageDblClick(TObject *Sender)
{
   TImage *img = dynamic_cast<TImage*>(Sender); // приводим TObject *Sender к типу TImage 
   if (!img) return;
// делаем с img что угодно
}
А как узнать номер текущей кнопки в контейнере?
0
Почетный модератор
 Аватар для Lord_Voodoo
8785 / 2538 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
27.01.2009, 08:18
если вы один обработчик события присваиваете всем созданным кнопкам, тогда в параметре Sender передается именно та кнопка, на которую вы кликаете, поэтому простым преобразованием типов вы можете Sender преобразовать TButton, хотя если вам нужно только свойство Name, то и TComponent пойдет... ну и считываете имя нажатой кнопки... и для создания динамических компонентов необязательно использовать контейнеры, т.к. таковым уже является форма, в которой вы создаете компоненты...
1
 Аватар для roomer
1 / 1 / 0
Регистрация: 11.01.2009
Сообщений: 28
02.04.2009, 09:42  [ТС]
Ещё один вопросик.
Картинки для динамических кнопок SpeedButton (со включенным свойством transparent) я задаю так:
C++
1
Form1->ImageList2->GetBitmap(IconNum,img->Glyph);
где img - ссылка на объект кнопки.

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

Добавлено через 19 часов 48 минут 42 секунды
Весь рунет обыскал уже, не могу найти решения...
0
2 / 2 / 1
Регистрация: 17.03.2009
Сообщений: 23
02.04.2009, 10:14
уважаемый oxotnik , я еще только начинаю изучать С++ , но насколько я понял эта строчка
C++
1
TImage *img = dynamic_cast<TImage*>(Sender);
отвечает за
a)распознание по какому TImage был DblClick
или
b)за то чтобы действия были совершенны только если DblClick был именно по TImage, да ?
внимание вопрос строчка отвечает только за это ?
по таму что если только за это , то
a)если вы например захотите что бы для каждой динамически созданной TImage было выполнено отдельное действие , то вам потом всеравно прийдеться проверять по какой из них был DblClick ?!
b)тогда действия будут выполнены над всеми создаными TImage ?!

а насколько я понял roomer'у надо выполнять разные действия над каждой динамически созданной кнопке, а посему может такой вариант был бы проще или нет ?
C++
1
2
3
4
5
6
//заголовочный файл .h
class TForm1 : public TForm
{
    public:
     TSpeedButton** MySBtn;
            void __fastcall BoxClick(TObject *Sender);
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//файл .cpp
void MyFunc () {
 int n = 10;//создаем 10 кнопок
 MySBtn = new TButton* [n];
 
 for (int z = 0; z < n; z++) {
  MySBtn[z] = new TSpeedButton(this);
  MySBtn[z]->Parent = this;
  MySBtn[z]->Caption = z;
  MySBtn[z]->Height = 65;
  MySBtn[z]->Width = 65;
  MySBtn[z]->OnClick = &Form1->BoxClick;
  MySBtn[z]->BringToFront();
 
  char buff[4];
  sprintf(buff, "a%d", i);
  MySBtn[z]->Name = buff;
 
  MySBtn[z]->Show();
 }
 
void __fastcall TForm1::BoxClick(TObject *Sender) {
   if (Sender == MySBtn[0]) {
    //действия
   }else //и т.д.
}
0
10 / 10 / 0
Регистрация: 08.12.2008
Сообщений: 103
02.04.2009, 10:28
А кто знает как добавить в форум кнопку?
0
 Аватар для PresAlexandr
43 / 43 / 16
Регистрация: 16.05.2009
Сообщений: 372
16.05.2009, 21:11
Здравствуйте! Не могли бы подсказать, почему при удалении динамически созданной кнопки она остается на форме?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.05.2009, 21:20
Цитата Сообщение от PresAlexandr Посмотреть сообщение
Здравствуйте! Не могли бы подсказать, почему при удалении динамически созданной кнопки она остается на форме?
код?
0
 Аватар для PresAlexandr
43 / 43 / 16
Регистрация: 16.05.2009
Сообщений: 372
16.05.2009, 21:25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const i=10;
TButton *MyButton[i];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
int k;
for (k=0; k<3; k++)
        {
        MyButton[i] = new TButton(this);
        MyButton[i]->Parent=Form1;
        MyButton[i]->Width = 20;
        MyButton[i]->Height = 20;
        MyButton[i]->Left = i*k;
        MyButton[i]->Top = i*k;
 
        }
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
  delete *MyButton;
}
Добавлено через 3 минуты 41 секунду
Или Они удаляются, но лишь остаются на форме?
MyButton[i]->Visible=false; - поможет?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
16.05.2009, 21:29
ты вообще топик читал?
удаляешь ты не указатель на класс кнопки а указатель на массив указателей кнопок.
delete[] MyButton;
//или
for (int j = 0; j<i; j++
delete MyButton[j];

PS: почему цикл по k а создается MyButton[i] зачем 3 раза записывать в одно и то же место разные указатели, при этом во первых: если const i = 0, тогда пишешь за границы массива, во вторых: первые 2 указателя теряются.
0
 Аватар для PresAlexandr
43 / 43 / 16
Регистрация: 16.05.2009
Сообщений: 372
16.05.2009, 21:41
С циклом намудрил, признаю... А насчет удаления столько всего перекопал "не совсем по теме", что уже запутался! Спасибо за помощь! Буду дальше учиться.
0
 Аватар для PresAlexandr
43 / 43 / 16
Регистрация: 16.05.2009
Сообщений: 372
18.05.2009, 22:09
Вот смотрите, объявляю массив кнопок:

1 const i=10, j=10;
2 TBitBtn *MyButton[i][j];

Какое значение имеют константы (их требует компилятор)?
Что происходит, если я программно создаю несколько больше кнопок? Допустим,
массив 15х15! Не теряю ли что?

На форме они отображаются исправно, компилятор не "пищит"...
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
18.05.2009, 22:12
Code
1
2
const [COLOR="Red"]int[/COLOR] i=10, j=10;
TBitBtn [COLOR="Red"]/* * */[/COLOR] MyButton[i][j];
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.05.2009, 22:12
Помогаю со студенческими работами здесь

Динамическое создание кнопок
Всем доброго времени суток! Передо мною стала серьезная проблема! Имеется файл &quot;test.txt&quot;, его содержимое: кнопка1 ...

Динамическое создание кнопок.
Можно сделать так, чтобы при нажатии на одну кнопку создавалась (не появлялась) кнопка?

Динамическое создание кнопок
Всем, привет! Помогите, пожалуйста, у меня есть такой код программы, где создаются кнопки динамически for i:=0 to k do begin ...

Динамическое создание кнопок
Панели присвоен слушатель мыши, по нажатию кнопки, должна добавляться кнопка, но она не отображается. Разметка компонентов делалась с...

Динамическое создание кнопок
TextBox tbI = new TextBox; Button btU = new Button; Int n=5; for (int i = 0; i &lt; n; i++) { //создание textBox ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru