全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1220
推到 Plurk!
推到 Facebook!

請問在ScrollBox中,拖曳子元件,如何讓指標靠近邊界時,自動移Scrollbar

缺席
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-08 00:27:56 IP:61.229.xxx.xxx 未訂閱
我在ScrollBox中,放多個子元件,這些元件是予許拖曳的。 元件間,有一些間隔。當在拖曳過程中,想在指標靠近邊界時,自動移Scrollbar,就像在Word中,拖曳字元,當靠近下邊界時,自動移Scrollbar。 請問該如何作呢? 我之前的想法是: procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X, Y: Integer; State: TDragState; var Accept: Boolean); begin //Application.ProcessMessages; if ((Sender as TControl).Height - Y < 24) and ((Sender as TControl).Height - Y >= 0) then begin ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position 1; sleep(50); end; Accept := False; end; 把Application.ProcessMessages; 註解掉,似乎是正常動作。 但會造成在拖曳時,其他子元件不會重畫的現像。 但加上Application.ProcessMessages時,會發生一個記憶體錯誤。 請問該如何解?
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-08 09:37:52 IP:218.163.xxx.xxx 未訂閱
procedure TForm1.ScrollBox1DragOver(Sender, Source: TObject; X,
  Y: Integer; State: TDragState; var Accept: Boolean);
begin
  if y < 10 then
    ScrollBox1.Perform(WM_VSCROLL,SB_LINEUP,0);
  if y > ScrollBox1.ClientHeight-10 then
    ScrollBox1.Perform(WM_VSCROLL,SB_LINEDOWN,0);
  if x < 10 then
    ScrollBox1.Perform(WM_HSCROLL,SB_LINLEFT,0);
  if X > ScrollBox1.Clientwidth-10 then
    ScrollBox1.Perform(WM_HSCROLL,SB_LINERIGHT,0);
end;
發表人 - ccchen 於 2003/08/08 09:42:15
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-08 11:59:32 IP:203.73.xxx.xxx 未訂閱
謝謝! 大致上是可以執行!但有幾個問題: 一、在拖曳時,執行太快,造成scrollbar一下子就到底了! 我加了Sleep(50) 二、在拖曳時,若在其他元件上經過時,也會移動Scrollbar,但使得這個元件有點暫留(Caption的字被拉長),沒有即時的重畫。 加了這行,Application.ProcessMessages; 但在放開時,會出現一個錯誤。 請問,這有方法解決嗎? 謝謝!
小蟲蟲
一般會員


發表:38
回覆:55
積分:23
註冊:2002-03-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-08 22:08:42 IP:61.229.xxx.xxx 未訂閱
嗯,後來我加了一個Timer,由Timer負責移動ScrollBar... 類似: 在Timer1Timer中…… if FScrollState = ssDwon then ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position 1 else if FScrollState = ssUp then ScrollBox1.VertScrollBar.Position := ScrollBox1.VertScrollBar.Position - 1; 在ScrollBox1DragOver if ((Sender as TControl).Height - Y < 24) and ((Sender as TControl).Height - Y >= 0) then Timer1.Enabled := True else Timer1.Enabled := False; 目前是合乎我的需求。現在評估這個Timer會不會很吃Resource,如果會的話,要改成ThreadTimer。
系統時間:2024-05-04 17:01:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!