爲了克服FMX TScrollBar
的限制,您可以使用以下內容作爲進一步增強的基礎(部分受到您提供的鏈接的啓發)。
如果您將使用滾動條滾動的控件(或可配備)屬性來存儲當前滾動位置,您可以使用/定義類型single
。對於測試,我只是將其定義爲表單的私有屬性,並將其稱爲sbIncremental
。
我設置的TScrollBar
爲Orientation = Vertical
,SmallChange = 10
,Max = 100
和Min = -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;
onChange事件應該正常工作時。它的作用與OnScroll相同。您可以將最小和最大屬性設置爲任何您想要的。 –
我不明白你的問題,你爲什麼要尋找除了OnChange *之外的東西*。 OnChange是你應該使用的。要重置到中間,設置sb.Value:=(sb.max + sb.min)/ 2;' –
我已經實現了您的建議,但是我擔心我沒有讓自己清楚。在滾動條移動之後,我希望滾動條移回到原始位置(中心)[鏈接](http://stackoverflow.com/questions/1269799/)該鏈接顯示了OnScroll(VCL)的其他屬性,所以我認爲onChange沒有可比性。 –