Delphi 关于绘制图形数据的最佳实践

Delphi 关于绘制图形数据的最佳实践,delphi,delphi-10.3-rio,paintbox,Delphi,Delphi 10.3 Rio,Paintbox,希望这是清楚的 我想知道PaintBox控件是否允许用户从左向右滚动数据?想象一下,它就像一个示波器显示器,其中一个捕获允许缩放和滚动。在这种情况下,我不需要缩放。所以,我的颜料盒是800x600,数据集是16000x600 我可以在800x600区域进行绘图,如下图所示,完全没有问题,可以应用缩放以获取所有数据,但我希望Y轴缩放为1,并能够向左/向右滚动/拖动并查看数据 for J := 1 to ((Form1.Memo1.Lines.count)-1) do begin

希望这是清楚的

我想知道PaintBox控件是否允许用户从左向右滚动数据?想象一下,它就像一个示波器显示器,其中一个捕获允许缩放和滚动。在这种情况下,我不需要缩放。所以,我的颜料盒是800x600,数据集是16000x600

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

    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;
对于J:=1到((Form1.Memo1.Lines.count)-1)do
开始
MyTorques[J]:=stroint(Form1.Memo1.Lines[J]);
Tqmult:=((stroint(Label6.标题)+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];
使用PaintBox1.Canvas do
开始
pen.Style:=psSolid;
钢笔颜色:=黑色;
笔宽:=1;
moveto(X1,Y1);
Lineto(X2,Y2);
标签51.标题:=IntToStr(X1);
标签52.标题:=IntToStr(Y1);
标签28.标题:=IntToStr(X2);
标签29.标题:=IntToStr(Y2);
标签35.标题:=IntToStr(Tqmult);
标签37.标题:=IntToStr(Ycalc[J]);
标签39.标题:=IntToStr(InvY[J]);
标签41.标题:=IntToStr(MyTorques[J]);
结束;
如果MyTorques[J]<最小
开始
最小:=My扭矩[J];
SmallestIndex:=J;
结束;
如果MyTorques[J]>最大,则
开始
最大:=My扭矩[J];
最大指数:=J;
结束;
标签30.标题:=IntToStr(最小值);
标签31.标题:=IntToStr(SmallestIndex);
标签32.标题:=IntToStr(最大);
标签33.标题:=IntToStr(最大索引);
结束;

那么,我的paintbox.canvas是否需要大小为16000x600,顶部尺寸为800x600,并且paintbox控件可以通过垂直和水平约束进行拖动?

默认情况下,paintbox没有内置任何滚动支持

所以,如果你想拥有滚动功能,你必须把你的画框放到其他一些可滚动的控件中,比如ScrollBox,并设置你的画框的大小,以包含整个绘图的渲染

但这是一种糟糕的做法。为什么?这样做,即使用户一次只能看到一部分,也会花费大量时间绘制绘图


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

添加一个滚动条,并使用其位置计算整个数据集上的可见窗口。使用图表库要容易得多。您考虑过使用Delphi附带的TChart组件吗?TChart是调色板中的一个组件吗?我没有(搜索图表),但这是使用Delphi社区版的结果吗?是的,在
TeeChart Std
中,至少在我的Delphi 10.2.3 Tokyo Professional中。还应包括在10.3 Rio CE中。AFIK,社区版与专业版相同,只是使用了另一个许可证。也许您只是没有安装TChart组件?重新安装了TChart组件,这是过程中的一个选项。我将尝试一下,谢谢Delphi编码器。这是一个有趣的方法,也是关于资源的一个很好的观点。调查开始了。