Хорошо, что задали этот вопрос. Потому, что я вспомнил о более лаконичном и удобном решении. Чем тот, что я вам предложил.
В XE7 был переведен на MVC модель. В итоге, TEdit позволяет не создавая наследников менять и дополнять работу TEdit. Идея простая, у TEdit есть несколько представлений, которые полностью осуществляют работу TEdit. Чтобы исправить это отклонение, нужно создать новое представление и заменить текущей TStyledEdit на новое, исправленное:
unit FMX.Edit.MyStyle;
interface
uses
FMX.Edit.Style, FMX.Controls.Presentation, System.UITypes, System.Classes;
type
// Новое представление - расширение текущего
TMyStyledEdit = class(TStyledEdit)
protected
procedure MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override;
end;
// Промежуточный класс
TMyStyledEditProxy = class(TPresentationProxy)
protected
function CreateReceiver: TObject; override;
end;
implementation
uses
System.SysUtils, FMX.Presentation.Factory, FMX.Types;
{ TMyStyledEditProxy }
function TMyStyledEditProxy.CreateReceiver: TObject;
begin
Result := TMyStyledEdit.Create(nil);
end;
{ TMyStyledEdit }
procedure TMyStyledEdit.MouseClick(Button: TMouseButton; Shift: TShiftState; X, Y: Single);
var
Control: IControl;
begin
inherited;
if Supports(PresentedControl, IControl, Control) then
Control.MouseClick(Button, Shift, X, Y);
end;
initialization
// Для всех TEdit удаляем базовое представление
TPresentationProxyFactory.Current.Unregister('Edit-Style');
// Для всех TEdit регистрируем наше представление
TPresentationProxyFactory.Current.Register('Edit-Style', TMyStyledEditProxy);
finalization
// Восстанавливаем старое представление Edit
TPresentationProxyFactory.Current.Unregister('Edit-Style');
TPresentationProxyFactory.Current.Register('Edit-Style', TStyledEditProxy);
end.
Где немного упоминается о новом подходе:
Нативные элементы управления
Куда пропали методы DoChangeTracking и Change?
Для исправления, достаточно добавить этот файл в проект. Этого будет достаточно.
Это ошибка, ее устранили в будущей новой версии среды. Для обхода проблемы в других версиях среды, нужно использовать следующий подход:
var
StyledPresentation: TStyledControl;
begin
StyledPresentation := nil;
if Edit1.HasPresentationProxy then
StyledPresentation := Edit1.PresentationProxy.Receiver as TStyledControl;
if StyledPresentation <> nil then
StyledPresentation.OnClick := Edit1Click; // <-- программно задать свой обработчик
end;
Код для С++ Builder:
void __fastcall TForm2::FormCreate(TObject *Sender)
{
TStyledControl* styledPresentation;
if (Edit1->HasPresentationProxy()) {
styledPresentation = dynamic_cast<TStyledControl*>(Edit1->PresentationProxy->Receiver);
styledPresentation->OnClick = Edit1Click; // <-- программно задать свой обработчик
}
}