2013-01-15 164 views
2

我寫在拉撒路2-3樹申請我校的項目。滾動的TImage水平或垂直

一切都做了,現在用GUI打(我得到的分數相同的良好界面,因爲我做了好等插入功能,這是很奇怪,但NVM)。

當我有一個像樹10+節點,我的300 * 200的圖像尺寸是不夠大。

我想有這將是像300在TForm的* 200的TImage組件,但它會像10000 * 10000真的,你可以在它滾動。

這有可能嗎?

由於

EDIT使問題更清楚

  1. 2-3樹是一個數據結構。當在一張紙上繪製它看它是如何工作的,它看起來像這樣

  2. 作爲一個真正的拉奧努斯/ 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. 抽獎功能運作良好,但在3+高度的節點的一些(大部分)被繪製在其他節點上,所以看起來不好。該節點坐在另一個節點上,並且不在其旁邊。

  4. 我以爲我會讓樹形圖畫真實的大,但它會在一個小的「面板」。像這樣:TImage真的是1000 * 1000,但在形式上你只能看到它的一小部分。在這部分會有水平和垂直的滾動條,所以你可以滾動瀏覽圖片,看看章節裏有什麼。 (就像當你通過網頁瀏覽器滾動查看頁面底部:))

  5. 我們不允許使用任何其他代碼,只是在lazarus組件內置。 (我們也不允許創建新的組件 - >不知道爲什麼)

  6. 雖然我仍然對如何完成這項工作感到好奇,但我的應用程序不再需要它(安裝第二臺顯示器以查看它是否'd的幫助,它不會,所以我想我會挖掘我的塗料方法有點:-))

+0

什麼是「2-3樹應用程序」?樹和圖像如何相關? –

+1

@Sertac,我想我們可以假設一個2-3樹的應用程序是一個能夠做2-3棵樹的應用程序。我想我們也可以假定正在使用圖像來顯示屏幕上的樹。然而,對於理解這個問題來說,這兩者都不是至關重要的,它只是簡單地詢問當圖像太大而不適合屏幕時如何引入滾動。圖像的性質是無關緊要的。 –

+1

這意味着使用大約400 MB的位圖。你應該更好地畫一個例如顏料盒。你將能夠使用SetWorldTransform,總是用不同的裁剪畫相同的。 – bummi

回答

3

您的編輯更清楚地表明您要繪製一個示意圖,如example you link to中的最後一棵樹。

從您的代碼我明白,你正在繪製所有節點,孩子和樹葉,在一個單一的畫布導致一個大的圖像/位圖。現在,如何只顯示旁邊有滾動條的大圖像的一部分?

明顯的選擇是在TScrollBox上放置一個TPaintBox。我不知道拉撒路中的默認組件,但我希望它們都存在。將顏料盒的大小設置爲等於視覺樹的邊界,然後設置:滾動條將自動顯示。

油漆盒有一個OnPaint事件,在該事件中,您通過繪製到PaintBox.Canvas來完成油漆工作。爲了優化這一點,你可以限制你的繪圖到PaintBox.Canvas.ClipRect(在滾動框中可見的部分顏料盒),但我懷疑這很困難,因爲你已經很難計算相鄰節點之間的正確距離。 (關於這一點:我預計總樹的最大寬度和高度是總深度的函數,但我可能很容易被誤解。)

如果Lazarus沒有TPaintBox,則使用TImage,這也是有一個Canvas屬性。缺點是TImage將所有繪圖操作「存儲」在一個大的內部位圖中,當樹擴展太多時可能會引發內存或資源問題。

1

所有圖像可以合併爲一個大圖像?如果是這樣,那麼也許this component回答你的問題。

這是TGraphicControl後裔,能夠動畫變焦。通過拖動選擇矩形放大圖形的一部分,通過雙擊縮小整個圖形。如果您需要幫助來更新它,以便能夠執行平移操作,請拍攝。

+0

這是光滑的,雖然它不完全回答我的問題,它是值得加1 :) –