绘制图形数据的最佳实践

时间:2019-04-24 05:28:32

标签: delphi delphi-10.3-rio paintbox

希望这很清楚...

我想知道PaintBox控件是否可以允许用户从左到右滚动数据?像示波器显示一样,一次捕获即可缩放和滚动。在这种情况下,我不需要缩放。因此,我的Paintbox为800x600,数据集为16000x600。

我可以在800x600区域中进行绘制,如下所示,完全没有问题,可以应用缩放以获取所有数据,但是我想将Y轴缩放为1,并能够向左滚动/拖动/ right并查看数据。

    for J := 1 to ((Form1.Memo1.Lines.count)-1) do
    begin
      MyTorques[J] := StrToInt(Form1.Memo1.Lines[J]);
      Tqmult := ((StrToInt(Label6.Caption) + 500) Div 600);
      Ycalc[J] := ((MyTorques[J]) Div Tqmult);
      InvY[J] := (600 - (Ycalc[J]));
      X1 := (J-1);
      Y1 := InvY[J-1];
      X2 := (J);
      Y2 := InvY[J];
        with PaintBox1.Canvas do
        begin
          pen.Style := psSolid;
          pen.Color := clBlack;
          pen.Width := 1;
          moveto(X1, Y1);
          Lineto(X2, Y2);
          Label51.Caption := IntToStr(X1);
          Label52.Caption := IntToStr(Y1);
          Label28.Caption := IntToStr(X2);
          Label29.Caption := IntToStr(Y2);
          Label35.Caption := IntToStr(Tqmult);
          Label37.Caption := IntToStr(Ycalc[J]);
          Label39.Caption := IntToStr(InvY[J]);
          Label41.Caption := IntToStr(MyTorques[J]);
        end;
      if MyTorques[J] < Smallest Then
      Begin
        Smallest := MyTorques[J];
        SmallestIndex := J;
      end;
      if MyTorques[J] > Largest Then
      begin
        Largest := MyTorques[J];
        LargestIndex := J;
      end;
      Label30.Caption := IntToStr(Smallest);
      Label31.Caption := IntToStr(SmallestIndex);
      Label32.Caption := IntToStr(Largest);
      Label33.Caption := IntToStr(LargestIndex);
    end;

因此,我的paintbox.canvas是否需要设置为16000x600的大小,并在顶部设置800x600的顶部带有一个“窗口”,并且paintbox控件是可拖动的,且具有垂直和水平约束?

1 个答案:

答案 0 :(得分:1)

默认情况下,PaintBox没有任何滚动支持。

因此,如果要具有滚动功能,则必须将PaintBox放入其他可滚动控件(如ScrollBox)中,并将PaintBox的大小设置为较大,以包含整个图的渲染。

但这是一个不好的做法。为什么?这样一来,即使您一次只看到一部分图,您也将花费大量时间来绘制图。

相反,您应该考虑绘制仅在用户在sima时实际可见的绘图的一部分(适合PaintBox),然后在用户滚动到绘图上的不同位置时重新绘制绘图。