Вместо создания своих компонентов, можно воспользоваться таким трюком, который существует с незапамятных времен. На примере 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++, но суть от этого не меняется, думаю.
Думаю, нужно что-то вроде этого:
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