В разработке приложений часто возникает необходимость в визуальном выборе диапазона значений. В 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;
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 с двумя ползунками, существует несколько способов реализовать эту функциональность:
Использование проверенных сторонних компонентов - наиболее быстрый и надежный вариант.
Создание собственного компонента - дает полный контроль, но требует больше времени.
Комбинация стандартных компонентов (SpinEdit + TrackBar) - простое решение для многих случаев.
Для задачи анализа строк, как в примере JohnLM, хорошо подходит комбинация точного выбора позиции (SpinEdit) и визуального выбора длины (TrackBar). Это обеспечивает и точность, и удобство работы.
Пример кода в статье демонстрирует, как можно реализовать подобную утилиту для выделения и сохранения диапазонов в строке. Такой подход может быть полезен при работе с текстовыми данными, логами или при создании инструментов для разработчиков.
В статье рассматриваются методы реализации TrackBar с двумя ползунками для выбора диапазона в Delphi, включая использование сторонних компонентов, создание собственного решения и комбинацию стандартных элементов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.