14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
1

Создание своего класса наследника TOpenDialog

14.05.2015, 21:08. Показов 2204. Ответов 13
Метки нет (Все метки)

Здраствуйте!!!
Ребят подскажите что творю не так : создаю класс-наследник объекта TOpenDialog
без всяких дополнительных полей и методов т.е копия TOpenDialog для тренировки и понимания сути
создания своих модифицированных объектов из базовых объектов библиотеки builder.
Класс описал в хидере (ниже код прилагается) в файле реализации кострукторы и деструкторы описывать
не стал. Почему? Разве класс наследник не должен наследовать коструктор и деструктор родителя?
Но при попытке создать этот класс bulder выдает ошибку : W8004 'opnd' is assigned a value that is never used
- 'opnd' присваивается значение которое никогда не используется.

Хидер :
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
#ifndef formH
#define formH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published:    // IDE-managed Components
    
private:    // User declarations
public:     // User declarations
    __fastcall TForm3(TComponent* Owner);
        class TMyOpenDialog : TOpenDialog
         {
         };
         TMyOpenDialog *opnd;
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
Реализация :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vcl.h>
#pragma hdrstop
 
#include "form.h"
#include "opendlg.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
 
 
}
//---------------------------------------------------------------------------
void __fastcall TForm3::FormCreate(TObject *Sender)
{
        TMyOpenDialog *opnd (new TMyOpenDialog(this));
        opnd->Execute();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 21:08
Ответы с готовыми решениями:

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

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

Создание своего класса от Билдерського
Мне нужно создавать много динамических кнопок (Label a не Button поэтому я не знаю как это назвать...

Обращение к элементу UI своего контрола-наследника из xaml другого класса
Создаю свой контрол - наследник от Grid в коде .cs В своём контроле добавляется TextBox Вопрос:...

13
4041 / 2330 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.05.2015, 21:18 2
Это не ошибка, а предупреждение. Если так уж мешает, то допиши #pragma warn -aus - оно и исчезнет.
0
случайный прохожий
2312 / 1535 / 530
Регистрация: 20.07.2013
Сообщений: 4,326
14.05.2015, 21:22 3
Беглый взгляд (я в классах до сих пор "плаваю", учили хорошо, но до меня обычно долго доходит, пусть и остается в голове, если дошло, почти навсегда):
C++
1
  TMyOpenDialog *opnd = new TMyOpenDialog(this);
И зачем "дублировать" создание объекта в строке 19 хэдера и строке 20 cpp-файла?
0
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
14.05.2015, 21:31  [ТС] 4
BRcr, попробовал добавить в файл реализации пишет что компилятор не может генерировать конструктор по умолчанию для класса 'TForm3::TMyOpenDialog'

Добавлено через 2 минуты
gunslinger, я в хидере не создаю объект *opnd а объявляю переменную в классе TForm3 TMyOpenDialog *opnd

Добавлено через 3 минуты
gunslinger, в классах главное в суть вникнуть в codeblock свои классы писал а в builder упираюсь из за не знания некоторых вещей среды разработки.
0
случайный прохожий
2312 / 1535 / 530
Регистрация: 20.07.2013
Сообщений: 4,326
14.05.2015, 21:31 5
я в хидере не создаю объект *opnd а объявляю переменную в классе TForm3 TMyOpenDialog *opnd
А чем это принципиально отличается?
Названия совпадают, твоя "переменная" не используется.
P.S.: я классы вообще не писал (к своему стыду), но живу как-то. Может, работа такая была, ООП не сильно требовалось, уже смутно помню.
1
4041 / 2330 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.05.2015, 21:36 6
Цитата Сообщение от Orakul Посмотреть сообщение
компилятор не может генерировать конструктор по умолчанию для класса 'TForm3::TMyOpenDialog'
C++
1
2
3
4
        class TMyOpenDialog : public TOpenDialog
         {
                  __fastcall TMyOpenDialog( TObject * a_owner ) : TOpenDialog( a_owner ){ }
         };
1
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
14.05.2015, 22:34  [ТС] 7
gunslinger, пардон что не то я выдал

Добавлено через 9 минут
BRcr, ну тогда актуально снова задать вопрос из заголовка : Разве класс наследник не должен наследовать коструктор и деструктор родителя?

Добавлено через 47 минут
BRcr, все равно ругается Could not find a match for 'TOpenDialog::TOpenDialog(TObject *) - не может найти соответствия для конструктора.
0
4041 / 2330 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
14.05.2015, 23:17 8
Orakul, конструктор и деструктор не наследуются, а вызываются последовательно по всей цепочке иерархии наследования. Можно проще, кстати. Вот так:
C++
1
2
3
4
5
        class TMyOpenDialog : public TOpenDialog
         {
                  public:
                  using TOpenDialog::TOpenDialog;
         };
Цитата Сообщение от Orakul Посмотреть сообщение
Could not find a match for 'TOpenDialog::TOpenDialog(TObject *)
Да. Там указатель на TComponent, а не на TObject, это я ошибся...
1
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
15.05.2015, 00:03  [ТС] 9
Так почему же тогда при попытке создать объект класа TMyOpenDialog
компилятор ругается что не может найти контруктор TMyOpenDialog
В книге написано если в родительском классе нет объектов библиотеки builder то достаточнно
команды : Мой_класс переменная_класса ,
если в классе присутствуют родители библиотеки builder то тогда команда -
Мой_класс *переменная_класса = new Мой_класс.
Я так же делаю компилятор ругается то не может найти контруктор TMyOpenDialog.

Хидер
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
#ifndef formH
#define formH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#pragma warn -aus
//---------------------------------------------------------------------------
class TForm3 : public TForm
{
__published:    // IDE-managed Components
    __fastcall TForm3(TComponent* Owner);
        class TMyOpenDialog : TOpenDialog
         {
            public:
                  using TOpenDialog::TOpenDialog;
                  TMyOpenDialog();
         };
};
//---------------------------------------------------------------------------
extern PACKAGE TForm3 *Form3;
//---------------------------------------------------------------------------
#endif
Реализация
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vcl.h>
#pragma hdrstop
 
#include "form.h"
#include "opendlg.h"
//---------------------------------------------------------------------------
#pragma warn -aus
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
    : TForm(Owner)
{
 
 
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32445 / 20940 / 8104
Регистрация: 22.10.2011
Сообщений: 36,204
Записей в блоге: 7
15.05.2015, 00:17 10
Чего там у тебя не находит? Все находит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TForm3 : public TForm
{
__published: // IDE-managed Components
private:
public :
    __fastcall TForm3(TComponent* Owner);
 
    class TMyOpenDialog : TOpenDialog // в public, а не в __published, иначе будешь периодически ловить internal error
    {
    public:
        using TOpenDialog::TOpenDialog;
        TMyOpenDialog();
    };
};
+
C++
1
2
3
4
5
6
7
8
9
10
// собственно, реализация конструктора
TForm3::TMyOpenDialog::TMyOpenDialog() : TOpenDialog(0)
{
    // ...
}
void __fastcall TForm3::FormCreate(TObject *Sender)
{
    TMyOpenDialog* opdlg = new TMyOpenDialog(); // и создание экземпляра
    // ...
}
1
4041 / 2330 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
15.05.2015, 00:27 11
Так работает, как и полагается:
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
class TForm1 : public TForm
{
__published: // IDE-managed Components
 
    TStringGrid * sgrid_1;
    TButton * btn_print;
    TButton * btn_1;
 
    void __fastcall btn_printClick( TObject * Sender );
    void __fastcall btn_1Click( TObject * Sender );
 
public: // User declarations
 
    class TMyOpenDialog : TOpenDialog
    {
    public:
        using TOpenDialog::TOpenDialog;
 
    private:
        __fastcall TMyOpenDialog( ) :
            TOpenDialog( 0 )
        {
        }
    } ;
 
    __fastcall TForm1( TComponent * Owner );
    __fastcall ~TForm1( );
} ;
C++
1
2
3
4
void __fastcall TForm1::btn_1Click( TObject * Sender )
{
    TMyOpenDialog * dlg( new TMyOpenDialog( this ) );
}
1
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
15.05.2015, 00:47  [ТС] 12
volvo, а откуда черпаете , если не секрет , информацию например ответ
opnDlg->OnClose = opndlgClose ; =Связываю событие OnClose с обработчиком opnDlgClose - будет точнее
из темы " Где лежат файлы реализации компонентов Rad Studio XE7"
у меня 4-ре книги 3 по builder но ни в одной такого не нашел , подскажите Ваши источники?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32445 / 20940 / 8104
Регистрация: 22.10.2011
Сообщений: 36,204
Записей в блоге: 7
15.05.2015, 00:56 13
Лучший ответ Сообщение было отмечено Orakul как решение

Решение

Мои источники - официальная документация на сайте производителя, исходники VCL/FMX, книги (в большинстве - англоязычные, переводной литературы мало, хорошей русскоязычной еще меньше), например серия Delphi Handbook, а также интернет-ресурсы (опять же, в основном англоязычные блоги разработчиков на Дельфи/Билдере и официальный форум Эмбаркадеро)
1
14 / 10 / 5
Регистрация: 07.07.2012
Сообщений: 171
15.05.2015, 01:01  [ТС] 14
Нехило
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2015, 01:01
Помогаю со студенческими работами здесь

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); ...

Создание класса –наследника
Не могли бы выложить любой пример в консольном режиме с использованием класса наследника. Заранее...

Создание своего Event для своего класса
как создать событие для своего класса? У C# нужно создать свое делегат, потом создать экземпляр...

Создание базового класса и наследника
в данной программе , попросили добавить в void main ///camera obj//// и дописать в конструктор...


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

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

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