【问题标题】:Two TrackBar mirror两个 TrackBar 镜子
【发布时间】:2012-05-16 09:34:44
【问题描述】:

我想知道如何使我的第二个 trackbar.position 镜像到 trackbar1.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;

我可能做得过火了。也许有更简单的方法。我更喜欢更简单的方法。 谢谢,

【问题讨论】:

    标签: delphi pascal trackbar


    【解决方案1】:

    OnChange 的 2 个轨迹栏事件链接到此代码:

    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;
    

     

    替代开始(由 Ken White 和我的 cmets 建议;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;
    

    【讨论】:

    • tbTo.Position := 100 - tbFrom.Position + 1; (1-100,2-99)
    • @teran: 我用过min := 0 & max := 100... 这就是为什么 ;o) 但我更新以回答 exact 问题 ;o)跨度>
    • @Whiler :) Ben,请注意上/下/左/右箭头无需任何代码即可工作
    • @Ben:不客气(因为你是 StackOverflow 上的新人......我解释一下,以防万一......在答案/问题的左侧......有一个柜台...... . 投票 +1 如果可以,-1,如果不是......以下,如果这是你所期望的,你可以接受答案......)
    • +1。不过,您可以简化变量分配:tbSource := TTrackBar(Sender); if tbSource = TrackBar1 then tbTarget := TrackBar2 else tbTarget := TrackBar1;
    猜你喜欢
    • 1970-01-01
    • 2021-03-09
    • 2021-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多