2016-07-28 72 views
0

我還沒有遇到Delphi 10 Seattle下的TScrollBar的事件(OnScroll)處理程序的解決方案。我選擇它是因爲它不是一個TScrollBox,我將其放入任何內容(如面板或DBGrid)。它只是檢測鼠標動作(MouseUp/Down/Side-to-Side都沒有工作),它將被用作文件查找工具,它將迫使一堆TeeCharts更新,基於在滾動的方向上。對於FMX,TScrollBar的等效OnScroll事件是什麼?

到目前爲止,我只遇到過由WindowsMessages(WM_HSCROLL)和VLC.StdCtrls.TScrollBar.OnScroll

什麼是檢測滾動條之外的OnChange移動的有效途徑難以理解的例子嗎?

這將有助於能夠操縱ScrollBar並讓它在中間重置自身。就像我將數值設置得非常類似,如果我設置Min = -50和Max = 50(0)

+0

onChange事件應該正常工作時。它的作用與OnScroll相同。您可以將最小和最大屬性設置爲任何您想要的。 –

+0

我不明白你的問題,你爲什麼要尋找除了OnChange *之外的東西*。 OnChange是你應該使用的。要重置到中間,設置sb.Value:=(sb.max + sb.min)/ 2;' –

+0

我已經實現了您的建議,但是我擔心我沒有讓自己清楚。在滾動條移動之後,我希望滾動條移回到原始位置(中心)[鏈接](http://stackoverflow.com/questions/1269799/)該鏈接顯示了OnScroll(VCL)的其他屬性,所以我認爲onChange沒有可比性。 –

回答

0

爲了克服FMX TScrollBar的限制,您可以使用以下內容作爲進一步增強的基礎(部分受到您提供的鏈接的啓發)。

如果您將使用滾動條滾動的控件(或可配備)屬性來存儲當前滾動位置,您可以使用/定義類型single。對於測試,我只是將其定義爲表單的私有屬性,並將其稱爲sbIncremental

我設置的TScrollBarOrientation = VerticalSmallChange = 10Max = 100Min = -100

然後,OnChange事件看起來像這樣在我的測試中性能:

procedure TForm6.ScrollBarChange(Sender: TObject); 
var 
    sb: TScrollBar; 
    sbOnChange: TNotifyEvent; 
begin 
    sb := (Sender as TScrollBar); 
    sbIncremental := sbIncremental + sb.Value; 

    Label1.Text := FloatToStr(sbIncremental); // Use the new value 

    sbOnChange := sb.OnChange; // Disable OnChange event 
    sb.OnChange := nil;   // -"- 
    sb.Value := (sb.Min + sb.Max)/2; // Reset position 
    sb.OnChange := sbOnChange; // Re-enable OnChange event 
end; 

要重置滾動條位置的中心,我們需要暫時禁用OnChange事件。


評論後更新。

正如我現在的理解,您的問題是,滾動條的視覺外觀不會返回到零位,即使它的值更改(在OnChange內)爲零(min = -100和max = 100零位在中間)。它在單擊箭頭按鈕時會執行,但如果拖動拇指按鈕或單擊拇指按鈕的任一側,則不會執行該操作。在OnChange事件中的這兩種情況下,視覺更新似乎被阻止。此外,調用ScrollBar.Repaint不會更新視覺外觀。我發現沒有辦法使用OnMouseDown/OnMouseUp事件。他們似乎沒有內部聯繫?

這給我們留下以下(hacky)解決方案:用一個小的延遲觸發一個計時器,比如300 ms。發生超時時,滾動條準備好接受新的值更改並可視化更新。計時器也具有積極的作用,拇指按鈕隨着您的點擊而移動,然後向後移動。沒有任何時間之間不會有任何事情發生的視覺指示。

onchange事件處理程序使用定時器

procedure TForm6.ScrollBarChange(Sender: TObject); 
begin 
    // Use the scrollbar value 
    Label1.Text := FloatToStr((Sender as TScrollBar).Value); 

    // Enable reset timer 
    ScrollBarTimer.Enabled := False; 
    ScrollBarTimer.Enabled := True; 
end; 

而且OnTimer事件

procedure TForm6.ScrollBarTimerTimer(Sender: TObject); 
var 
    sbOnChange: TNotifyEvent; 
begin 
    ScrollBarTimer.Enabled := False; 

    sbOnChange := ScrollBar.OnChange; // store OnChange event 
    ScrollBar.OnChange := nil;  // disable OnChange event 
    ScrollBar.Value := (ScrollBar.Min + ScrollBar.Max)/2; // reset position 
    ScrollBar.OnChange := sbOnChange; // re-enable OnChange event 
end; 
+0

我想這只是一個測試,但是什麼是sbIncrement?它只是增加/減少永遠增加/減少值...滾動條所面對的方向。我認爲滾動條沒有被重置,因爲我們正在進行的是/(1)ScrollBar1和(2)sb(局部變量)。沒有局部變量只會影響本地obj,即OnChange應該移到函數之外以影響全局ScrollBar1。 –

+0

初始發件人:TObject只是一個副本或指向全局ScrollBar1的指針? –

+0

本地'sb'只是對'ScrollBar'的引用,它是'Sender'參數。目的是爲了避免**或者**始終寫'(發送者作爲TScrollBar)',**或**使用'(發送者作爲TScrollBar)'。 –

相關問題