C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Событие нажатия на Enter  (Прочитано 2266 раз)
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Событие нажатия на Enter
« : 24 Июнь 2013, 09:16:24 »

Здравствуйте великоуважаемые гуру программирования. Сегодня я хотел задать вам вопрос по поводу создания своего отдельного события видимого в ObjectInspector. А именно событие нажатия на клавишу Enter в компоненте TEdit.
вот код

#include "Enter.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(TEnter *)
{
        new TEnter(NULL);
}
//---------------------------------------------------------------------------
__fastcall TEnter::TEnter(TComponent* Owner)
        : TLabeledEdit(Owner)
{
   Text = "0";
   FMin = 0;
   FMax = 100;
   FEnableFloat = true;
   EditLabel->Caption = this->Name;
}
//---------------------------------------------------------------------------
namespace Enter
{
        void __fastcall PACKAGE Register()
        {
                 TComponentClass classes[1] = {__classid(TEnter)};
                 RegisterComponents("Samples", classes, 0);
        }
}
//---------------------------------------------------------------------------
void __fastcall TEnter::SetNumb(float n)
{
 Text = FloatToStr(n);
}
float __fastcall TEnter::GetNumb(void)
{
 if (Text.Length())
  return StrToFloat(Text);
 else return 0;
}
void __fastcall TEnter::KeyPress(char &Key)
{
if (Text=="0" && Key!=DecimalSeparator && Key!=VK_RETURN)
Text = "";
 switch (Key)
  {
   case '0':
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9': break;
   case '.':
   case ',':
    Key = DecimalSeparator;
    if (Text.Pos(DecimalSeparator) || (!FEnableFloat))
    Key = 0;
   break;
  case '-':
           if (Text.Length() || (FMin>=0))
           Key = 0;
           break;
  case VK_BACK:
             break;
  // Клавиша Enter
  case VK_RETURN:
  {
  FOnEnterPress;
  }
             break;
  default : Key = 0;
  }
  if ((Key>='0') && (Key   {
  /* Проверим, не приведет ли ввод очередной цифры
  к выходу числа за границы диапазона. Если да,
  то заменим введенное число на максимальное или минимальное*/
   AnsiString st = Text+Key;
  if (StrToFloat(st)       {
       Key = 0;
       Text = FloatToStr(FMin);
      }
  if (StrToFloat(st)>FMax)
      {
       Key = 0;
       Text = FloatToStr(FMax);
      }
  }
  TLabeledEdit::KeyPress(Key);
}
// Установка значения поля FMin
bool __fastcall TEnter::SetMin(float min)
{
   if (min>FMax) return false;
   FMin = min;
   return true;
}
bool __fastcall TEnter::SetMax(float max)
{
 if (max  FMax = max;
 return true;
}




//---------------------------------------------------------------------------

#ifndef EnterH
#define EnterH
//---------------------------------------------------------------------------
#include
#include
#include
#include
#include
//typedef void __fastcall(__closure *TOnEnterPress)(TObject* Sender);
//---------------------------------------------------------------------------
class PACKAGE TEnter : public TLabeledEdit
{
private:
int FNumImit; // номер имитатора
int FNumWord; // номер слова
int FLowCh; // младший разряд
int FHighCh; // старший разряд
int Fitemp1; // 1 доп переменная типа integer
int Fitemp2; // 2 доп переменная типа integer
float Fftemp; // 3 доп переменая типа float
bool FEnableFloat; // разрешен ввод дробного числа
float FMin; // нижняя граница
float FMax; // верхняя граница
  /* Функция SetNumb использууется для изменения содержимого
     роля редактирования*/
void __fastcall SetNumb(float n);
  /* Функция GetNumb используется для доступа к полю редактирования */
float __fastcall GetNumb (void);
  /* Эти функции обеспечивают изменение границ диапазона
    допустимых значений*/
bool __fastcall SetMin(float min);
bool __fastcall SetMax(float max);
// Событие нажатия на Enter
TNotifyEvent FOnEnterPress;
//TOnEnterPress FOnEnterPress;
protected:
public:
        __fastcall TEnter(TComponent* Owner);
__property float Numb = {read = GetNumb, write = SetNumb};
// Функция обработки события KeyPress
DYNAMIC void __fastcall KeyPress(char &Key);
__published:
// Здесь объявляются свойства доступные в Object Inspector
__property int   NumImit = {read = FNumImit, write = FNumImit};
__property int   NumWord = {read = FNumWord, write = FNumWord};
__property int   LowCh = {read = FLowCh, write = FLowCh};
__property int   HighCh = {read = FHighCh, write = FHighCh};
__property int   itemp1 = {read = Fitemp1, write = Fitemp1};
__property int   itemp2 = {read = Fitemp2, write = Fitemp2};
__property float ftemp = {read = Fftemp, write = Fftemp};
__property bool  EnableFloat = {read = FEnableFloat, write = FEnableFloat};
__property float Min = {read = FMin, write = SetMin};
__property float Max = {read = FMax, write = SetMax};
__property TNotifyEvent OnEnterPress = {read=FOnEnterPress, write=FOnEnterPress};
};
//---------------------------------------------------------------------------
#endif
(Честно скажу код позаимствовал из книги Культина и малость его подработал под свои нужды)

Жму на энтер и не работает. Помогите плиз
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Событие нажатия на Enter
« Ответ #1 : 24 Июнь 2013, 14:17:22 »

1. По поводу такого простого события, как нажатие на Ввод, я не стал бы писать свой компонент. Зачем?
2. В коде у тебя в классе объявлено событие FOnEnterPress. Во-первых, в конструкторе надо его инициализировать (нулевым указателем). Во-вторых, вызывать событие надо так:
Код
if(FOnEnterPress) FOnEnterPress(this);
И самое главное - какой код у тебя в обрвботчике события OnEnterPress?
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Событие нажатия на Enter
« Ответ #2 : 25 Июнь 2013, 09:29:11 »

Так попробуем))) Компонент нужен для прог всяческих вбиваешь туда число ввод при этом проверяется и потом чтоб на форму кнопку не ставить просто Enter нажал и воля
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Событие нажатия на Enter
« Ответ #3 : 25 Июнь 2013, 09:30:43 »

А код в обработчике тот который пользователь-программист напишет при использовании
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Событие нажатия на Enter
« Ответ #4 : 25 Июнь 2013, 12:00:31 »

Спасибо за подсказку))) достаточно было добавить if(FOnEnterPress) FOnEnterPress(this);  а конструктор можно не трогать
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


Re: Событие нажатия на Enter
« Ответ #5 : 25 Июнь 2013, 15:55:42 »

Цитата: Sergey1985 от 25 Июнь 2013, 12:00:31
Спасибо за подсказку))) достаточно было добавить if(FOnEnterPress) FOnEnterPress(this);  а конструктор можно не трогать

в классе не должно быть неинициализированных указателей (да и вообще членов).
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Событие нажатия на Enter
« Ответ #6 : 26 Июнь 2013, 08:38:57 »

Инициализировать нулевым указателем это написать такую строчку?  FOnEnterPress(NULL); или как?
Записан
S0mbre
Глобальный модератор


Сказали спасибо: +1113/-22
Offline

Сообщений: 2132

S0mbre


« Ответ #7 : 26 Июнь 2013, 21:07:24 »

Цитата: Sergey1985 от 26 Июнь 2013, 08:38:57
Инициализировать нулевым указателем это написать такую строчку?  FOnEnterPress(NULL); или как?

В конструкторе класса проще (и правильнее) использовать список инициализации, например
Код
class TMyClass
{
private:
  TNotifyEvent FOnEnterPress;
  int x;
  String s;
public:
  __fastcall TMyClass();
};
 
__fastcall TMyClass::TMyClass() :
/*инициализация переменных*/ FOnEnterPress(NULL), x(0), s("Hello world")
{
}
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.13 секунд. Запросов: 21.