6 / 4 / 4
Регистрация: 26.06.2017
Сообщений: 124
1

Преобразование массива указателей на TPanel в TWinControl

22.01.2018, 23:44. Показов 1108. Ответов 4
Метки нет (Все метки)

Доброго времени года.
У меня используется динамически созданный массив указателей на динамически создаваемые компоненты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
TImage **ImagesDinamicMultSelect; // объявлен глобально
 
ImagesDinamicMultSelect=new TImage *[countActs+countTags+countTheme];
for(int i=0; i<count; i++)
    {
    ImagesDinamicMultSelect[i]=new TImage(Place);
    ImagesDinamicMultSelect[i]->Parent=Place;
    ImagesDinamicMultSelect[i]->Name="ImagDinamMultSelect"+IntToStr(i);
    ImagesDinamicMultSelect[i]->Visible=false;
    ImagesDinamicMultSelect[i]->OnClick=Form1->PanelsMultSelect->OnClick;
    ImagesDinamicMultSelect[i]->OnContextPopup=Form4->ImageChThemActTagPRVW->OnContextPopup;
    }
Далее у меня есть функция размещающая все эти компоненты, работает только со свойствами Left Top Width Height

C++
1
void __fastcall TForm1::Placement(TWinControl *Place, TWinControl  **Component1, TWinControl **Component2, int count, std::vector<int> breaks)
И как бы я не вызывал её
C++
1
Form1->Placement(Place, ImagesDinamicMultSelect, PanelsDinamicMultSelect, count, breaks);
выдает ошибку E2342 Type mismatch in parameter 'Component1' (wanted 'TWinControl * *', got 'TImage * *')
C++
1
Form1->Placement(Place, dynamic_cast <TWinControl**>(ImagesDinamicMultSelect), dynamic_cast <TWinControl**>(PanelsDinamicMultSelect), count, breaks);
выдает ошибку E2031 Cannot cast from 'TImage * *' to 'TWinControl * *'

При том, что в параметр TWinControl *Place передается TScrollBox или TPanel и ошибок это не вызывает.
Если в параметрах функции, вместо TWinControl** задать TImage** и передать TImage** то все работает. Но это проблема, хотелось бы её сделать универсальной для любых типов компонентов.

Пробовал вместо TWinControl** в параметры функции задать TComponent** - результат аналогичный.

Как мне преобразовать TImage** в TWinControl **?
Или может вместо TWinControl ** какой другой есть универсальный?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2018, 23:44
Ответы с готовыми решениями:

Преобразование указателей СИ
Увидел в программе вот такую строчку: #defyme SPI_DR8 *(uint8_t *)0x4001300C ... uint8_t...

Преобразование указателей
Выводит дерево вместо адреса int x = 5; int *p; p = &amp;x; cout &lt;&lt; p &lt;&lt; endl; ...

Преобразование указателей
Люди добрые, прокомментируйте поЖалуйста. #include &lt;iostream&gt; using namespace std; void...

Преобразование типов указателей
Помогите найти ошибку в коде лабораторной работы по Си. Дано задание: Разработать две функции,...

4
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31250 / 20427 / 7963
Регистрация: 22.10.2011
Сообщений: 35,467
Записей в блоге: 6
23.01.2018, 00:16 2
Цитата Сообщение от roma2415 Посмотреть сообщение
Как мне преобразовать TImage** в TWinControl **?
Никак. TImage не является потомком TWinControl (это НЕ оконный компонент, а графический, потомок TGraphicControl), поэтому приведение через dynamic_cast невозможно. Ищи ближайшего общего предка для TWinControl и TGraphicControl. Это TControl, если мне память не изменяет. Вот через него сможешь передать как TImage, так и TPanel.
1
6 / 4 / 4
Регистрация: 26.06.2017
Сообщений: 124
23.01.2018, 01:21  [ТС] 3
С TControl - все тоже самое... Кроме того я пробовал с TComponent, а это родительский от TControl...
Тут есть один нюанс. TPanel* передается в TWinControl* без проблем
А уже TPanel** в TWinControl** Выдает такую же ошибку...
[bcc32 Error] Unit1.cpp(262): E2034 Cannot convert 'TPanel * *' to 'TWinControl * *'

т.е. указатель на TPanel в указатель на TWinControl преобразовывается без проблем, а массив указателей на TPanel уже нет...

Добавлено через 35 минут
Ура, получилось.
для преобразования массива указателей использовал reinterpret_cast
никогда до этого не приходилось пользоваться этим преобразованием

Спасибо, volvo, TWinControl там тоже было лишним.


C++
1
2
3
4
//функция теперь выглядит так
void __fastcall Placement(TControl *Place, TControl **Component1, TControl **Component2, int count, std::vector<int> breaks);
// а вызывается так
Placement(Place, reinterpret_cast <TControl**>(ImagesDinamicMultSelect), reinterpret_cast <TControl**>(PanelsDinamicMultSelect), count, breaks);
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
31250 / 20427 / 7963
Регистрация: 22.10.2011
Сообщений: 35,467
Записей в блоге: 6
23.01.2018, 10:32 4
Лучший ответ Сообщение было отмечено roma2415 как решение

Решение

Цитата Сообщение от roma2415 Посмотреть сообщение
для преобразования массива указателей использовал reinterpret_cast
Это не то, что я предлагал.

У меня есть еще вопрос: как создается ImagesDinamicMultSelect я вижу, а вот как создается PanelsDinamicMultSelect? Если тоже динамически - то может и вообще ничего преобразовывать не нужно? Смотри:
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
TControl **ImagesDinamicMultSelect; // объявлено глобально
TControl **PanelsDinamicMultSelect;
 
// ...
 
// это у тебя было
    ImagesDinamicMultSelect = new TControl*[countActs + countTags + countTheme];
    for (int i = 0; i < count; i++) {
        TImage *im = new TImage(Place);
        im->Parent = Place;
        im->Name = "ImagDinamMultSelect" + IntToStr(i);
        im->Visible = false;
        im->OnClick = Form1->PanelsMultSelect->OnClick;
        im->OnContextPopup = Form4->ImageChThemActTagPRVW->OnContextPopup;
        ImagesDinamicMultSelect[i] = im;
    }
 
// если только массив панелей можно создать вот так:
    PanelsDinamicMultSelect = new TControl*[10];
    for (int i = 0; i < 10; i++) {
        TPanel *pn = new TPanel(Place);
        pn->Parent = Place;
        pn->Name = "DynPanel" + IntToStr(i);
        // ...
        PanelsDinamicMultSelect[i] = pn;
    }
, то вызов

C++
1
Form1->Placement(Place, ImagesDinamicMultSelect, PanelsDinamicMultSelect, count, breaks);
пройдет без ошибок. И безо всяких насильственных преобразований типов через reinterpret_cast
1
6 / 4 / 4
Регистрация: 26.06.2017
Сообщений: 124
23.01.2018, 12:06  [ТС] 5
Да, PanelsDinamicMultSelect создается динамически, абсолютно так же, как и ImagesDinamicMultSelect

Массивы указателей TControl, указывающих на TImage и TPanel? С этой стороны вообще не думал! Спасибо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2018, 12:06

Преобразование указателей на функции
Добрый вечер, очень давно я не объявлялся. Буквально несколько месяцев даже не садился прогать за...

Задачка на понимание указателей, преобразование типов
Написать функцию, принимающую вещественное число типа float, превращающую его в целое типа int с...

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.