• 0
Авторизация  
MrAnderson

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

Вопросы

Добрый день.

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

У меня есть класс который рисует кнопки и прочие объекты 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.

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 ответов на этот вопрос

  • 0

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 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

Спасибо за ответы. Тему можно закрывать.

Изменено пользователем MrAnderson

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
17 часов назад, MrAnderson сказал:

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация  

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

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