Позиционирование объектов под win32 и под GTK2

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Позиционирование объектов под win32 и под GTK2

Сообщение Troublemaker »

Простенькая форма со статусбаром. Статусбар разбит на 4 секции. В три первых выводится кое-какой текст, четвертая свободна. Я решил в нее (поверх нее) рисовать прогрессбар.
Во время разработки прогресс болтается где-то на форме, и при form.create он ставится на нужное место:

Код: Выделить всё

  with CountDownBar do begin
    Top:=StatusBar1.Top+1;
    Height:=StatusBar1.Height-1;
    z:=0;
    //поскольку у последней секции размер неизвестен, то считаем сумму размеров
    //остальных секций и вычитаем ее из длины статусбара
    for i:=0 to StatusBar1.Panels.Count-2 do inc(z,StatusBar1.Panels[i].Width);
    Left:=z+1;
    Width:=StatusBar1.Width-z-1;
  end
Под виндой (и под wine) всё происходит так, как должно - прогресс занимает строго отведенное место и становится указанных размеров. Однако, после сборки проекта под ubuntu с gtk2, прогресс получается правильных размеров, но оказывается ниже нижнего края формы. Что может быть не так?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Troublemaker писал(а):Что может быть не так?

CountDownBar.Parent ? :wink:
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

B4rr4cuda писал(а):Parent ?

Пардон? Родитель - сама форма, а что?
И какая может быть связь, если проект один и тот же?
Аватара пользователя
B4rr4cuda
энтузиаст
Сообщения: 693
Зарегистрирован: 28.12.2007 06:48:35

Сообщение B4rr4cuda »

Имеется ввиду установка statusbar-a в качестве родителя (parent) для прогрессбара. :)

Код: Выделить всё

  progressbar1.Parent:=StatusBar1;

А там уж и позиционируй спокойно...
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

B4rr4cuda писал(а):Имеется ввиду установка statusbar-a в качестве родителя для прогрессбара.
обязательно попробую, но почему под виндой всё нормально? Получается, что в gtk2 статусбар не дает помещать другие объекты поверх себя? Прогресс оказывается не ПОД статусбаром, а географически южнее него. Сейчас воткну вывод координат и гляну.

Добавлено спустя 57 минут 50 секунд:
Не помогло: под виндой прогресс прижался к левому краю формы и к верхнему краю statusbar-a, несмотря на явное задание нужных .left и .top, под линуксом вообще куда-то потерялся:

SB1 - тот же статусбар, что и выше, просто сократил название.

Код: Выделить всё

  with CountDownBar do begin
    Parent:=SB1;
    Top:=2; //это же по отношению к родителю, да? а ни фига, и left и топ равны нулю под обеими ОС, что показывает содержимое STCoord (statictext) ниже
    Height:=SB1.Height-2; //сделал даже поуже маленько
//    Top:=SB1.Top+1;   изначальный вариант. вот для чего удобно дублирование строк одним хоткеем
//    Height:=SB1.Height-1;
    z:=0;
    for i:=0 to SB1.Panels.Count-2 do inc(z,SB1.Panels[i].Width);
    Left:=z+1;
    Width:=SB1.Width-z-1; //ширина считается и выставляется правильно
    STCoord.Caption:='L:'+IntToStr(left)+' T:'+IntToStr(top)+' H:'+IntToStr(Height)+' W:'+IntToStr(Width)+
      ' PL:'+IntToStr(z)+' ST:'+IntToStr(SB1.Top)+' SH:'+IntToStr(SB1.Height);
  end

Или я что-то неправильно сделал с .parent?
Padre_Mortius
энтузиаст
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Сообщение Padre_Mortius »

Parent := SB1.Panels[i]
где i - номер вашей секции.

Вроде бы так
Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

Padre_Mortius писал(а):Parent := SB1.Panels[i]
Не катит:

TProgressBar.Parent:=SB1.Panels[SB1.Panels.Count-1]

Выдает ошику при компиляции:

Error: Incompatible type for arg no. 1: Got "TStatusPanel", expected "TWinControl"

А при принудительном приведении типа напоминает:

Warning: Class types "TStatusPanel" and "TWinControl" are not related

И, хотя собирается, но при запуске вылетает с экспешном, что вполне логично
v-t-l
энтузиаст
Сообщения: 745
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

Аватара пользователя
Troublemaker
постоялец
Сообщения: 292
Зарегистрирован: 16.04.2008 13:00:44
Откуда: Биробиджан, Дальний Восток
Контактная информация:

Сообщение Troublemaker »

v-t-l писал(а):Может пригодится?

Спасибо, очень познавательно. Вот только там делается то же самое, что проделал я, один в один, кроме создания нового компонента. Под виндой всё срастается, а вот под gtk2...
Ответить