MrAnderson Опубликовано 3 ноября, 2018 Поделиться Опубликовано 3 ноября, 2018 Добрый день. Подскажите пожалуйста. У меня есть класс который рисует кнопки и прочие объекты 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 #WAMACO Опубликовано 3 ноября, 2018 Поделиться Опубликовано 3 ноября, 2018 Потому что под Android используйте onTap, а не onClick Цитата Ссылка на комментарий
0 MrAnderson Опубликовано 3 ноября, 2018 Автор Поделиться Опубликовано 3 ноября, 2018 20 минут назад, wamaco сказал: Потому что под Android используйте onTap, а не onClick Я конечно извиняюсь но OnClick тоже работает. В приведенном пример как раз есть событие клик на кнопку которое создает кнопки. И можно привести пример или исправить данный код что бы работало? Цитата Ссылка на комментарий
0 MrAnderson Опубликовано 3 ноября, 2018 Автор Поделиться Опубликовано 3 ноября, 2018 Не знаю почему но вот так заработало. Может кто нибудь прояснить почему. 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 Alex7wrt Опубликовано 3 ноября, 2018 Поделиться Опубликовано 3 ноября, 2018 В первом примере, когда создаете наследника какого-либо класса (в вашем случае TObject), не забывайте наследовать параметры от родительского класса и переопределять базовые методы Constructor Create(NewId:integer;NewNGP:string); overload; constructor MyType.Create(NewId:integer;NewNGP:string); Var RectForButt:TRectangle; begin inherited Create; ...... MrAnderson 1 Цитата Ссылка на комментарий
0 MrAnderson Опубликовано 3 ноября, 2018 Автор Поделиться Опубликовано 3 ноября, 2018 (изменено) Спасибо за ответы. Тему можно закрывать. Изменено 3 ноября, 2018 пользователем MrAnderson Цитата Ссылка на комментарий
0 #WAMACO Опубликовано 4 ноября, 2018 Поделиться Опубликовано 4 ноября, 2018 17 часов назад, MrAnderson сказал: Не знаю почему но вот так заработало. Может кто нибудь прояснить почему. Ну так заработало потому, что сделали, как я и подсказал, просто пробросили события Tap! Цитата Ссылка на комментарий
Вопрос
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.
Спасибо.
Ссылка на комментарий
6 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.