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

baklanoid

Пользователи
  • Постов

    4
  • Зарегистрирован

  • Посещение

Активность репутации

  1. Like
    baklanoid отреагировална kami в Возможно ли сделать сабкласс (subclass) стандартных компонентов?   
    Вместо создания своих компонентов, можно воспользоваться таким трюком, который существует с незапамятных времен. На примере 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++, но суть от этого не меняется, думаю.
  2. Like
    baklanoid отреагировална magicxor в Возможно ли сделать сабкласс (subclass) стандартных компонентов?   
    Думаю, нужно что-то вроде этого:
    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
×
×
  • Создать...