Перейти к содержанию
  • Регистрация
  • 0
Mexanik2012pro

TScrollBox и динамическое создание компонентов в нем

Вопрос

Добрый день всем!

Возникла проблема с компонентом TScrollBox на XE7.

На форме лежит компоненты TScrollBox и TButton. И на ScrollBox(e) создаются динамические компоненты TLabel. 

В начале все создает прекрасно (Картинка 1), но потом, когда TLabel создается за пределами TScrollBox получается трэш (Картинка 2) ...

 

//-------------------------------------------------------------------------------------------------------------------------------

static int i = 1;
TLabel *label = new TLabel(this);
label->Parent = ScrollBox1;
label->Text = "Text " + String(i++);
label->Margins->Bottom = 5;
 
label->Align = TAlignLayout::MostBottom; //Что бы компонент перенесло в низ
 
label->Align = TAlignLayout::MostTop; //зачем в верх, до последнего компонента
//-------------------------------------------------------------------------------------------------------------------------------
 
Извиняюсь, если не корректно написал. Но все же, проверте и дайте ответ в чем же проблема.
Если данная тема была, то дайте ссылку на ответ.
 
Данная проблема не только в этом компоненте, но TVertScrollBox & TFramedVertScrollBox.
 
Картинка 1                                                                                                           Картинка 2

post-124-0-24612000-1448802392.png

post-124-0-77952500-1448802392.png

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

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


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

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

  • 0

Создавал динамически TImage. Проблем не возникало таких, правда позиционировал через position

Если попробовать изначально задать большой Position. Y, а затем MostTop?

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

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


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

Создавал динамически TImage. Проблем не возникало таких, правда позиционировал через position

Если попробовать изначально задать большой Position. Y, а затем MostTop?

 

Спасибо большое ))) Это извращение какое то ...  :lol:

Создал глобальную переменную int pos, для запоминания позиции последнего TLabel. 

 

Вот решение:

//-------------------------------------------------------------------------------------------------------------------------------

int pos = 0; //наша позиция последнего TLabel
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
static int i = 1;
TLabel *label = new TLabel(this);
label->Parent = ScrollBox1;
 
label->Text = "Text " + String(i++);
 
label->Align = TAlignLayout::MostBottom;
label->Align = TAlignLayout::MostTop;
 
label->Position->Y = pos; //заносит нашу позицию
pos = label->Position->Y + label->Height; //сохраняет позицию и размер Height, для след использования
Label1->Text = pos; //выводит позицию последнего TLabel
}

//-------------------------------------------------------------------------------------------------------------------------------

 
Результат на картинка  :)

post-124-0-60128400-1448824492.png

post-124-0-08636500-1448824493.png

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


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

TScrollBox автоматически сам вычисляет размер контента на основании размещенных в нем элементов. В связи с этим нужно понимать, что любое выравнивание дочернего компонента по нижнему краю носит некий абсурдный характер, несмотря на то, что это не запрещено. Потому что при выравнивании контрола по нижней границе мы отталкивается относительно размера контента, в то же время контент рассчитывает свой размер относительно контрола. Поэтому у вас и получается столь не предсказуемый вариант.

 

Хорошая практика размещать компоненты подряд сверху вниз с выравниванием по верхнему краю. Или же самый лучший вариант - это ручное позиционирование компонентов.

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


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

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

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

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

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

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

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

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

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


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

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

×
×
  • Создать...