Splitter между двумя панелями. Динамически.

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

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

Ответить
forlazarus
новенький
Сообщения: 20
Зарегистрирован: 28.10.2021 10:29:33

Splitter между двумя панелями. Динамически.

Сообщение forlazarus »

Здравствуйте.
Есть форма Form1 и событие OnCreate. Имею код:

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

unit Unit1;
{$mode objfpc}{$H+}
interface
uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls;
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Splitter1: TSplitter;
    procedure FormCreate(Sender: TObject);
  private
  public
  end;
var Form1: TForm1;
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
Panel1 := TPanel.Create(Self);
Panel1.Parent := Self;
Panel1.Align := alLeft;
Panel1.Width := 200;
Panel1.Caption := 'Left Panel';
Panel1.Color:=clGreen;

Splitter1 := TSplitter.Create(Self);
Splitter1.Parent := Self;
Splitter1.Align := alLeft;
Splitter1.Width := 50;

Panel2 := TPanel.Create(Self);
Panel2.Parent := Self;
Panel2.Align := alClient;
Panel2.Caption:='Right Panel';
Panel2.Color:=clRed
end;

{$R *.lfm}
end. 
Ожидаю увидеть две панели и между ними splitter.
Но splitter убегает влево. Что это, баг или я что-то упустил?
Спасибо за ваше внимание.
Lazarus-4.4, gtk2, linux mint.
svk12
постоялец
Сообщения: 416
Зарегистрирован: 09.06.2008 18:42:47

Сообщение svk12 »

А если добавить

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

Splitter1.Left:=Panel1.Left+Panel1.Width;
?
Alex2013
долгожитель
Сообщения: 3365
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Никогда не удавалось настроить Splitter-ы «вручную», нормально выходит только через визуальный редактор формы (если очень нужно, то можно настроить в редакторе, а потом посмотреть LFM-файл).
forlazarus
новенький
Сообщения: 20
Зарегистрирован: 28.10.2021 10:29:33

Сообщение forlazarus »

svk12 писал(а): 16.09.2026 20:56:04 А если добавить

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

Splitter1.Left:=Panel1.Left+Panel1.Width;
Вы гений. Это работает.

Ещё нашёл второе решение. Выравнивание справа.
Одну панель выровнять вправо Panel2.Align := alRight;
Добавить Splitter и тоже Splitter1.Align := alRight;
И добавить другую панель и сделать Panel1.Align := alClient;

Спасибо. Люди всё ещё умнее роботов.
forlazarus
новенький
Сообщения: 20
Зарегистрирован: 28.10.2021 10:29:33

Сообщение forlazarus »

Остаётся, конечно, вопрос. Это баг или так задумано, что выравнивание компонентов слева автоматически не фиксирует сплиттер?
forlazarus
новенький
Сообщения: 20
Зарегистрирован: 28.10.2021 10:29:33

Сообщение forlazarus »

Alex2013 писал(а): 16.09.2026 22:19:02 Никогда не удавалось настроить Splitter-ы «вручную», нормально выходит только через визуальный редактор формы (если очень нужно, то можно настроить в редакторе, а потом посмотреть LFM-файл).
Я так понимаю, тут есть сложности с размерами панелей, если панели ещё делятся другими панелями сплиттерами.
1. Если какой-то панели дали всю область (alClient), то свойство width не работает корректно, ширину задаём только первой панели (из двух), и, как мы выяснили, устанавливаем Left для Splitter'a.
2. В момент создания панелей и сплиттеров размеры других компонентов, размеры формы могут быть неустановлены точно.

Поэтому нужно ориентироваться или на что-то внешнее, например, Screen.WorkAreaWidth и вычислить ширину первой панели или на уже заданное.
Например, ширину первой напели задать отдельно (держать в своём конфиге).
Задать размеры нужно при создании панели и при отображении (onShow) и OnResize

Может, кому-то поможет.
xchgeaxeax
постоялец
Сообщения: 209
Зарегистрирован: 11.05.2023 02:51:40

Сообщение xchgeaxeax »

Скорее всего при создании и панель и сплиттер имеет Left :=0. Из-за чего сплиттер и прижимается к левой границе. Попробуйте сначала создать спилиттер с Align := alLeft, а уже после панель с таким же выравниванием. Скорее всего сплиттер встанет на место т.к. теперь уже у панели сработает Left := 0 при создании и уже она вытеснит сплиттер с края. Проверять это пока нету времени.
forlazarus
новенький
Сообщения: 20
Зарегистрирован: 28.10.2021 10:29:33

Сообщение forlazarus »

xchgeaxeax писал(а): 17.09.2026 16:15:18 Скорее всего при создании и панель и сплиттер имеет Left :=0. Из-за чего сплиттер и прижимается к левой границе. Попробуйте сначала создать спилиттер с Align := alLeft, а уже после панель с таким же выравниванием. Скорее всего сплиттер встанет на место т.к. теперь уже у панели сработает Left := 0 при создании и уже она вытеснит сплиттер с края.
Вы правы, если создать Splitter1 с Align := alLeft, потом Panel1 с Align := alLeft, потом с Panel2 с Align := alClient, то Splitter1 разделит панели. Спасибо.
Ответить