Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переопредлить событие компоненты, Переопредлить событие компоненты 
:(
    Опции темы
gAlexKo
Дата 17.5.2018, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Допустим нужна компонента типа TRichEdit где событие OnKeyPress работает по особому.
Я создаю компоненту из TRichEdit где хочу переопределить метод OnKeyPress


Код

//В заголовке моей компоненты
class PACKAGE AKRichEdit : public TRichEdit
{
private:
protected:
public:
        __fastcall AKRichEdit(TComponent* Owner);
        void __fastcall OnKeyPress(TObject *Sender, char &Key);
__published:
};
//---------------------------------------------------------------------------

//В модуле моей компоненты
static inline void ValidCtrCheck(AKRichEdit *)
{
     new AKRichEdit(NULL);
}
//---------------------------------------------------------------------------
__fastcall AKRichEdit::AKRichEdit(TComponent* Owner)
        : TRichEdit(Owner)
{
}
//---------------------------------------------------------------------------
namespace Akrichedit_comp
{
        void __fastcall PACKAGE Register()
        {
           TComponentClass classes[1] = {__classid(AKRichEdit)};
           RegisterComponents("Samples", classes, 0);
        }
}
//---------------------------------------------------------------------------
void __fastcall AKRichEdit::OnKeyPress(TObject *Sender, char &Key)
{
 ShowMessage("test");
 TRichEdit::OnKeyPress(Sender, Key);
}
//---------------------------------------------------------------------------



Я бросаю свою новую компоненту на форму (AKRichEdit1), компилирую, запускаю, но при нажатии на AKRichEdit1 не происходит вызова переопределенной функции. Подскажите, что я делаю не так?

Это сообщение отредактировал(а) gAlexKo - 18.5.2018, 15:09
PM MAIL   Вверх
gAlexKo
Дата 18.5.2018, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Нашел способ с установкой в своей компоненте MESSAGE_MAP, но в этом случае не получается возвратить обработку самому TRichEdit.



Код



class PACKAGE AKRichEdit : public TRichEdit
{
private:
protected:

  void __fastcall WmRButtonDown(TWMRButtonDown& Msg);
  void __fastcall WmSysKeyDown(TWMSysKeyDown& Msg);
  void __fastcall WmKeyDown(TWMKeyDown& Msg);

public:
        __fastcall AKRichEdit(TComponent* Owner);

BEGIN_MESSAGE_MAP
                                       /*messages.hpp*/  /*call*/
     // MESSAGE_HANDLER(WM_RBUTTONDOWN, TWMRButtonDown, WmRButtonDown)  //правю кн. мыши
      MESSAGE_HANDLER(WM_SYSKEYDOWN,    TWMSysKeyDown,    WmSysKeyDown) //альт
      MESSAGE_HANDLER(WM_KEYDOWN,    TWMKeyDown,    WmKeyDown)          //клавиши
END_MESSAGE_MAP(TRichEdit);
__published:

};
//--



#include "AKRichEdit_comp.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------

static inline void ValidCtrCheck(AKRichEdit *)
{
     new AKRichEdit(NULL);
}
//---------------------------------------------------------------------------
__fastcall AKRichEdit::AKRichEdit(TComponent* Owner)
        : TRichEdit(Owner)
{
}
//---------------------------------------------------------------------------
namespace Akrichedit_comp
{
        void __fastcall PACKAGE Register()
        {
           TComponentClass classes[1] = {__classid(AKRichEdit)};
           RegisterComponents("Samples", classes, 0);
        }
}
//---------------------------------------------------------------------------
/*void __fastcall AKRichEdit::OnKeyPress(TObject *Sender, char &Key)
{
 ShowMessage("test");
 TRichEdit::OnKeyPress(Sender, Key);
 return;
} */
//---------------------------------------------------------------------------
void __fastcall AKRichEdit::WmRButtonDown(TWMRButtonDown& Msg)
{
 ShowMessage("WmRButtonDown");
}
//---------------------------------------------------------------------------
void __fastcall AKRichEdit::WmSysKeyDown(TWMSysKeyDown& Msg)
{
 //ShowMessage("WmSysKeyDown");
}
//---------------------------------------------------------------------------
void __fastcall AKRichEdit::WmKeyDown(TWMKeyDown& Msg)
{
 //ShowMessage("WmKeyDown");
}
//---------------------------------------------------------------------------




Это сообщение отредактировал(а) gAlexKo - 18.5.2018, 15:17
PM MAIL   Вверх
gAlexKo
  Дата 21.5.2018, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 23.3.2011

Репутация: нет
Всего: нет



Спасибо всем, за стимулирующе молчание - задача решена.  smile Для переопределения события я использовал переопределение Dispatch в моей компоненте:

Код

//---------------------------------------------------------------------------
#ifndef AKRichEdit_compH
#define AKRichEdit_compH
//---------------------------------------------------------------------------
#include <SysUtils.hpp>
#include <Classes.hpp>
#include <ComCtrls.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
//---------------------------------------------------------------------------
class PACKAGE AKRichEdit : public TRichEdit
{
private:
protected:
public:
        __fastcall AKRichEdit(TComponent* Owner);
   void __fastcall Dispatch(void* message);

__published:

};
//---------------------------------------------------------------------------
#endif







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

#include <vcl.h>

#pragma hdrstop

#include "AKRichEdit_comp.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
static inline void ValidCtrCheck(AKRichEdit *)
{
     new AKRichEdit(NULL);
}
//---------------------------------------------------------------------------
__fastcall AKRichEdit::AKRichEdit(TComponent* Owner)
        : TRichEdit(Owner)
{
}
//---------------------------------------------------------------------------
namespace Akrichedit_comp
{
        void __fastcall PACKAGE Register()
        {
           TComponentClass classes[1] = {__classid(AKRichEdit)};
           RegisterComponents("Samples", classes, 0);
        }
}
//---------------------------------------------------------------------------
void __fastcall AKRichEdit::Dispatch(void* message)
    {
    TMessage *me = (TMessage*)message;

    if(me->Msg == WM_KEYDOWN)
      {
    //  ShowMessage("me->Msg == WM_KEYDOWN");   //test
      }

    TRichEdit::Dispatch(message);
    }
//---------------------------------------------------------------------------

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.1185 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.