Zyablik3000 Опубликовано 16 октября, 2018 Поделиться Опубликовано 16 октября, 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.Controls.Presentation, FMX.ScrollBox, FMX.StdCtrls; type TScrBox = class(TPresentedScrollBox) public constructor Create(AOwner: TComponent); override; procedure Paint; override; end; TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } FContentChange: TNotifyEvent; public { Public declarations } end; var Form2: TForm2; implementation {$R *.fmx} { TScrBox } constructor TScrBox.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TScrBox.Paint; begin inherited; Canvas.DrawDashRect(LocalRect, 0, 0, AllCorners, 1, TAlphaColorRec.Red); end; procedure TForm2.Button1Click(Sender: TObject); var ScrBox: TScrBox; Pnl: TPanel; begin ScrBox:=TScrBox.Create(Self); ScrBox.Parent:=Self; ScrBox.AutoCalculateContentSize:=False; ScrBox.ContentSize.Width:=1000; ScrBox.ContentSize.Height:=1000; Pnl:=TPanel.Create(ScrBox); Pnl.Parent:=ScrBox; Pnl.Position.X:=10; Pnl.Position.Y:=10; end; end. Однако, вопреки ожиданиям, при клике на Button1 получаю Ни скроллбаров, ни панельки внутри ScrBox. Подскажите, что не так? Как правильно унаследоваться от TPresentedScrollBox? Цитата Ссылка на комментарий
0 Barbanel Опубликовано 16 октября, 2018 Поделиться Опубликовано 16 октября, 2018 А если панельке задать высоту в 2000 пикселей, скролл появляется? Цитата Ссылка на комментарий
0 Zyablik3000 Опубликовано 16 октября, 2018 Автор Поделиться Опубликовано 16 октября, 2018 41 минуту назад, Barbanel сказал: А если панельке задать высоту в 2000 пикселей, скролл появляется? Нет, не появляется. Цитата Ссылка на комментарий
0 rareMax Опубликовано 16 октября, 2018 Поделиться Опубликовано 16 октября, 2018 (изменено) зачем скролл - если нечего скроллить? кинь в скроллбокс компонент, который будет пересекать границу родителя - и будет тебе скролл Изменено 16 октября, 2018 пользователем rareMax Цитата Ссылка на комментарий
0 Zyablik3000 Опубликовано 16 октября, 2018 Автор Поделиться Опубликовано 16 октября, 2018 (изменено) Как нечего? А TPanel? У неё же parent:=scrollbox. Если не наследовать, а просто бросить на форму TPresentedScrollBox и задать contentsize и autocalculatecontentsize=false, то все норм. И скроллбары и скроллинг есть. Изменено 16 октября, 2018 пользователем Zyablik3000 Знаки припинания Цитата Ссылка на комментарий
2 Zyablik3000 Опубликовано 17 октября, 2018 Автор Поделиться Опубликовано 17 октября, 2018 Всем спасибо) Решение нашел сам. Прочитав http://yaroslavbrovin.ru/new-approach-of-development-of-firemonkey-control-control-model-presentation-part-1-ru/ и другие материалы с этой странички (к слову: жутко полезная информация) перекрыл в своем компоненте функцию function DefinePresentationName: string; override; function TScrBox.DefinePresentationName: string; begin Result:='PresentedScrollBox-style'; end; Дело оказалось в том, что не загружалась презентация для моего компонента (а модель создавалась), точнее пыталась загрузиться презентация 'ScrBox-style', прокси для которой не зарегистрирован. Ведь имя презентации формировалось как 'Имя класса' + '-style' Но этого оказалось недостаточно. Еще понадобилось задать свойство StyleLookup:='scrollboxstyle'; т.к. скроллбары и прочие контролы берутся из стиля TStyledCustomScrollBox'а, который описан в FMX.ScrollBox.Style. Надеюсь кому-то поможет, и этот кто-то не будет как я тратить на решение этой задачи три дня жизни. Test.7z Brovin Yaroslav и ENERGY 2 Цитата Ссылка на комментарий
Вопрос
Zyablik3000
Здравствуйте!
Есть такой код:
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.Controls.Presentation, FMX.ScrollBox, FMX.StdCtrls; type TScrBox = class(TPresentedScrollBox) public constructor Create(AOwner: TComponent); override; procedure Paint; override; end; TForm2 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } FContentChange: TNotifyEvent; public { Public declarations } end; var Form2: TForm2; implementation {$R *.fmx} { TScrBox } constructor TScrBox.Create(AOwner: TComponent); begin inherited Create(AOwner); end; procedure TScrBox.Paint; begin inherited; Canvas.DrawDashRect(LocalRect, 0, 0, AllCorners, 1, TAlphaColorRec.Red); end; procedure TForm2.Button1Click(Sender: TObject); var ScrBox: TScrBox; Pnl: TPanel; begin ScrBox:=TScrBox.Create(Self); ScrBox.Parent:=Self; ScrBox.AutoCalculateContentSize:=False; ScrBox.ContentSize.Width:=1000; ScrBox.ContentSize.Height:=1000; Pnl:=TPanel.Create(ScrBox); Pnl.Parent:=ScrBox; Pnl.Position.X:=10; Pnl.Position.Y:=10; end; end.
Однако, вопреки ожиданиям, при клике на Button1 получаю
Ни скроллбаров, ни панельки внутри ScrBox.
Подскажите, что не так? Как правильно унаследоваться от TPresentedScrollBox?
Ссылка на комментарий
5 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.