Перейти к содержанию
  • Регистрация
  • 0
Авторизация  
baklanoid

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

Вопрос

Недавно начал изучать 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 эмодзи.

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

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

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

Авторизация  

  • Похожий контент

    • От Pulsarius
      Всем привет! У меня такой вопрос. Я настроил порядок сортировки групп компонентов в Tool Palette через Tools -> Options -> Environment Options -> Component Toolbar, но при сохранении настроек и перезапуске студии никаких изменений в Tool Palette не наблюдается, всё равно остаётся дефолтная сортировка. RAD Studio Berlin.
    • От ruslan
      Подскажите, знает ли кто как в FMX использовать свой шрифт не устанавливая его в в систему ?
      под vcl было что-то вроде:
      procedure LoadFont;   var     MyResStream: TResourceStream;   begin     MyResStream:= GetResStream('MyFont');     MyResStream.SavetoFile('MyFont.ttf');     AddFontResource(PChar('MyFont.ttf'));     SendMessage(HWND_BROADCAST, WM_FONTCHANGE,0,0);   end;   procedure UnLoadFont;   begin     RemoveFontResource('MyFont.ttf') ;     SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0) ;   end; в фаирманках, что удивительно(сарказм),  этот не работает. 
      как я понимаю, шрифты подгружаются в момент запуска приложения, и рисуются средствами gdi...
       
      хотел поправить юнит FMX.FontGlyphs.Win по аналогии с http://delphifmandroid.blogspot.com/2015/01/true-type.html
      но TWinFontGlyphManager даже не создается( дебагер не попадает в конструктор ).
       
      вопрос: как решить эту маленькую проблему ?
       
       
    • От ruslan
      Добрый день. Подскажите, может кто-нибудь в курсе...
      Как сделать свой выпадающий редактор свойства в инспекторе объектов, наподобие выбора стиля в StyleLookup. 
      Там отображается иконка стиля слева. Или например как выбор цвета. Там отображается иконка с цветом.
      Допустим у меня будет свой перечисляемый тип:
      TMyType = (v1, v2, v3);
      Как отобразить в инспекторе, в выпадающем списке, ассоциированное со значением свойство( в моем случае текст слева, т.е. итем выпадающего списка должен состоять из текста(как я понимаю лейбла) с выравниванием по левому краю( как иконка цвета, миниатюра стиля) , и самим значением перечисляемого типа(как это стандартно и работает) ) ?
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

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