Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/32: Рейтинг темы: голосов - 32, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21

Обращение к динамически созданным объектам

03.10.2010, 15:22. Показов 6545. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

Есть меню формы - MainMenu1. В одной из вкладок динамически создаются кнопки, по нажатию на которые открывается определенный файл в подпапке программы.

После создания хочется обратится непосредственно к одной из них, имена их я естественно знаю.
При использовании
C++
1
2
TMenuItem*   item = (TMenuItem *)FindComponent("Name");
Edit1->Text=item->Caption;
выдает ошибку переполнения типа
EAccessViolation at address .... in module ...
.

К статическим кнопкам обращается нормально.

НИкто не подскажет, в чем дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.10.2010, 15:22
Ответы с готовыми решениями:

Обращение к динамически созданным обьектам
Здраствуйте помогите с проблемой Ситуация следущая на PageControl динамически создаются вкладки на вкладках тоже динамически создаются...

Работа с динамически созданным Image
Всем доброго дня. У меня никак не получается работать с динамически созданным Image. Создаю его следующим образом : void __fastcall...

Обращение к динамически созданному объекту на динамически созданной форме
Как, создав динамический объект, TButton, обратиться к нему? Unit1.cpp void __fastcall TForm1::Button2Click(TObject *Sender) { ...

14
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 15:30
AceMarR, разница в том, что при создании пунктов меню в Design-Time имена объектов(свойство Name, не путать с Caption) задаются автоматически и их отсутствие проверяется средой разработки.
При динамическом создании в Run-Time вы сами должны позаботится о присвоении нужного имени.

В вашем случае, нужный объект не может быть найден из-за того, что вы выполняете поиск по имени компонента, а не по его видимой подписи.
Задайте имя, либо выполняйте перебор объектов, принадлежащих меню.

Также, не забывайте делать проверку, которая избавит вас от возникновения исключительных ситуаций:
C++
1
2
3
4
5
6
TMenuItem *MenuItem = (TMenuItem *)FindComponent("Name");
if (MenuItem) {
 // существует
} else {
  // отсутствует
}
1
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 16:20  [ТС]
Простите, не совсем понял.

Имя объекта - в данном случае подразумевается свойство "Name", ведь так? - присваивается компоненту мной при создании (допустим, MenuButton[i], где i - порядковый номер кнопки). А что такое видимая подпись? Caption?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 16:33
AceMarR, попробую объяснить чуть иначе... Приведу код и прокомментирую его...
Для примера, возьмём компонент TButton.
Начинаем. Объявим указатель на объект класса TButton и инициализируем его нулём:
C++
1
TButton *DynamicButton = NULL;
В этой строчке DynamicButton - это всего лишь псевдоним для указателя, который создан для того, чтобы обращаться к нему в текущей зоне видимости.

Далее, выполним создание объекта класса и зададим родителя:
C++
1
2
DynamicButton = new TButton(this);
DynamicButton->Parent = this;
А вот теперь та часть, которую вы не поняли:
C++
1
DynamicButton->Name = "MyComponent";
Этой строкой мы задали компоненту имя. То имя, по которому позже можно будет выполнить поиск.

А дальше зададим видимую подпись, тот самый Caption, который и будет виден пользователю:
C++
1
DynamicButton->Caption = "MyButton";
1
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 16:48  [ТС]
Так. Взгляните, пожалуйста:
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall TForm3::ButtonsCreate(TObject *Sender, int N, AnsiString Caption)
{
TMenuItem* newa= new TMenuItem(((TMenuItem *)Sender));
newa->Name = "But"+IntToStr(N)+((TMenuItem *)Sender)->Name;
newa->Visible = true;
newa->Enabled = true;
newa->Caption=Caption;
newa->OnClick=MenuButtonClick;
((TMenuItem *)Sender)->Add(newa);
}
Это функция создания кнопки. Здесь в качестве Sender выступает кнопка, в которой содержатся генерируемые (MainMenu1->N1), N - число, отвечающее номеру документа в папке (начинается с нуля),
Caption - это надпись, которая будет видна пользователю.

Имя (Name, по которому будет искать FindComponent) первой созданной кнопки будет "But0N1", верно?

Так вот, почему-то ее не получается найти - хотя имя точное, я проверял (извелекая имя отправителя при нажатии на эту кнопку).
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 17:07
Цитата Сообщение от AceMarR Посмотреть сообщение
Имя (Name, по которому будет искать FindComponent) первой созданной кнопки будет "But0N1", верно?
Если
C++
1
((TMenuItem *)Sender)->Name == "N1"
- тогда верно.

И теперь пробуйте выполнить поиск:
C++
1
2
3
4
TMenuItem *Item = (TMenuItem *)N1->FindComponent("But0N1");
if (Item) {
  ShowMessage("Present");
}
1
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 17:16  [ТС]
Увы, не срабатывает.

Кстати, обнаружил, что у меня нет строчки типа
C++
1
DynamicButton->Parent = this;
Попытался вставить - отказывается компилировать: " 'TMenuItem:Parent' is not acceptable."

В этом не может быть причина?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 17:18
Цитата Сообщение от AceMarR Посмотреть сообщение
Увы, не срабатывает.
Что-то вы не так делаете... Я только что откомпилировал данный код у себя - работает отлично.

Выложите сюда проект или нужную часть, посмотрю в чём ошибка.
0
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 17:29  [ТС]
Проект великоват будет... Вот все задействованные части:
Form3, MainMenu1, MainMenu1-N1, Button1, FileListBox1, DirectoryListBox1.



C++
1
2
3
4
5
6
7
void __fastcall TForm3::Button1Click(TObject *Sender)
{//создание динамических кнопок меню if(DirectoryExists(Form3->Label2->Caption+"\\"+Form3->Edit1->Text+"\\Документы")){
Form3->FileListBox1->Directory=Form3->Label2->Caption+"\\"+Form3->Edit1->Text+"\\Документы";
TakeNames(Form3->N1);
}
Form3->FileListBox1->Directory=Form3->DirectoryListBox1->Directory;
Form3->FileListBox1->Mask="*.*";

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm3::TakeNames(TObject *Sender)
{//процедура получения имен из указанной папки
int i=0;
while(i<Form3->FileListBox1->Items->Capacity){
//while(i<3){
FileListBox1->ItemIndex=i;
if(FileExists(FileListBox1->FileName))
 
{
FileListBox1->Mask=FileListBox1->FileName;
ButtonsCreate(Sender,i,FileListBox1->Items->GetText());
FileListBox1->Mask="*.*";}
i++;
}

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm3::ButtonsCreate(TObject *Sender, int N, AnsiString Caption)
{//Процедура создания кнопок
 
TMenuItem *newa=NULL;
newa = new TMenuItem(((TMenuItem *)Sender));
//newa->Parent=(((TMenuItem *)Sender));
newa->Name = "But"+IntToStr(N)+(((TMenuItem *)Sender))->Name;
newa->Visible = true;
newa->Enabled = true;
newa->Caption=Caption;
newa->OnClick=MenuButtonClick;
((TMenuItem *)Sender)->Add(newa);
}
Далее, собственно, выполняю поиск определенной кнопки:

C++
1
2
3
TMenuItem*   item = (TMenuItem *)FindComponent("But0N1");
if(item){ShowMessage("Present");}
else {;}
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 17:40
AceMarR, не всматриваясь во всё остальное в глаза сразу бросился поиск:
C++
1
TMenuItem*   item = (TMenuItem *)FindComponent("But0N1");
И теперь посмотрите разницу между тем, что я писал:
C++
1
TMenuItem *Item = (TMenuItem *)N1->FindComponent("But0N1");
1
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 17:52  [ТС]
Не работает и так и так.
Сейчас попробовал создать новый проект, чистый, и создал в нем несколько кнопок.
Статическую находит, динамические - нет. Вот проект:Dynamics.rar
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 18:01
AceMarR, вставьте в обработчик OnClick для Button4:
C++
1
2
3
4
5
TMenuItem *Item = (TMenuItem *)MainMenu1->FindComponent("MyComponent2");
if (Item) {
  ShowMessage("Present"); 
  Item->Caption="Надпись сменилась";
}
1
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 18:15  [ТС]
Просто какая-то магия) В свежем проекте созданную кнопку он находит, в старом - нет.

Спасибо огромное, буду искать где баг)

Добавлено через 4 минуты
А не может быть такого, что имя кнопки как-то меняется, допустим, служебными символами, после создания?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
03.10.2010, 18:17
Цитата Сообщение от AceMarR Посмотреть сообщение
А не может быть такого, что имя кнопки как-то меняется
Нет, в свойство Name служебные символы не добавляются.

Отследите иерархию в меню, а потом попробуйте выполнить поиск.
Если будут проблемы - выкладывайте проект здесь или в ЛС, постараюсь помочь.
0
0 / 0 / 0
Регистрация: 11.09.2010
Сообщений: 21
03.10.2010, 18:29  [ТС]
Нашел работающий вариант:
C++
1
TMenuItem *Item = (TMenuItem *)N1->FindComponent("But1N1");
При этом компилятор утверждает, что "N1 не является частью MainMenu1".))

Еще раз огромное спасибо за помощь)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.10.2010, 18:29
Помогаю со студенческими работами здесь

Обращение ко всем объектам
Если на форме есть тысячи Лэйблов, а возникла такая необходимость поменять шрифт или цвет или размер, то как быть? Есть ли что-то...

Обращение к динамически созданному компоненту
Всем привет! Мне нужна помощь в моей программе Мне надо, чтобы при нажатии на динамическую кнопку, капча этой кнопки инкрементилась...

Обращение к динамически созданным объектам Qt
Доброго времени суток. У меня возникла необходимость в диалоговом окне по нажатию на кнопку создавать textedit'ы, в них пользователь пишет...

Обращение к динамически созданным объектам
Подскажите возможно ли получить список элементов созданных в TabControl и обращаться к ним? суть проблемы в том, что мне нужно обратиться к...

Обращение к динамически созданным на форме объектам
Добрый день. Я динамически создаю по нажатию кнопки на форме разные элементы: comboBox, textBox, label. Создаю вот так: var cb1 = new...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru