2012-09-16 50 views
4

我正在使用具有拖放功能的TListView將一個或多個項目拖動到另一個項目中,作爲合併的一種形式。當您將項目拖到控件的頂部或底部時,我需要它自動向上或向下滾動,但不是。這同樣適用於在某些視圖樣式中向右或向左滾動。我怎樣才能讓它自動滾動到用戶拖動項目的方向?如何在向上或向下拖動項目的同時滾動列表視圖?

PS:我有VCL主題啓用以及

回答

3

並沒有太大考驗,但下面的嘗試使得當一個項目拖過其母公司控制之外的計時器(在本例的情況下,形式),並且計時器事件測試光標位置以確定滾動消息是否應該發送到列表視圖。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    Timer1.Interval := 500; 
end; 

procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer; 
    State: TDragState; var Accept: Boolean); 
begin 
    if Source = ListView1 then 
    Timer1.Enabled := True 
    else 
    Timer1.Enabled := False; 
end; 

procedure TForm1.Timer1Timer(Sender: TObject); 
var 
    Pt: TPoint; 
begin 
    // Stop timer and exit if not dragging any more 
    if not ListView1.Dragging then begin 
    Timer1.Enabled := False; 
    Exit; 
    end; 

    Pt := ListView1.ScreenToClient(Mouse.CursorPos); 
    if Pt.Y < 0 then 
    ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0) 
    else 
    if Pt.Y > ListView1.ClientHeight then 
     ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0) 
    else 
     Timer1.Enabled := False; 
end; 

procedure TForm1.FormDragDrop(Sender, Source: TObject; X, Y: Integer); 
begin 
    Timer1.Enabled := False; 
end; 

如果工作正常,您也可以合併水平滾動。

+1

+1和謝謝,我還修改了它,通過設置定時器間隔,可以更快地滾動鼠標,使鼠標遠離邊緣。奇蹟般有效。 –

+0

不客氣! –

相關問題