• 0
Zyablik3000

Компонент - наследник TPresentedScrollBox

Вопросы

Здравствуйте!

Есть такой код:

 

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 получаю

PresentedScrollBox.jpg.baff81745fca224c135b06b0cb56ef7e.jpg

Ни скроллбаров, ни панельки внутри ScrBox.

Подскажите, что не так? Как правильно унаследоваться от TPresentedScrollBox?

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


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

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

  • 0

А если панельке задать высоту в 2000 пикселей, скролл появляется?

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
41 минуту назад, Barbanel сказал:

А если панельке задать высоту в 2000 пикселей, скролл появляется?

Нет, не появляется.

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


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

зачем скролл - если нечего скроллить? кинь в скроллбокс компонент, который будет пересекать границу родителя - и будет тебе скролл

 

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

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


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

Как нечего? А TPanel? У неё же parent:=scrollbox.

Если не наследовать, а просто бросить на форму TPresentedScrollBox и задать contentsize и autocalculatecontentsize=false, то все норм. И скроллбары и скроллинг есть.

Изменено пользователем Zyablik3000
Знаки припинания

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


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

Всем спасибо) Решение нашел сам.

Прочитав 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

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


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

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

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

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

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

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

Войти

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

Войти

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

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