Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
 Аватар для dalay_lama
82 / 82 / 50
Регистрация: 22.09.2012
Сообщений: 495

Ошибка в коде. Пытаюсь создать собственный компонент

18.04.2013, 08:30. Показов 1585. Ответов 1
Метки нет (Все метки)

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

cpp файл:
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
//---------------------------------------------------------------------------
 
#include <vcl.h>
 
#pragma hdrstop
 
#include "NkEdit.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// ValidCtrCheck is used to assure that the components created do not have
// any pure virtual functions.
//
 
static inline void ValidCtrCheck(TNkEdit *)
{
    new TNkEdit(NULL);
}
//---------------------------------------------------------------------------
__fastcall TNkEdit::TNkEdit(TComponent* Owner)
    : TEdit(Owner)
{
    Text = "";
 
    FOnlyPositive = true;
    FMaxLenInt = 6;
    FMaxLenFrac = 2;
    FNext = NULL;
}
//---------------------------------------------------------------------------
namespace Nkedit
{
    void __fastcall PACKAGE Register()
    {
        TComponentClass classes[1] = {__classid(TNkEdit)};
        RegisterComponents(L"Standard", classes, 0);
    }
}
 
//возвращает значение своства value
float __fastcall TNkEdit::GetValue()
{
    if ( Text.Length() )
        return StrToFloat(Text);
    else
        return 0;
}
 
//устанавливает значение своства value
void __fastcall TNkEdit::SetValue( float v)
{
    Text = FloatToStr(v);
}
 
//обработка события KeyPress в поле компонента NkEdit
void __fastcall TNkEdit::KeyPress(char &Key)
{
    int p;//позиция DecimalSeparator
    int n;
 
    //коды запрещённых клавишь заменим нулём
    switch (Key) {
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
                        p = Text.Pos(DecimalSeparator);
                        if (( p==0 ) || ( SelStart < p)) {
                            //Цифра целой части.
                            //Определим сколько цифр уже введено
                            if (p==0) {
                                n = Text.Length();
                            }
                                else n = p-1;
                            if ((n>0) && (Text[1] == '-')) {
                                n--;
                            }
                            if ( n == FMaxLenInt) {
                                Key = 0;
                            }
                        }
                        else {
                            //цифра дробной части
                            n = Text.Length()-p;
                            if (n==MaxLenFrac) {
                                Key = 0
                            }
                        }
                        break;
            case '.':
            case ',':
                        Key = DecimalSeparator;
                        if (Text.Pos(DecimalSeparator) != 0){
                            Key = 0;
                        }
                        break;
 
            case '-':   if ((FOnlyPositive) || (SelStart > 0)) {
                            Key = 0;
                        }
 
            case VK_RETURN:
                        if ( Next != NULL){
                            FNext->SetFocus();
                        }
 
            case VK_BACK:
                        break;
 
            default://остальные символы
                        Key = 0;
                ;
            }
            TEdit::KeyPress(Key);
}
//---------------------------------------------------------------------------
И header:
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
//---------------------------------------------------------------------------
 
#ifndef NkEditH
#define NkEditH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE TNkEdit : public TEdit
{
private:
    //поля, хранят значения свойств
    bool FOnlyPositive; //true - отрицательное число ввести нельзя
    int FMaxLenInt;     //Допустимое количество цифр целой части
    int FMaxLenFrac;    //Допустимое количество цифр дробной части
    TWinControl *FNext; /*компонент, на который будет установлен
                        фокус в результате нажатия <Enter>*/
 
    //функции, используются для вычисления и установки значений своств
    void __fastcall SetValue( float value);//устанавливает значения свойства Value
    float __fastcall GetValue(void);//возвращает значение свойства Value
 
protected:
 
public:
    //конструктор
    __fastcall TNkEdit(TComponent* Owner);
 
    //свойства, объявленные в секции public, в Object Inspector не отображаются
    __property float Value = { read = GetValue, write = SetValue };
    //функция обработки события KeyPress
    DYNAMIC void __fastcall KeyPress( char & Key);
 
__published:
    //свойства, объявленные в секции published, отображаются Object Inspector
    __property bool OnlyPositive = { read = FOnlyPositive, write = FOnlyPositive };
    __property int MaxLenInt = { read = FMaxLenInt, write = FMaxLenInt };
    __property int MaxLenFrac = { read = FMaxLenFrac, write = FMaxLenFrac };
    __property TWinControl * Next = { read = FNext, write = FNext };
};
//---------------------------------------------------------------------------
#endif
Делал всё по учебнику, 10 раз перепроверил, всё точно также как и в учебнике написанно, но тем не менее выдаёт ошибки компиляции:
Code
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
bcc32 command line for "NkEdit.cpp"
  c:\program files (x86)\embarcadero\rad studio\8.0\bin\bcc32.exe -D_DEBUG -D_RTLDLL;USEPACKAGES -n.\Debug\Win32 -I"C:\Program Files 
  (x86)\Embarcadero\RAD Studio\8.0\include\boost_1_39\boost\tr1\tr1";"C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\include\boost_1_39";"c:\program 
  files (x86)\embarcadero\rad studio\8.0\include";"c:\program files (x86)\embarcadero\rad studio\8.0\include\windows\crtl";"c:\program files 
  (x86)\embarcadero\rad studio\8.0\include\dinkumware";"c:\program files (x86)\embarcadero\rad studio\8.0\include\windows\sdk";"c:\program files 
  (x86)\embarcadero\rad studio\8.0\include\windows\rtl";"c:\program files (x86)\embarcadero\rad studio\8.0\include\windows\vcl";"C:\Program Files 
  (x86)\Raize\CS4\Lib\RS-XE";"c:\program files (x86)\embarcadero\rad studio\8.0\RaveReports\Lib" -y -Q -k -r- -c -tM -tU -tW -C8 
  -o.\Debug\Win32\NkEdit.obj -w-par -Od -v -vi- -H=.\Debug\Win32\TestPrNkEdit.pch -H NkEdit.cpp 
[BCC32 Warning] NkEdit.h(42): W8022 '_fastcall TNkEdit::KeyPress(char &)' hides virtual function '_fastcall TWinControl::KeyPress(wchar_t &)'
  Full parser context
    NkEdit.cpp(7): #include NkEdit.h
    NkEdit.h(11): class TNkEdit
[BCC32 Warning] NkEdit.cpp(72): W8111 Accessing deprecated entity 'DecimalSeparator' Use FormatSettings.DecimalSeparator
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
[BCC32 Error] NkEdit.cpp(92): E2379 Statement missing ;
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
[BCC32 Warning] NkEdit.cpp(97): W8111 Accessing deprecated entity 'DecimalSeparator' Use FormatSettings.DecimalSeparator
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
[BCC32 Warning] NkEdit.cpp(98): W8111 Accessing deprecated entity 'DecimalSeparator' Use FormatSettings.DecimalSeparator
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
[BCC32 Error] NkEdit.cpp(119): E2357 Reference initialized with 'char', needs lvalue of type 'wchar_t'
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
[BCC32 Error] NkEdit.cpp(119): E2342 Type mismatch in parameter 'Key' (wanted 'wchar_t &', got 'char')
  Full parser context
    NkEdit.cpp(56): parsing: void _fastcall TNkEdit::KeyPress(char &)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.04.2013, 08:30
Ответы с готовыми решениями:

Создать собственный компонент для отображения таблицы
Стоит задача реализовать загрузку постов. Не нашел стандартной компоненты для формы для отображения. Похоже придется писать собственную...

Как создать свой собственный компонент для rad studio?
Доброго времени суток. Столкнулся с проблемой создания собственных компонентов, так как понятия не имею с чего начать. Подскажите...

Пытаюсь написать свой собственный slideUp
Здравствуйте всем. jQuery - это, конечно, круто, но решил попробовать кое-что сделать самостоятельно. Значит, что мы хочим: пока просто без...

1
 Аватар для Lelik-pahan
1703 / 899 / 207
Регистрация: 25.11.2009
Сообщений: 1,848
18.04.2013, 09:12
[BCC32 Error] NkEdit.cpp(92): E2379 Statement missing ;
в cpp фвайле в строке 92 после Key = 0 не хватает ;

над 119 строкой надо подумать...

Добавлено через 15 минут
у вас в функции TEdit::KeyPress() ожидается параметр wchar_t &Key, а вы передаёте char.
Чтоб не мучаться с преобразованиями, думаю, вам проще в своей функции переопределить тип параметра Key как wchar_t...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.04.2013, 09:12
Помогаю со студенческими работами здесь

Пытаюсь создать базу данных, но выдается ошибка
Пытаюсь создать базу данных, но выдается ошибка? Проверил права пользователя, но никаких разрешений или запрещений на создание баз не...

Я пытаюсь создать генератор ключей, но в нём ошибка
Вот мой код: procedure KeyGeneration; const (*Русские символы для генератора ключа*) russymbolsgenerator: array of string...

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

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

Пытаюсь создать базу данных через EF core но выскакивает ошибка
Вот вся программка using System; using Microsoft.EntityFrameworkCore; using System.Linq; namespace ConsoleApp2 { ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru