Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация TrackBar с двумя ползунками для выбора диапазона в Delphi

Delphi , Компоненты и Классы , TPanel

 

Введение

В разработке приложений часто возникает необходимость в визуальном выборе диапазона значений. В Delphi стандартный компонент TTrackBar предоставляет только один ползунок, что ограничивает его применение для задач выбора диапазона. В этой статье мы рассмотрим несколько подходов к реализации TrackBar с двумя ползунками для выбора минимального и максимального значений.

Проблема

Как отметил пользователь JohnLM на форуме, стандартный TTrackBar в Delphi не поддерживает два ползунка, что затрудняет реализацию интерфейса для выбора диапазона значений, например, при выделении текста или фильтрации данных.

Решения

1. Использование сторонних компонентов

Как указали участники обсуждения, существуют готовые решения от сторонних разработчиков:

// Пример использования PegTop RangeBar (если бы он был установлен)
procedure TForm1.PegTopRangeBarChange(Sender: TObject);
begin
  Label1.Caption := Format('Диапазон: %d - %d', 
    [PegTopRangeBar.MinThumbPosition, PegTopRangeBar.MaxThumbPosition]);
end;

Доступные варианты: - PegTop RangeBar (https://www.pegtop.net/delphi/) - DevExpress RangeTrackBar - TMS RangeTrackBar

2. Создание собственного компонента

Для тех, кто предпочитает собственные решения, вот базовый пример создания компонента с двумя ползунками:

type
  TRangeTrackBar = class(TCustomControl)
  private
    FMinValue: Integer;
    FMaxValue: Integer;
    FMinPosition: Integer;
    FMaxPosition: Integer;
    // ... другие поля и методы
  protected
    procedure Paint; override;
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
    procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
    procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
  public
    constructor Create(AOwner: TComponent); override;
    property MinPosition: Integer read FMinPosition write SetMinPosition;
    property MaxPosition: Integer read FMaxPosition write SetMaxPosition;
  end;

3. Альтернативное решение с использованием стандартных компонентов

Как предложил Squall_FF8, можно использовать комбинацию TSpinEdit и TTrackBar:

procedure TForm1.SetupRangeSelectors;
begin
  // Настройка SpinEdit для точного выбора позиции
  SpinEditPosition.MinValue := 1;
  SpinEditPosition.MaxValue := Length(Memo1.Text);

  // Настройка TrackBar для выбора длины
  TrackBarLength.Min := 1;
  TrackBarLength.Max := 20; // Максимальная длина выделения
end;

procedure TForm1.UpdateSelection;
begin
  // Выделение текста в Memo на основе выбранных значений
  Memo1.SelStart := SpinEditPosition.Value - 1;
  Memo1.SelLength := TrackBarLength.Position;
end;

Практический пример: утилита для анализа строк

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

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Инициализация
  FStringPositions := TList<TPair<Integer, Integer>>.Create;

  // Пример строки для анализа
  EditSource.Text := 'ABC 123 DEF 456 7GH8 IJKL9';

  // Настройка компонентов
  TrackBarPos.Min := 1;
  TrackBarPos.Max := Length(EditSource.Text);
  SpinEditLength.MinValue := 1;
  SpinEditLength.MaxValue := 20;
end;

procedure TForm1.TrackBarPosChange(Sender: TObject);
begin
  UpdateSelectionDisplay;
end;

procedure TForm1.SpinEditLengthChange(Sender: TObject);
begin
  UpdateSelectionDisplay;
end;

procedure TForm1.UpdateSelectionDisplay;
var
  StartPos, EndPos: Integer;
  SelectedText: string;
begin
  StartPos := TrackBarPos.Position;
  EndPos := StartPos + SpinEditLength.Value - 1;

  if EndPos > Length(EditSource.Text) then
    EndPos := Length(EditSource.Text);

  SelectedText := Copy(EditSource.Text, StartPos, EndPos - StartPos + 1);

  EditSelected.Text := SelectedText;
  LabelPosition.Caption := Format('Позиция: %d-%d', [StartPos, EndPos]);
end;

procedure TForm1.ButtonAddClick(Sender: TObject);
var
  StartPos, EndPos: Integer;
begin
  StartPos := TrackBarPos.Position;
  EndPos := StartPos + SpinEditLength.Value - 1;

  FStringPositions.Add(TPair<Integer, Integer>.Create(StartPos, EndPos));
  UpdatePositionsList;
end;

procedure TForm1.UpdatePositionsList;
var
  i: Integer;
  Pair: TPair<Integer, Integer>;
begin
  MemoPositions.Lines.Clear;
  for i := 0 to FStringPositions.Count - 1 do
  begin
    Pair := FStringPositions[i];
    MemoPositions.Lines.Add(Format('%d,%d: %s', 
      [Pair.Key, Pair.Value, 
       Copy(EditSource.Text, Pair.Key, Pair.Value - Pair.Key + 1)]));
  end;
end;

Заключение

Хотя в Delphi нет встроенного компонента TrackBar с двумя ползунками, существует несколько способов реализовать эту функциональность:

  1. Использование проверенных сторонних компонентов - наиболее быстрый и надежный вариант.
  2. Создание собственного компонента - дает полный контроль, но требует больше времени.
  3. Комбинация стандартных компонентов (SpinEdit + TrackBar) - простое решение для многих случаев.

Для задачи анализа строк, как в примере JohnLM, хорошо подходит комбинация точного выбора позиции (SpinEdit) и визуального выбора длины (TrackBar). Это обеспечивает и точность, и удобство работы.

Пример кода в статье демонстрирует, как можно реализовать подобную утилиту для выделения и сохранения диапазонов в строке. Такой подход может быть полезен при работе с текстовыми данными, логами или при создании инструментов для разработчиков.

Создано по материалам из источника по ссылке.

В статье рассматриваются методы реализации TrackBar с двумя ползунками для выбора диапазона в Delphi, включая использование сторонних компонентов, создание собственного решения и комбинацию стандартных элементов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: TPanel ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-25 05:17:03/0.0061318874359131/0