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

[XE7] [TEdit] [Отклонение] Не срабатывает событие OnClick у TEdit


d7d1cd

Вопрос

Привет всем.

 

Столкнулся то ли с багом XE7, то ли с не знанием. Проект FMX под Windows. На форме Edit1, создаю событие Edit1Click. При запуске приложения и щелчке на Edit1 событие Edit1Click не вызывается. В чем причина?

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

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

  • 0

Задам, наверное, последний вопрос в этой теме. Если создать свой компонент, унаследованный от TEdit, то применив "обходные пути", предложенные Ярославом, можно будет создать компонент TMyEdit, например, в котором событие OnClick будет работать из инспектора объектов. Правильно я рассуждаю?

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

 

Добрый день,

 

Это ошибка, ее устранили в будущей новой версии среды. Для обхода проблемы в других версиях среды, нужно использовать следующий подход:

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; // <-- программно задать свой обработчик
	}
}

 

Хорошо, что задали этот вопрос. Потому, что я вспомнил о более лаконичном и удобном решении. Чем тот, что я вам предложил.

В 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.

Где немного упоминается о новом подходе:

Для исправления, достаточно добавить этот файл в проект. Этого будет достаточно.

 

Проект: NewEditPresentation.zip

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

Ярослав, вновь спасибо. Однако у меня С++Builder и я не могу посмотреть предложенный Вами пример. А кроме этого, я уже как то нацелился сделать свой компонент. Конкретно - симбиоз TEdit и TLabel. Аналог TLabeledEdit в VCL. Получится у меня в создаваемом компоненте решить проблему "не кликабельности" TEdit-a?

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

Здравствуйте. Подскажите, в XE8 устранена проблема, являющаяся темой выше приведенного обсуждения? Проще: в XE8 событие OnClick у TEdit работает?

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

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

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

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

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

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

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

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

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

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