Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2022, 22:11   #1
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 106
Вопрос TPanel.Margin/Padding, TScrollBox.Margin/Padding (Delphi RAD 10.4)

Добрейшего времени суток, уважаемые форумчане!
Запутался совершенно с этими Margin-ами и Padding-ами.

Заранее прошу прощения за избыточное количество кода - просто не знаю сколько достаточно упомянуть для анализа решения...

Вобщем задача такая:
  1. Есть TPanel, на котором я разместил TScrollBox
  2. В котором далее создается динамически массив TPanel-ов (9 шт)
  3. Каждый из которых содержит по одному TImage
  4. В каждый из которых подгружается PNG-шка из ресурсов

И вот для TPanel-ов, упомянутых в п.2 я создаю через константы отступы через Left, Width, Top и Height. Загадочная ситуация происходит с самым нижним TPanel-ом: ни в какую не получается задать для него отступ от нижней границы TScrollBox-а.

Переменные и константы:
Код:
var
  frmDebug      : TfrmDebug;
  arrDataHolder : Array Of TPanel;
  arrSkillCat   : Array [0..8] Of TImage;

const
 intBaseLeft        = 0;
 intBaseWidth       = 730;
 intBaseTop         = 0;
 intBaseHeight      = 305;
 intScrollBoxMargin = 8;
 intCountDataHolder = 9; //Need to replace with Rows.Affected from SELECT
 intDH_Margin       = 8;
 intDH_Height       = 80;
 intSkillImgMargin  = 8;
Обработка перехвата мышкиного скролла:
Код:
procedure TfrmDebug.scrBoxMouseWheel(Sender: TObject; Shift: TShiftState;
  WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
var
 i: Integer;
begin
 Handled:=PtInRect(scrBox.ClientRect, scrBox.ScreenToClient(MousePos));
  If Handled Then
    For i:=1 To Mouse.WheelScrollLines Do
      Try
        If (WheelDelta>0) Then
         scrBox.Perform(WM_VSCROLL, SB_LINEUP, 0)
        Else
         scrBox.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
      Finally
       scrBox.Perform(WM_VSCROLL, SB_ENDSCROLL, 0);
      End;
end;
Код кнопки "Заполнить контейнер":
Код:
procedure TfrmDebug.btnFillBoxClick(Sender: TObject);
var
 i         : Integer;
 ResStream : TResourceStream;
 PNGBuffer : TPngImage;
begin
 pnlBase.Left:=intBaseLeft;
 pnlBase.Width:=intBaseWIdth;
 pnlBase.Top:=intBaseTop;
 pnlBase.Height:=intBaseHeight;

 scrBox.Left:=intScrollBoxMargin;
 scrBox.Width:=pnlBase.Width-(intScrollBoxMargin*2);
 scrBox.Top:=intScrollBoxMargin;
 scrBox.Height:=pnlBase.Height-(intScrollBoxMargin*2);

 SetLength(arrDataHolder, intCountDataHolder);

 //scrBox.Padding.Bottom:=8;
 //scrBox.AlignWithMargins;

 scrBox.SetFocus;

  For i:=0 To intCountDataHolder-1 Do
   Begin
    arrDataHolder[i]:=TPanel.Create(scrBox);
    arrDataHolder[i].Parent:=scrBox;

    arrDataHolder[i].Left:=intDH_Margin;
    arrDataHolder[i].Width:=scrBox.Width-(intDH_Margin*4);


     If (i=0) Then
      Begin
       arrDataHolder[i].Top:=intDH_Margin;
       arrDataHolder[i].Height:=intDH_Height;
      End
     Else
      Begin
       arrDataHolder[i].Top:=
        arrDataHolder[i-1].Top+arrDataHolder[i-1].Height+intDH_Margin;
       arrDataHolder[i].Height:=intDH_Height; //MUST BE CHANGED ==>
       //==> for the different arrDataHolder sizes

       //НАЧАЛО ТЕСТА ==> ДЕЛАЮ ТАК - НЕ ПОМОГАЕТ - СКРИНШОТ ПРИЛАГАЕТСЯ
        If (i=(intCountDataHolder-1)) Then
         Begin
          arrDataHolder[i].Margins.Bottom:=8;
          arrDataHolder[i].AlignWithMargins:=True;
          scrBox.Padding.Bottom:=8;
          scrBox.AlignWithMargins:=True;
         End;
       //<== КОНЕЦ ТЕСТА

      End;

    arrSkillCat[i]:=TImage.Create(arrDataHolder[i]);
    arrSkillCat[i].Parent:=arrDataHolder[i];

    arrSkillCat[i].Visible:=False;
    arrSkillCat[i].Left:=intSkillImgMargin;
    arrSkillCat[i].Top:=intSkillImgMargin;
    arrSkillCat[i].Visible:=True;

    //LOAD SKILL ICONS FROM RESOURCES: BEGIN
    ResStream:=
     TResourceStream.Create(
      hInstance, 'SKILLCAT'+IntToStr(i), RT_RCDATA
     );

     Try
      PNGBuffer:=TPngImage.Create;
       Try
        ResStream.Position:=0;
        PNGBuffer.LoadFromStream(ResStream);
        arrSkillCat[i].Picture.Graphic:=PNGBuffer;
       Finally
        PNGBuffer.Free;
       End;
     Finally
      ResStream.Free;
     End;
    //LOAD SKILL ICONS FROM RESOURCES: END

   End; //For i:=0 To intCountDataHolder-1 Do

end;
Изображения
Тип файла: png 1.png (33.5 Кб, 33 просмотров)
hexor_boo вне форума Ответить с цитированием
Старый 19.06.2022, 23:18   #2
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 106
Восклицание

Сообразил, как сжато и доступно описать:
Код:
       //НАЧАЛО ТЕСТА ==> ДЕЛАЮ ТАК - НЕ ПОМОГАЕТ - СКРИНШОТ ПРИЛАГАЕТСЯ
        If (i=(intCountDataHolder-1)) Then
         Begin
          arrDataHolder[i].Margins.Bottom:=8;
          arrDataHolder[i].AlignWithMargins:=True;
          scrBox.Padding.Bottom:=8;
          scrBox.AlignWithMargins:=True;
         End;
       //<== КОНЕЦ ТЕСТА
, где intCountHolder=9, arrDataHolder: TPanel, массив элементов, каждый из которых я вставляю в TScrollBox и scrBox - этот самый TScrollBox; непонятно, собственно следующее: как и каким способом создать отступ между нижней границей последнего arrDataHolder и нижней границей scrBox.

Медитативные размышления на манер понятий margin и padding в HTML успехом пока не увенчались...
hexor_boo вне форума Ответить с цитированием
Старый 19.06.2022, 23:41   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Добавьте в конце TLabel или TPanel без бордюра.
macomics вне форума Ответить с цитированием
Старый 20.06.2022, 00:00   #4
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 106
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Добавьте в конце TLabel или TPanel без бордюра.
Благодарю! Сам бы неизвестно сколько ещё провозился!
Код:
var
 pnlFinisher : TPanel;

const
 intDH_Margin=8;
...
       //НАЧАЛО ТЕСТА ==> УРА! Заработало как надо :)
        If (i=(intCountDataHolder-1)) Then
         Begin
          pnlFinisher:=TPanel.Create(scrBox);
          pnlFinisher.Parent:=scrBox;
          pnlFinisher.BevelOuter:=bvNone;
          pnlFinisher.Top:=
           arrDataHolder[i].Top+
           arrDataHolder[i].Height+
           intDH_Margin;
          pnlFinisher.Height:=0;
         End;
       //<== КОНЕЦ ТЕСТА
Теперь выглядит так, как в прикрепленном файле.
Изображения
Тип файла: png 2.png (33.5 Кб, 32 просмотров)

Последний раз редактировалось hexor_boo; 20.06.2022 в 00:13. Причина: Добавил скриншот окна с нужным результатом
hexor_boo вне форума Ответить с цитированием
Старый 20.06.2022, 00:27   #5
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 106
Вопрос

Есть кривоватенькое решение для расстояния между вертикальным скроллом и TPanel-ом, который лежит на TScrollBox-е:

Код:
arrDataHolder[i].Width:=scrBox.Width-(intDH_Margin*4);
где intDH_Margin=8 (это решение дает результат как на скриншоте в предыдущем сообщении)

А что делать, если для опрятности интерфейса нужно, чтобы было расстояние от правого края TPanel до планки скроллбара такое же, как от TPanel-а до нижней границы TScrollBox-а? Пока не понял. Экспериментирую.
hexor_boo вне форума Ответить с цитированием
Старый 20.06.2022, 02:49   #6
hexor_boo
Разъяснятор
Форумчанин
 
Аватар для hexor_boo
 
Регистрация: 21.04.2022
Сообщений: 106
По умолчанию

Полтора часа поисков, анализа и размышлений. Так можно и сгуглиться))
Это не флуд. Накипело

Последний раз редактировалось hexor_boo; 20.06.2022 в 03:29.
hexor_boo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
@media - как в медиазапросах можно убрать padding или margin у блока внутри которого элементы, MRD555 HTML и CSS 3 17.01.2022 21:41
padding Fryg HTML и CSS 5 15.01.2012 13:13
padding в ie7 daemon-rm HTML и CSS 5 17.11.2011 21:33
IE8 не работает padding zg_ltybc HTML и CSS 1 18.08.2011 03:23
Если родителю задать padding и overflow:hidden, нижний padding не работает caprella HTML и CSS 0 30.06.2010 12:00