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

Вопрос "События OnClick в MyClass"


MrAnderson

Вопрос

Добрый день.

Подскажите пожалуйста.

У меня есть класс который рисует кнопки и прочие объекты MyClass и при нажатие на кнопки берет некоторые свойства данного класса.

Вопрос такой почему в Windows срабатывает нажатие и выводит все что нужно а при компиляции под Андройд не происходит ни чего.

Что то я не совсем понимаю процесс работы.

Не судите строго только учусь.

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls,
  FMX.Layouts;


type
   TNotifyEvent = procedure (Sender: TObject) of object;

    MyType = class(TObject)
    MyButt:TButton;
    NGP:string;
   private
    function GetOnClick: TNotifyEvent;
    procedure SetOnClick(const Value: TNotifyEvent);
   public
    procedure ButtonClick(Sender: TObject);
    property OnButtonClick : TNotifyEvent Read GetOnClick Write SetOnClick;

    constructor Create(NewId:integer;NewNGP:string);
  end;

type
  TForm2 = class(TForm)
    Button1: TButton;
    VertScrollBox1: TVertScrollBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;

implementation

{$R *.fmx}

{ MyType }


procedure MyType.ButtonClick(Sender: TObject);
begin
 ShowMessage((Sender as TButton).Name+' NGP ['+NGP+']');

end;

constructor MyType.Create(NewId:integer;NewNGP:string);
Var RectForButt:TRectangle;
begin
  NGP:=NewNGP;

  RectForButt:= TRectangle.Create(nil);
  RectForButt.Parent := Form2.VertScrollBox1;
  RectForButt.Align := TAlignLayout.Top;
  RectForButt.Margins.Top:=2;
  RectForButt.Margins.Bottom:=0;
  RectForButt.Margins.Left:=0;
  RectForButt.Margins.Right:=0;
  RectForButt.Stroke.Kind:=TBrushKind.None;
  RectForButt.Fill.Kind:=TBrushKind.None;
  RectForButt.Height:=150;
  RectForButt.HitTest:=false;

  MyButt:=TButton.Create(Form2);
  MyButt.Parent:=RectForButt;
  MyButt.Align := TAlignLayout.Center;
  MyButt.Text:='Моя кнопка'+IntToSTr(NewId);
  MyButt.Name:='MyButton'+IntTOSTr(NewId);


  MyButt.OnClick:=ButtonClick;
end;

function MyType.GetOnClick: TNotifyEvent;
begin
 Result:=MyButt.OnClick;
end;

procedure MyType.SetOnClick(const Value: TNotifyEvent);
begin
 MyButt.OnClick:=Value;
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 MyType.Create(Random(1000),'ПРОСТОЕ '+IntToStr(Random(100)));
 MyType.Create(Random(1000),'СЛОЖНОЕ '+IntToStr(Random(100)));
end;

end.

Спасибо.

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

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

  • 0
20 минут назад, wamaco сказал:

Потому что под Android используйте onTap, а не onClick

 

Я конечно извиняюсь но OnClick тоже работает. В приведенном  пример как раз есть событие клик на кнопку которое создает кнопки.

И можно привести пример или исправить данный код что бы работало?

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

Не знаю почему но вот так заработало.

Может кто нибудь прояснить почему.

unit Unit2;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Objects, FMX.Controls.Presentation, FMX.StdCtrls,
  FMX.Layouts;


type
  TNotifyEvent = procedure (Sender: TObject) of object;
  TTapEvent = procedure(Sender: TObject; const Point: TPointF) of object;

  MyType = class //class(TObject)
    MyButt:TButton;

   private
    fNGP: string;
    function GetOnClick: TNotifyEvent;
    procedure SetOnClick(const Value: TNotifyEvent);

    function GetTapClick: TTapEvent;
    procedure SetTapClick(const Value: TTapEvent);
   public

     Property NGP:string read fNGP;

    procedure ButtonClick(Sender: TObject);
    procedure TapClick(Sender: TObject; const Point: TPointF);

    property OnButtonClick : TNotifyEvent Read GetOnClick Write SetOnClick;

     property OnTapClick : TTapEvent Read GetTapClick Write SetTapClick;
    constructor Create(NewId:integer;NewNGP:string);
  end;

type
  TForm2 = class(TForm)
    Button1: TButton;
    VertScrollBox1: TVertScrollBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form2: TForm2;
  myitem:array of MyType;

implementation

{$R *.fmx}

{ MyType }


procedure MyType.ButtonClick(Sender: TObject);
begin
 ShowMessage((Sender as TButton).Name +' NGP ['+self.fNGP+']');
end;

constructor MyType.Create(NewId:integer;NewNGP:string);
Var RectForButt:TRectangle;
begin
  fNGP:=NewNGP;
  RectForButt:= TRectangle.Create(nil);
  RectForButt.Parent := Form2.VertScrollBox1;
  RectForButt.Align := TAlignLayout.Top;
  RectForButt.Margins.Top:=2;
  RectForButt.Margins.Bottom:=0;
  RectForButt.Margins.Left:=0;
  RectForButt.Margins.Right:=0;
  RectForButt.Stroke.Kind:=TBrushKind.None;
  RectForButt.Fill.Kind:=TBrushKind.None;
  RectForButt.Height:=150;
  RectForButt.HitTest:=false;

  MyButt:=TButton.Create(Form2);
  MyButt.Width:=100;
  MyButt.Parent:=RectForButt;
  MyButt.HitTest:=true;
  MyButt.Align := TAlignLayout.Center;
  MyButt.Text:='Моя кнопка'+IntToSTr(NewId);
  MyButt.Name:='MyButton'+IntTOSTr(NewId);
  MyButt.TextSettings.Font.Size:=12;

  MyButt.OnClick:=self.OnButtonClick;
 // MyButt.OnTap:=self.OnTapClick;
end;

function MyType.GetOnClick: TNotifyEvent;
begin
 Result:=self.ButtonClick;
end;


function MyType.GetTapClick: TTapEvent;
begin
 Result:=self.TapClick;
end;

procedure MyType.SetOnClick(const Value: TNotifyEvent);
begin
 MyButt.OnClick:=value;
end;

procedure MyType.SetTapClick(const Value: TTapEvent);
begin
  MyButt.OnTap:=Value;
end;

procedure MyType.TapClick(Sender: TObject; const Point: TPointF);
begin
 ShowMessage((Sender as TButton).Name +' NGP ['+NGP+']');
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
 SetLength(myitem,Length(myitem)+1);
 myitem[Length(myitem)-1]:=MyType.Create(Random(1000),'ПРОСТОЕ '+IntToStr(Random(100)));
end;

end.

 

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

В первом примере, когда создаете наследника какого-либо класса (в вашем случае TObject), не забывайте наследовать параметры от родительского класса и переопределять базовые методы

Constructor Create(NewId:integer;NewNGP:string); overload;

 

constructor MyType.Create(NewId:integer;NewNGP:string);
Var RectForButt:TRectangle;
begin
    inherited Create;
......

 

Ссылка на комментарий
  • 0
17 часов назад, MrAnderson сказал:

Не знаю почему но вот так заработало.

Может кто нибудь прояснить почему.

 

Ну так заработало потому, что сделали, как я и подсказал, просто пробросили события Tap! ?

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

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

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

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

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

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

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

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

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

  • Последние посетители   0 пользователей онлайн

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