Если я вас не неправильно понял, ваши CloneProperties, похоже, не имеют ничего общего с вопросом, который вы задаете. В вашем примере элемента управления редактирования E1 и ползунка S1 вы можете клонировать их оба для создания E2 и S2, но где-то в вашем коде должен быть оператор, который изменяет значение в E1 в зависимости от значения S1. Однако, как вы, скорее всего, написали, этот оператор не применяется к E2 и S2.
Самый простой способ обойти это - написать метод, который принимает экземпляры компонентов и связывает операции двое вместе. например,
procedure TForm1.SetEditControlFromSlider(AnEdit : TEdit; ASlider : { TWhatever the slider actually is);
begin
// Set AnEdit's value from ASlider's properties
end;
Затем вы можете вызвать это с помощью пар Edit / Slider, например:
SetEditControlFromSlider(E1, S1);
[...]
SetEditControlFromSlider(E2, S2);
Я могу представить, что вам может не понравиться это делать.
ИМО, самое чистое решение - не пытаться полностью клонировать компоненты и создать TFrame, содержащий Edit, Slider и код, который их соединяет, а затем добавить в вашу форму столько экземпляров кадра, сколько вам нужно . Это так же просто, как падение с бревна.
type
TEditFrame = class(TFrame) // needs to be in its own unit, Used by your form
Edit1: TEdit;
TrackBar1: TTrackBar;
procedure TrackBar1Change(Sender: TObject);
private
public
end;
[...]
procedure TEditFrame.TrackBar1Change(Sender: TObject);
begin
Edit1.Text := IntToStr(TrackBar1.Position)
end;
Затем вы можете добавить клоны кадра в TForm1 с помощью
procedure TForm1.Button1Click(Sender: TObject);
var
AFrame : TEditFrame;
begin
Inc(FrameCount); // Field of TForm1
AFrame := TEditFrame.Create(Self);
AFrame.Name := AFrame.Name + IntToStr(FrameCount);
AFrame.Parent := Self;
AFrame.Top := AFrame.Height * FrameCount;
end;
Обратите внимание, что, поскольку код, связывающий два компонента, TrackBar1Change
, он компилируется в единицу фрейма, он автоматически используется каждым экземпляром фрейма, который вы создаете, без необходимости «клонировать» код.