ScrollBar формы

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

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

Ответить
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

ScrollBar формы

Сообщение EmeraldMan »

Подскажите, а как убрать ScrollBar'ы с формы? Когда какой-нибудь компонент, например кнопка, вылазит за границы формы, то появляются эти ScrollBar'ы... Свойства стоят так:

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

AutoScroll:=False;
HorzScrollBar.Visible:=false;
VertScrollBar.Visible:=false;

На Delphi помогает одна только верхняя строчка, тут вертикальный убирается, горизонтальный ни в какую...
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

У меня при AutoScroll:=False; убираются обе полосы прокрутки как в режиме проектирования, так и в рантайм.
Что у тебя за версия Lazarus'a?
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Версия 0.9.25 Win32.
Заметил интересную вещь, по-эксперементируйте:
Ставим AutoScroll:=False; кидаем кнопку немного выходящую за границы формы - полос прокрутки нет.
А если наоборот: Кидаем кнопку за границы, а потом AutoScroll:=False; полосы не убираются как в режиме проектирования, так и в рантайм.

У меня в проекте по нажатии кнопки форма меняет свои размеры и часть контролов оказываются вне поля зрения и после пару раз пользования функцией появляются эти полосы, а это не очень хорошо... Не помогает и при событии OnResize убираение скролбаров...
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

Версия 0.9.27 SVN linux Gtk2
Повторил описанные операции - все работает!
Сейчас поставлю .25 Win, проверю и отпишусь.
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Прошу прощения за опечатку - 0.9.26 версия
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

В Windows на 0.9.25 AutoScroll:=False; сам по себе действительно работать отказывается, но если к нему приписать HorzScrollBar.Visible:=false; и VertScrollBar.Visible:=false; то все полосы прокрутки отключаются. Я пробовал оставлять за пределами видимой части формы разные контролы, но комбинация:

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

AutoScroll:=False;
HorzScrollBar.Visible:=false;
VertScrollBar.Visible:=false;

Работает всегда!

Добавлено спустя 2 минуты 13 секунд:
Попробую раздобыть .26 и проверить не ней, но думаю, что результат будет таким же. Быть может Вы используете в своем проекте нестандартные компоненты?

Добавлено спустя 19 минут 47 секунд:
На 0.9.26 комбинация тоже работает, но только в том случае, если она выполнена уже после изменения размеров формы (когда контролы уже оказались "за бортом"). Решается следующим образом:

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

procedure TForm1.FormChangeBounds(Sender: TObject);
begin
  Form1.AutoScroll:=true;
  Form1.AutoScroll:=false;
  Form1.VertScrollBar.Visible:=false;
  Form1.HorzScrollBar.Visible:=false;
end; 
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

Спасибо! Помогает. Правда весьма специфично:

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

Form1.AutoScroll:=true;
Form1.AutoScroll:=false;
Form1.VertScrollBar.Visible:=false;
Form1.HorzScrollBar.Visible:=false;

это классно работает, но когда форма запускается сразу с невидимыми контролами все равно полосы остаются, в дальнейшем при изменении размера исчезают.

Вот ещё кой чего нашел:

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

SetScrollRange(Handle, SB_VERT, 0, 0, false);
SetScrollRange(Handle, SB_HORZ, 0, 0, false); 
//или
ShowScrollBar(Handle, SB_VERT, false);
ShowScrollBar(Handle, SB_HORZ, false);

Работает всегда.
Однако, событие надо ставить каждый раз на ReSize и полосы прокрутки во время этого действия на долю секунды промелькивают.

Добавлено спустя 6 минут 12 секунд:
Кстати нестандартные компоненты действительно использую и с ними первый вариант похоже и правда не очень работает...
А это как-нибудь лечится? Что-то в компоненте надо прописывать? Компонент потомок от TGraphicControl.
Andreich
постоялец
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Сообщение Andreich »

EmeraldMan писал(а):когда форма запускается сразу с невидимыми контролами все равно полосы остаются, в дальнейшем при изменении размера исчезают

Попробуй сразу в процедуре создания формы изменять ее размер (скажем на 1 пиксель),.. быть может не очень эстетично с точки зрения программирования, но зато очень функционально на практике.
Аватара пользователя
EmeraldMan
постоялец
Сообщения: 149
Зарегистрирован: 16.10.2008 08:41:51
Откуда: Белгород
Контактная информация:

Сообщение EmeraldMan »

На этот раз вопрос таков - как лучше убрать ScrollBar у ListBox'а?
Дело в том, что у меня программа имеет свой стиль, и обычные скроллы ну ни как не вписываются. Я их заменил на - двигаешь картиночку и перемещаемся по записям ListBox.
Убирал ScrollBar функциями что и в случае с формой (SetScrollRange или ShowScrollBar), однако надо вызывать их каждый раз при отрисовке (onDrawItem), а то при прокрутке появляются. Но когда быстро листаешь - мелькают стандартные Scroll'ы постоянно... как с этим бороться?
Аватара пользователя
Tango
постоялец
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30

Сообщение Tango »

Как убрать скролы на DBGid?
Если я делаю так



procedure TNoScrollBarDBGrid.Paint;
Begin
inherited;

TNoScrollBarDBGrid=class(TDCLDBGrid)protected
procedure Paint; override;
End;

procedure TNoScrollBarDBGrid.Paint;
Begin
SetScrollRange(Handle, SB_VERT, 0, 0, False);
SetScrollRange(Handle, SB_HORZ, 0, 0, False);
inherited;
End;


То убираются, но со следующим косяком.

На Форме два ДБГрида, Один нормальный (верхний),другой (нижний) таблица подсуммировки, без скролов.
Но в нижнем гриде рисуется строчка от верхнего и она похожа на мусор.

Изображение

Добавлено спустя 2 минуты 52 секунды:
Lazarus 1.0.8
fpc 2.6.2
Win 7 x64
Ответить