两个TrackBar镜子

Ben*_*Ben 6 delphi pascal trackbar

我想知道如何在trackbar1.position的相反方向上制作我的第二个trackbar.position镜像.例如.范围从1到100.

所以什么时候TrackBar1.Position := 2,然后trackbar2.Position := 99 无论轨道轨道走哪条路,我都想反映相反的方向.

到目前为止,我的代码是:(对使用密钥不感兴趣),只是鼠标交互.

Direction : string; 
Skip : boolean;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
if TrackBar1.Position = TrackBar2.Position then
begin
if Direction = 'up' then   TrackBar2.Position := TrackBar2.Position + 1;
if Direction = 'down' then TrackBar2.Position := TrackBar2.Position - 1;
skip := true;
end;


if TrackBar1.Position < TrackBar2.Position then
begin 
if skip = false then
begin
TrackBar2.Position := TrackBar2.Position - 1;
Direction := 'down';
end;
end
else
begin
if skip = false then
begin
TrackBar2.Position := TrackBar2.Position + 1;
Direction := 'up';
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)

我可能过度了.也许有一种更简单的方法.我更喜欢简单的方法.谢谢,

Whi*_*ler 5

2个跟踪栏OnChange事件链接到此代码:

procedure TForm1.TrackBarChange(Sender: TObject);
var
  tbSource, tbTarget: TTrackBar;
begin
  if Sender = TrackBar1 then // Check the Trackbar which triggers the event
  begin
    tbSource := TrackBar1;
    tbTarget := TrackBar2;
  end
  else
  begin
    tbSource := TrackBar2;
    tbTarget := TrackBar1;
  end;
  tbTarget.OnChange := nil;                           // disable the event on the other trackbar
  tbTarget.Position := tbSource.Max + tbSource.Min - tbSource.Position; // set the position on the other trackbar
  tbTarget.OnChange := TrackBarChange;                // define the event back to the other trackbar

  // Call a function or whatever after this line if you need to do something when it changes
//  lbl1.Caption := IntToStr(TrackBar1.Position);
//  lbl2.Caption := IntToStr(TrackBar2.Position);
end;
Run Code Online (Sandbox Code Playgroud)

 

另类开始(Ken White建议和我的评论; o)):

procedure TForm1.TrackBarChange(Sender: TObject);
var
  tbSource, tbTarget: TTrackBar;
begin
//  if Sender is TTrackBar then      // is it called 'from' a trackbar?
//  begin
    tbSource := TTrackBar(Sender); // Set the source

    if tbSource = TrackBar1 then   // Check the Trackbar which triggers the event
      tbTarget := TrackBar2
    else
      tbTarget := TrackBar1;

    tbTarget.OnChange := nil;                                             // disable the event on the other trackbar
    tbTarget.Position := tbSource.Max + tbSource.Min - tbSource.Position; // set the position on the other trackbar
    tbTarget.OnChange := TrackBarChange;                                  // define the event back to the other trackbar

    // Call a function or whatever after this line if you need to do something when it changes
//    lbl1.Caption := IntToStr(TrackBar1.Position);
//    lbl2.Caption := IntToStr(TrackBar2.Position);
//  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • @Whiler :) Ben,注意上/下/左/右箭头没有任何代码 (2认同)
  • +1.但是,您可以简化变量赋值:`tbSource:= TTrackBar(Sender); 如果tbSource = TrackBar1则tbTarget:= TrackBar2 else tbTarget:= TrackBar1;` (2认同)