スクロールバーのPageSizeの設定を正しく行うには?

解決


かんとく  2009-02-13 21:37:26  No: 33346

お世話になっております。

XP、Delphi2007です。

スクロールバーを配置し、
Min=0
Max=100
PageSize=10
に設定して、実行時にスクロールバーをドラッグして下まで下げると、値(Position)が91までしか増えません。
PageSize=1にすると、値は100まで増えます。
PageSizeの設定を10にして、値が100まで増えるように設定する方法が分かりません。

よろしくお願いします。


ttt  2009-02-13 23:12:47  No: 33347

例えば100行のテキストがあって、一度に10行表示できるとします。
スクロールバーを一番下まで持っていったときにどうなるべきかというと、
二通りの考え方があります。
(a) 最後の10行が表示される。(先頭行=91)
(b) 最後の1行が先頭に表示される。(先頭行=100)

標準だとスクロールバーは(a)の考え方で設定するようになっています。
(b)の場合、スクロールしきると後ろに9行余白ができますよね?
なので、(b)のようにしたければその余白分(PageSize-1)を
Maxに足してくださいということになります。


かんとく  2009-02-14 03:31:37  No: 33348

ご回答ありがとうございます。

考え方は分かりました。

ただ、スクロールバーをドラッグせずに、バーの下にある▼ボタンを押すと、値が91を超えて、Maxの100まで増えてしまいます。
なのに、バーは動きません。

なんとなく見かけが悪いような気がしますが、何かいい方法はありますか?
(自分で値を監視して、91以上のときは強制的に値を91にする。というのは考え付きましたが、もっといい考えがあるような・・・)


monaa  2009-02-16 10:28:52  No: 33349

こんなんでどうでしょう?

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.


monaa  2009-02-16 10:32:42  No: 33350

考えすぎでした
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です。


かんとく  2009-02-17 04:27:06  No: 33351

ご回答ありがとうございます。

スクロールされたときに、値が
Max - PageSize + 1  を超えたときには強制的に値を
Max - PageSize + 1  にするというのがよさそうですね。

この方法でやってみます。

ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加