Создание нового компонента путем объединения двух элементов управления (TEdit и TTrackBar) в Delphi VCL

Я разрабатываю приложение Delphi 10.1 VCL для Windows.

для ввода integer или float мне нужно поле ввода номера, которое связано с ползунком. Когда пользователь изменяет номер в поле ввода, позиция ползунка изменяется соответствующим образом. Когда пользователь изменяет положение ползунка, номер в поле Номер обновляется.

Я могу решить эту проблему с помощью TEdit и TTrackBar и добавить необходимую функциональность обновления в событие OnChange дрессировщики.

enter image description here

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

  1. является ли создание нового компонента лучшей стратегией для многократного использования такого слайдера?

  2. каков наилучший способ создать такой новый компонент?

3 ответов


является ли создание нового компонента лучшей стратегией для нескольких использование такого слайдера?

не обязательно все время. (по крайней мере, по моим меркам).

каков наилучший способ создания такого нового компонента?

Я знаю три способа решить вашу проблему.

путь номер 1:

создать компонент с помощью мастера создания компонентов, где вы создаете динамически Tedit и Ttrackbar субкомпоненты в Tgroupbox потомок.

вот как я бы это сделал.

unit Combindedittrack;

interface

uses
  System.SysUtils, System.Classes, Vcl.Controls, Vcl.comctrls ,Vcl.StdCtrls;

type
  TCombindedittrack = class(Tgroupbox)
  private
    { Private declarations }
    Fedit:tedit;
    Ftrackbar: TTrackBar;
    procedure editonchangeproc(Sender: TObject);
    procedure trackbaroOnchange(Sender: TObject);
  protected
    { Protected declarations }

  public
    { Public declarations }
    constructor Create(owner:tcomponent); override;
    destructor Destroy; override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TCombindedittrack]);
end;

constructor TCombindedittrack.Create(owner:tcomponent);
begin
inherited Create(owner);
SetBounds(0, 0, 250, 50);
Fedit:=tedit.Create(self);
with Fedit do
  begin
  text := '';  //<-- you control the appearence here
  top := 10;
  left := 10;
  height := 27;
  width := 50;
  parent:=self;
  Onchange:=editonchangeproc; // your Onchange event handler for the Tedit
  end;

Ftrackbar:=ttrackbar.Create(self);
with Ftrackbar do
  begin
  top := 10;  //<-- you control the appearence here
  left := 60;
  height := 30;
  width := 50;
  parent:=self;
  Onchange:=trackbaronchangeproc;  // your Onchange event handler for the Ttrackbar
  end;
end;

destructor TCombindedittrack.Destroy;
begin
Ftrackbar.Free;
Fedit.Free;
inherited;
end;

procedure TCombindedittrack.trackbaroOnchange(Sender: TObject);
begin
// <-- track bar onchange handling here.
end;

procedure TCombindedittrack.editonchangeproc(Sender: TObject);
begin
// <-- edit onchange handling here.
end;

end.

путь номер 2:

используйте такие кадры (я на delphi 10 seattle).

1) File-->New-->Other-->(поиск кадров в файлах delphi).

2) Теперь добавьте редактирование и панель треков и установите их события Onchange.

3) сохранить блок.

4) на панели инструментов (в разделе стандартный компонент) нажмите на компонент рамки.

5) выберите рамку, которую вы только что создали.

вы будете иметь реплику кадра каждый раз, когда вы его используете.

путь номер 3:

используйте шаблон компонента, как это (снова я на delphi 10 seattle)

1) Выберите уже созданный и измененный tedit и ttrackbar.

2) на на панели инструментов" компонент "нажмите" Создать шаблон компонента".

3) Назовите свой шаблон и нажмите OK.

4) Выберите палитру, шаблон и шаблон.

теперь обратите внимание, что даже ваш код (события) добавляются также в ваш проект.

наконец-то

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


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

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

1. простота изменения комбинированного управления(ов), если вы этого хотите (по моему опыту вы будете).

2. время необходимо выполнить эту задачу (это означает время, которое потребуется вы должны полностью выполнить задачу с минимальной отладкой и кодированием).

3. общая читаемость исходного кода.

4. полезности для будущего ваших проектов.

теперь начнем критиковать три метода, основанные на этих критериях.

путь номер 1:

C1(Критерий № 1): всего измените исходную реализацию компонента, и каждая реплика / использование будет иметь одинаковые эффекты и свойства. Однако это не относится к способу № 3.

C2: это зависит от вашего знания написания компонентов, но для этого компонента мне потребовалось 5 минут, чтобы создать его, и я только новичок в delphi. Для отладки, если что-то пошло не так и проблема в реализации компонента, чем вам просто необходимо исправить один раз (см. C1)

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

C4: вы создаете компонент после того, как все это откроет вам дверь для создания собственного набора компонентов, таких как компоненты Flatstyle или Indy с открытым исходным кодом. так что в следующий раз тебе понадобится что-то вроде этого. вы просто бросаете его в свой конструктор форм, и все готово.

путь номер 2: кадры

C1: это похоже на Способ № 1, потому что вы создаете компонент, но на этот раз визуально. изменение исходного фрейма изменит эффекты и свойства реплик, также вы можете добавить дополнительную обработку к репликам.

обработчик событий События onChange реплики выглядит следующим образом

procedure TForm1.Frame2Edit1Change(Sender: TObject);
begin
  Frame2.Edit1Change(Sender); //<-- this is the original onchange event you setup at the beginning 
  //<-- you can extra handling here if you want one of the replicas to behave differently than the original  
end;

C2: то же время и, возможно, быстрее, чем путь номер 1.

C3: более того, он имеет то же самое, что и путь номер 1.

C4: в отличие от способа № 1 Вы не можете использовать фреймы, созданные в проекте A в проекте B. Поэтому ваше кодирование и отладка останутся в проекте A.

путь номер 3: шаблон компонента.

C1: вы не создаете компонент вы создаете repleca / макрос точных шагов, которые вы сделали в вашем последнем проекте. изменение одного не изменит других, они разделены.

C2: то же время и, возможно, быстрее, чем путь номер 1.

C3: каждый раз, когда вы добавляете шаблон в форму, будет добавлен код событий (не очень хороший вид, если это длинный код Onchange).

C4: вы можете использовать шаблоны, созданные в проекте A в проекте B. Однако то, что вы написали в проекте A, будет в проекте B (см. c1) даже ссылки на переменные, которые не существуют в проекте B (это может быть трудно отладить и ввести в заблуждение, учитывая период времени между каждым использованием шаблона).

вывод: каждый из представленных способов потребует времени на кодирование и отладку, и все они будут выполнять задачу, как бы то ни было, ради простоты и повторного использования с минимальными рисками Способ № 1 является безопасным выбором здесь, потому что это даст вам возможность безопасно обновлять и обновлять. также отлаживайте быстрее.

хорошая вещь также о способе № 1 заключается в том, что через некоторое время, когда вы забудете реализацию и как все работает внутри. Единственное, что следует иметь в виду, это цель компонента, потому что он станет одним из различных компонентов, которые вы используете (вы не знаете, как Tedit реализован, и вам не нужно, но все же вы используете его в каждом отдельном проекте создавать.)

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


возможно, использование контейнерного элемента управления, содержащего оба элемента управления, является более простой альтернативой. Для этого я использую ccpack.

https://sourceforge.net/projects/ccpack/

Custom Containers Pack (CCPack) - это интегрированный инструмент и компонент mini- библиотека для создания и обслуживания составных элементов управления (или просто " композиты") и другие контейнеры (формы, модули данных и фреймы). Процесс построение составных компонентов выглядит так ActiveForm и создание кадров, но результатом является собственный компонент VCL. Вы можете создавать новые композиты просто как обычно.


вы можете создать фрейм, а затем зарегистрировать этот фрейм как компонент. Конечный результат очень похож на создание компонента только кода, где субкомпоненты создаются в конструкторе (опция Nasreddine № 1). Однако этот метод позволяет визуально проектировать компонент и в инспекторе объектов для создания обработчиков событий.

вот вопрос переполнения стека, который показывает, как зарегистрировать кадр: как улучшить использование Delphi Кадры