お世話になっております。
XP、Delphi2007です。
スクロールバーを配置し、
Min=0
Max=100
PageSize=10
に設定して、実行時にスクロールバーをドラッグして下まで下げると、値(Position)が91までしか増えません。
PageSize=1にすると、値は100まで増えます。
PageSizeの設定を10にして、値が100まで増えるように設定する方法が分かりません。
よろしくお願いします。
例えば100行のテキストがあって、一度に10行表示できるとします。
スクロールバーを一番下まで持っていったときにどうなるべきかというと、
二通りの考え方があります。
(a) 最後の10行が表示される。(先頭行=91)
(b) 最後の1行が先頭に表示される。(先頭行=100)
標準だとスクロールバーは(a)の考え方で設定するようになっています。
(b)の場合、スクロールしきると後ろに9行余白ができますよね?
なので、(b)のようにしたければその余白分(PageSize-1)を
Maxに足してくださいということになります。
ご回答ありがとうございます。
考え方は分かりました。
ただ、スクロールバーをドラッグせずに、バーの下にある▼ボタンを押すと、値が91を超えて、Maxの100まで増えてしまいます。
なのに、バーは動きません。
なんとなく見かけが悪いような気がしますが、何かいい方法はありますか?
(自分で値を監視して、91以上のときは強制的に値を91にする。というのは考え付きましたが、もっといい考えがあるような・・・)
こんなんでどうでしょう?
unit UFeScrollBar;
interface
uses
Classes, StdCtrls;
type
TFeScrollBar = class(TScrollBar)
private
bufPos:Integer;
protected
procedure Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer); override;
public
constructor Create(AOwner: TComponent); override;
end;
implementation
{ TFeScrollBar }
constructor TFeScrollBar.Create(AOwner: TComponent);
begin
inherited;
bufPos := -1;
end;
procedure TFeScrollBar.Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
if ScrollPos > Max - PageSize + 1 then
ScrollPos:= Max - PageSize + 1;
if bufPos<>ScrollPos then
inherited;
bufPos := ScrollPos;
end;
end.
考えすぎでした
unit UFeScrollBar;
interface
uses
StdCtrls;
type
TFeScrollBar = class(TScrollBar)
private
protected
procedure Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer); override;
end;
implementation
{ TFeScrollBar }
procedure TFeScrollBar.Scroll(ScrollCode: TScrollCode; var ScrollPos: Integer);
begin
if ScrollPos > Max - PageSize + 1 then
ScrollPos:= Max - PageSize + 1;
inherited;
end;
end.
でOKです。
ご回答ありがとうございます。
スクロールされたときに、値が
Max - PageSize + 1 を超えたときには強制的に値を
Max - PageSize + 1 にするというのがよさそうですね。
この方法でやってみます。
ありがとうございました。
ツイート | ![]() |