Перейти к содержанию
Fire Monkey от А до Я
  • 0

Возможно ли сделать сабкласс (subclass) стандартных компонентов?


baklanoid

Вопрос

Недавно начал изучать RAD Studio (C++Builder) и возник такой вопрос (из заголовка).

 

Нужно, например, добавить некий стандартный код ко всем кнопкам.

Если это возможно, дайте ссылку что почитать или объясните на пальцах - Спасибо!

 

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Вроде для дельфи есть "class helpers" (http://docwiki.embarcadero.com/RADStudio/XE7/en/Class_and_Record_Helpers_%28Delphi%29), но у меня на билдере код.

Изменено пользователем baklanoid
Ссылка на комментарий
  • 0

Думаю, нужно что-то вроде этого:

http://www.firststeps.ru/cbuilder/r.php?78

http://www.interface.ru/home.asp?artId=27410

Тут для старой версии IDE, но аналогию можно провести.

P.S.: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Creating_a_New_Component

Изменено пользователем magicxor
Ссылка на комментарий
  • 0

Думаю, нужно что-то вроде этого:

http://www.firststeps.ru/cbuilder/r.php?78

http://www.interface.ru/home.asp?artId=27410

Тут для старой версии IDE, но аналогию можно провести.

P.S.: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Creating_a_New_Component

 

Да, спасибо, похоже это то что нужно..

Ссылка на комментарий
  • 0

Вместо создания своих компонентов, можно воспользоваться таким трюком, который существует с незапамятных времен. На примере TEdit (используется в реальном проекте для ввода чисел - целых/дробных, положительных/отрицательных и не мешающий работе текстовых TEdit):

1. Создаем новый unit:

unit uCustomEditForNumbers;

interface

uses
  System.Classes,
  FMX.Types,
  FMX.Edit;

type
  TCustomEditForNumbers = class(FMX.Edit.TEdit)
  private
    FMaxLength: integer;
  protected
    procedure KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState); override;
  public
    property MaxLength: integer read FMaxLength write FMaxLength;
  end;

  TEdit = class(TCustomEditForNumbers) // а вот он и трюк - теперь TEdit это не FMX.Edit.TEdit
  end;                                 // а наш TCustomEditForNumbers 

implementation

uses
  System.SysUtils;

{ TCustomEditForNumbers }

procedure TCustomEditForNumbers.KeyDown(var Key: Word; var KeyChar: WideChar; Shift: TShiftState);
var
  bAllowed: Boolean;
  s: string;
  Ch: WideChar;
begin
  if FMaxLength > 0 then
    if Text.Length >= FMaxLength then
      if KeyChar <> #13 then
        KeyChar := #0;
  if KeyboardType = TVirtualKeyboardType.NumberPad then
    begin
      case Tag of
        0: // беззнаковые целые
          bAllowed := (KeyChar >= '0') and (KeyChar <= '9');
        1: // знаковые целые. Надо бы проверять и положение каретки.
          begin
            s := Text;
            bAllowed := ((KeyChar >= '0') and (KeyChar <= '9')) or //
              ((KeyChar = '-') and (CaretPosition = 0) and (not s.Contains('-')));
          end;
        2:
          begin // беззнаковые Float
            s := Text;
            Ch := TFormatSettings.Create.DecimalSeparator;
            bAllowed := ((KeyChar >= '0') and (KeyChar <= '9')) or //
              ((KeyChar = Ch) and (not s.Contains(Ch)));
          end;
        3: // знаковые Float
          begin
            s := Text;
            Ch := TFormatSettings.Create.DecimalSeparator;
            bAllowed := ((KeyChar >= '0') and (KeyChar <= '9')) or //
              ((KeyChar = '-') and (CaretPosition = 0) and (not s.Contains('-'))) or //
              ((KeyChar = Ch) and (not s.Contains(Ch)));
          end;
      else
        bAllowed := True;
      end;
      if not bAllowed then
        KeyChar := #0;
    end;

  inherited;
end;

2. В uses формы/фрейма подключаем этот unit после штатного FMX.Edit

 

Все. Новый функционал уже работает.

 

P.S. Хоть пример и на Delphi, а не C++, но суть от этого не меняется, думаю.

Изменено пользователем kami
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...