• 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

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


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

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

  • 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 автоматически сам вычисляет размер контента на основании размещенных в нем элементов. В связи с этим нужно понимать, что любое выравнивание дочернего компонента по нижнему краю носит некий абсурдный характер, несмотря на то, что это не запрещено. Потому что при выравнивании контрола по нижней границе мы отталкивается относительно размера контента, в то же время контент рассчитывает свой размер относительно контрола. Поэтому у вас и получается столь не предсказуемый вариант.

 

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

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


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

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

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

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

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

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

Войти

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

Войти

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

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