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

Создание наследника класса TImage

22.03.2014, 11:23. Показов 2106. Ответов 11
Метки нет (Все метки)

Добрый день. С билдером знаком не так давно и его синтаксис понимаю не так хорошо, как хотел бы.

Возникла задача расширить функции базового класса TImage чтобы он мог, например, хранить числовую информацию, иметь собственный метод OnClick, выполняющий определённую функцию.

В коде, создаётся и выводится на Form1 массив элементов класса-наследника.

файл .h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Cell : public TImage
{
public:
        Cell();
        bool state;
};
 
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TButton *Button1;
        void __fastcall FormCreate(TObject *Sender);
private:    // User declarations
        Cell **Img;
        int NumImg;
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
файл .cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::FormCreate(TObject *Sender)
{
NumImg = 10;
Img = new Cell* [NumImg];
for(int i = 0; i < NumImg; i++)
   {
   Img[i] = new Cell(this);
   Img[i]->Picture->LoadFromFile("green.bmp");
   Img[i]->Parent = this;
   Img[i]->Left = i*50;
   Img[i]->Top = 10;
   Img[i]->Visible = true;
   }
}
Ошибка компиляции в строке 7 .срр файла - "Could not find a match for 'Cell::Cell(TForm1 *const)' "
Не совсем понимаю какой должен быть конструктор для такого класса.
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.03.2014, 11:23
Ответы с готовыми решениями:

Создание класса-наследника TImage
Здравствуйте. Необходимо создать класс, который будет наследовать методы TImage, например, Canvas с...

Создание своего класса наследника TOpenDialog
Здраствуйте!!! Ребят подскажите что творю не так : создаю класс-наследник объекта TOpenDialog без...

Создание класса на основе TImage
Просмотрел аналогичные темы, слишком сложно или не совсем то что нужно. Нужно создать поле из...

Ошибка при вызове метода класса-наследника
помогите не знаю что не правильно сделать выходит что в мемо выводит с класса родителя все...

11
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
22.03.2014, 15:59 2
Лучший ответ Сообщение было отмечено Despin как решение

Решение

C++
1
2
3
4
5
6
class Cell : public TImage
{
public:
        __fastcall Cell(TComponent *AOwner) : TImage(AOwner) {
        }
};
1
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 6
22.03.2014, 18:38  [ТС] 3
Maluda, спасибо, всё заработало.

Я бы хотел узнать ещё одну вещь, я понимаю как задать действия для стандартного OnClick класса TImage, но как в моём классе-наследнике реализовать свой OnClick, который выполнял бы строго определённое действие. Скажем - клик-> переменная, член класса стала =0, ещё клик =1, и так по порядку. В обычном
с++ такое реализуется просто созданием функции с идентичным именем и параметрами в классе-наследнике, а вот в как в билдере?
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
23.03.2014, 00:08 4
Лучший ответ Сообщение было отмечено Despin как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ---------------------------------------------------------------------------
class Cell : public TImage {
private:
 
    int FCount;
 
    void __fastcall OnCellClick(TObject *Sender) {
        FCount++;
    }
 
public:
    __fastcall Cell(TComponent *AOwner) : TImage(AOwner), FCount(0) {
        this->OnClick = &OnCellClick;
    }
};
1
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 6
23.03.2014, 17:15  [ТС] 5
Я извиняюсь, мне следовало сразу думать о развитии программы, для реализации задумки нужен двухмерный массив, и опять проблема в конструкторе, видимо в конструкторе-копирования и операторе = для класса.

Сейчас код выглядит так:

.h
C++
1
2
3
4
5
6
7
8
9
10
class Cell : public TImage
{
public:
        __fastcall Cell(TComponent *AOwner) : TImage(AOwner)
        {
        this->OnClick = &OnCellClick;
        }
 
        bool state;
};
.cpp
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::FormCreate(TObject *Sender)
{
XMap = 10;
YMap = 10;
 
Cell **Map = new Cell* [XMap];
        for (int rows = 0; rows < XMap; rows++)
                Map[rows] = new Cell [YMap];
}
Добавлено через 10 минут
И ещё, если не сложно, я никак не могу провести аналогии с конструкторами в с++ обычном и этой структурой: "Cell(TComponent *AOwner) : TImage(AOwner) {}", это: "Наследник (Параметры) : Базовый (Параметры) {}" ?
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
23.03.2014, 19:27 6
Цитата Сообщение от Despin Посмотреть сообщение
я никак не могу провести аналогии с конструкторами в с++ обычном и этой структурой
Что значит "этой структурой"? Это класс, который унаследован от класса TImage, который унаследован от TGraphicControl и т.д.

В C++ Builder такой же С++, только с некоторыми расширениями в виде __property и т.д. (которых мы даже не касались в данной теме)
0
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 6
23.03.2014, 19:47  [ТС] 7
Цитата Сообщение от Maluda Посмотреть сообщение
Что значит "этой структурой"?
Имеется в виду синтаксис.

Судя по ошибкам компиляции можно легко создать одномерный массив членов класса, но уже с двухмерным начинаются такие жуткие проблемы? Или я просто всё усложняю?
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
23.03.2014, 20:05 8
Сейчас напишу пример

Добавлено через 9 минут
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
// --------------------------------------------------------------------------- 
class Cell : public TImage {
private:
 
    int FCount;
 
    int FX;
    int FY;
 
    void __fastcall OnCellClick(TObject *Sender) {
        FCount++;
    }
 
public:
    __fastcall Cell(TWinControl *AParent, const int iX, const int iY) : TImage(AParent), FCount(0), FX(iX), FY(iY) {
 
        this->Parent = AParent;
        this->Left = FX * 50;
        this->Top = FY * 50;
        this->Visible = true;
        this->Picture->LoadFromFile("g:\\test\\1.jpg");
 
        this->OnClick = &OnCellClick;
    }
};
 
typedef Cell* TCellRow;
typedef Cell** TCellArray;
 
// --------------------------------------------------------------------------- 
void __fastcall TForm1::FormClick(TObject *Sender) {
 
    TCellArray *ACellArray = new TCellArray[10];
    for (int i = 0; i < 10; i++) {
        ACellArray[i] = new TCellRow[10];
        for (int k = 0; k < 10; k++) {
            ACellArray[i][k] = new Cell(this, i, k);
        }
    }
}
// ---------------------------------------------------------------------------
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
23.03.2014, 20:35 9
Вот такое должно получится
Миниатюры
Создание наследника класса TImage  
0
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 6
24.03.2014, 15:53  [ТС] 10
Цитата Сообщение от Maluda Посмотреть сообщение
Вот такое должно получится
Всё получилось. Спасибо. Если можно, пара вопросов.
C++
1
__fastcall Cell(TWinControl *AParent, const int iX, const int iY) : TImage(AParent), FCount(0), FX(iX), FY(iY)
TImage получает в качестве аргумента адрес AParent, а не его значение, или я путаюсь в синтаксисе?

Я попытался обратиться к члену массива ACellArray[i][k] при нажатии на обычную кнопку
C++
1
2
3
4
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ACellArray[0][0]->a = 1; //Открытая переменная
}
и получил сообщение, что ACellArray неизвестное имя, хотя если обращаться к нему в блоке Form1 всё отлично компилируется. Тут дело в области видимости переменных? Видимо нужно определить массив более глобально?
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
24.03.2014, 18:25 11
Цитата Сообщение от Despin Посмотреть сообщение
TImage получает в качестве аргумента адрес AParent
Все VCL объекты могут быть только указателями. Они не могут быть созданы статически.

Цитата Сообщение от Despin Посмотреть сообщение
Видимо нужно определить массив более глобально?
Форма - это класс.
Button1Click - это функция - член класса.
Если ты хочешь видеть во всех членах класса TForm1 ACellArray, значит тебе необходимо сделать его членом класса TForm1

Добавлено через 4 минуты
Despin, я настойчиво рекомендую ознакомиться сначала с литературой по VCL, прежде чем начинать работать.
Если лень читать большие и скучные книги, прочитай хотя бы здесь
1
0 / 0 / 0
Регистрация: 22.03.2014
Сообщений: 6
24.03.2014, 19:18  [ТС] 12
Maluda, спасибо за ссылку, обязательно прочитаю.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.03.2014, 19:18
Помогаю со студенческими работами здесь

Создание наследника TForm
Всем привет. При попытке создать наследника TForm получаю ошибку &quot;Resource MyClass not found.&quot; ...

Создание наследника от TWebBrowser
Здравствуйте, пришлось столкнуться с Builder C++. Помогите пожалуйста. Нужно создать наследника от...

Создание наследника TButton
Доброго времени суток, у меня такой вопрос: где можно найти исходный код компонента TButton? Я хочу...

Двухмерный динамический массив экземпляров класса TImage
Здравствуйте! Столкнулась с такой проблемой: при создании двухмерного динамического массива...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru