【发布时间】:2012-12-29 23:59:15
【问题描述】:
我正在为我的学校项目在 Lazarus 编写 2-3 树应用程序。
一切都完成了,现在开始玩 GUI(好的 GUI 获得的分数与获得好的等值相同。插入功能,这很奇怪,但 nvm)。
当我在树中有 10 多个节点时,我的 300*200 图像尺寸就不够大了。
我想要一个 TImage 组件,它在 TForm 上是 300*200,但实际上是 10000 * 10000,你可以在其中滚动。
有可能吗?
谢谢
编辑使问题更清楚
2-3 树是一种数据结构。在纸上绘制以查看其工作原理时,它看起来像这样http://www.cosc.canterbury.ac.nz/research/RG/alg/tree23.gif
-
作为 lazarus/delphi 中的真正菜鸟(必须在 lazarus 中进行)使用此代码来绘制它(即使我怀疑你需要它来回答我的问题):
procedure TStrom.Paint(Image: TImage);变量 C:TCanvas;
procedure Paint1(V: TNode; Width, X, Y: integer); 开始
if V.L <> nil then //left child begin C.MoveTo(X, Y); C.LineTo(X - Width div 3, Y + 50); Paint1(V.L, Width div 3, X - Width div 3, Y + 50); end; if V.S <> nil then //middle child begin C.MoveTo(X, Y); C.LineTo(X + Width div 3, Y + 50); Paint1(V.S, Width div 3, X + Width div 3, Y + 50); end; if V.P <> nil then //right child begin C.MoveTo(X, Y); C.LineTo(X + Width div 3 + Width div 3, Y + 50); Paint1(V.P, Width div 3, X + Width div 3 + Sirka div 3, Y + 50); end; if V.isLeaf then begin C.Ellipse(X - 15, Y - 15, X + 15, Y + 15); C.TextOut(X - 3, Y - 8, IntToStr(V.Info1)); end else begin C.Rectangle(X - 15, Y - 15, X + 15, Y + 15); C.TextOut(X - 7, Y - 8, IntToStr(V.Info1)); C.Rectangle(X + 15, Y - 15, X + 50, Y + 15); if V.Info2 <> 0 then C.TextOut(X + 27, Y - 8, IntToStr(V.Info2)); end; draw函数效果很好,但是3+高度的部分(大部分)节点被绘制在其他节点上,所以看起来很糟糕。该节点位于另一个节点上,并且在它旁边不是 20 像素。
我想我应该把树画得很大的图像,但它会在一个小的“面板”中。像这样:TImage 实际上是 1000*1000,但在表格中你只能看到它的一小部分。在这部分中会有水平和垂直滚动条,因此您可以滚动图像并查看部分中绘制的内容。 (就像你在浏览器中滚动查看页面底部时一样:))
我们不允许使用任何其他代码,只能使用内置的 lazarus 组件。 (我们也不允许创建新组件 -> 不知道为什么)
1234563稍微研究一下我的绘画方法:-))
【问题讨论】:
-
什么是“2-3 树应用程序”?树和图像有什么关系?
-
@Sertac,我认为我们可以假设 2-3 树应用程序是使用 2-3 树做某事的应用程序。我认为我们也可以假设正在使用图像在屏幕上显示树。但是,这对于理解这个问题都不是至关重要的,它只是询问当图像太大而无法在屏幕上显示时如何引入滚动。图像的性质无关紧要。
-
这意味着使用大约 400 MB 的位图。你应该更好地画在例如油漆盒。您将能够使用 SetWorldTransform,始终使用不同的剪辑绘制相同的内容。
-
@Rob - 如果已经知道问题的性质,可以建议使用树视图而不是图像 - 它具有内置滚动功能。