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

Delphi XE10 VertScrollBox 問題

答題得分者是:pcplayer99
heart75047
一般會員


發表:9
回覆:13
積分:19
註冊:2010-05-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2016-01-07 19:54:24 IP:114.33.xxx.xxx 訂閱
使用VertScrollBox 想做到Line一樣的功能

移到最上層時再去讀取前一分頁的資料

研究了一下LINE 發現他是 移到最上層 重新讀取資料後 將ScrollBar "移到中間"

其中重新讀取資料的範圍 以及要移動的座標我已經算好了

偵測儀到最上層的事件解決了

控制VertScrollBox Scroll到我指定的座標 也解決了

於是將"控制ScrollBar到指定座標"的程式碼 放在 "偵測儀到最上層的事件"裡 正常運行

但是 如果再加上"刷新VertScrollBox內容" 的話 "控制ScrollBar"的程式碼就會失效

研究了一下 他不是失效 而是 會在刷新好幾次 然後還是回到最上層

應該跟"刷新VertScrollBox內容"有關

以下是已經簡化過很多的程式碼


unit Unit1;

interface

uses

System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,

FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls,

FMX.Controls.Presentation, FMX.Layouts;

type
TForm1 = class(TForm)
VertScrollBox1: TVertScrollBox;
Panel1: TPanel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure VertScrollBox1ViewportPositionChange(Sender: TObject;
const [Ref] OldViewportPosition, NewViewportPosition: TPointF;
const ContentSizeChanged: Boolean);
private
procedure MsgRefresh;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
MsgRefresh;
VertScrollBox1.ViewportPosition:=PointF(0,1000); //到最底端
end;

procedure TForm1.MsgRefresh; //產生測試訊息
var i:integer;
b:TButton;
begin
VertScrollBox1.OnViewportPositionChange:=nil;
for I := VertScrollBox1.Content.ControlsCount -1 downto 0 do
VertScrollBox1.Content.Controls[i].DisposeOf;
for I := 0 to 19 do
begin
b:=TButton.Create(Self);
with b do
begin
Parent:=VertScrollBox1;
Position.Y:=50*i;
Height:=40;
Text:='TestMsg' inttostr(i);
end;
end;
VertScrollBox1.OnViewportPositionChange:= VertScrollBox1ViewportPositionChange;
end;

procedure TForm1.VertScrollBox1ViewportPositionChange(Sender: TObject;
const [Ref] OldViewportPosition, NewViewportPosition: TPointF;
const ContentSizeChanged: Boolean);
begin
if VertScrollBox1.ViewportPosition.Y=0 then //如果移動到最頂端
begin
//MsgRefresh; //這行拿掉 就正常 如果重新產生內容 就不正常
//VertScrollBox1.RealignContent;
VertScrollBox1.ViewportPosition:=PointF(0,500); //移動到指定做標
//Abort; //下Abort就正常 但是如果在手機上面RUN 之前做的動作都不會做
end;
end;

end.
編輯記錄
heart75047 重新編輯於 2016-01-10 12:37:05, 註解 無‧
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2016-04-29 12:05:14 IP:120.237.xxx.xxx 訂閱
你在 VertScrollBox1ViewportPositionChange 里面,判断一下:if CanRefresh then MsgRefresh。

类似的这种办法,应该可以打破你这个循环调用。
系統時間:2024-11-21 21:16:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!