我写在拉撒路2-3树申请我校的项目。滚动的TImage水平或垂直
一切都做了,现在用GUI打(我得到的分数相同的良好界面,因为我做了好等插入功能,这是很奇怪,但NVM)。
当我有一个像树10+节点,我的300 * 200的图像尺寸是不够大。
我想有这将是像300在TForm的* 200的TImage组件,但它会像10000 * 10000真的,你可以在它滚动。
这有可能吗?
由于
EDIT使问题更清楚
2-3树是一个数据结构。当在一张纸上绘制它看它是如何工作的,它看起来像这样
作为一个真正的拉奥努斯/ delphi中的noobie(必须在lazarus中做)使用这段代码来绘制它(即使我怀疑你需要它来回答我的问题):
procedure TStrom.Paint(Image: TImage);
VAR C:的TCanvas;
过程Paint1(V:TNODE;宽度,X,Y:整数); 开始
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;
抽奖功能运作良好,但在3+高度的节点的一些(大部分)被绘制在其他节点上,所以看起来不好。该节点坐在另一个节点上,并且不在其旁边。
我以为我会让树形图画真实的大,但它会在一个小的“面板”。像这样:TImage真的是1000 * 1000,但在形式上你只能看到它的一小部分。在这部分会有水平和垂直的滚动条,所以你可以滚动浏览图片,看看章节里有什么。 (就像当你通过网页浏览器滚动查看页面底部:))
我们不允许使用任何其他代码,只是在lazarus组件内置。 (我们也不允许创建新的组件 - >不知道为什么)
虽然我仍然对如何完成这项工作感到好奇,但我的应用程序不再需要它(安装第二台显示器以查看它是否'd的帮助,它不会,所以我想我会挖掘我的涂料方法有点:-))
什么是“2-3树应用程序”?树和图像如何相关? –
@Sertac,我想我们可以假设一个2-3树的应用程序是一个能够做2-3棵树的应用程序。我想我们也可以假定正在使用图像来显示屏幕上的树。然而,对于理解这个问题来说,这两者都不是至关重要的,它只是简单地询问当图像太大而不适合屏幕时如何引入滚动。图像的性质是无关紧要的。 –
这意味着使用大约400 MB的位图。你应该更好地画一个例如颜料盒。你将能够使用SetWorldTransform,总是用不同的裁剪画相同的。 – bummi