ホームページ パソコン
サービス案内
フリーソフト Windows
プログラミング
お勧めリンク プロフィール
メール
ホーム -> Windows プログラミング -> 本頁(Delphi コンポーネント) 

 
Delphi コンポーネント

 拡張 スクロールボックス  TSdScrollBox  (ソースコード・デモ・解説書 付)
 

■  目  次  ■

概要と特徴

バージョン対応・テスト環境

使用例

【1】スクロールイベントの種類

【2】スクロールイベントを使ってみる

【3】ページスクロールでのスクロール量を指定する PageIncVert, PageIncHorz

【4】2つのスクロールボックスどうしを同期スクロールさせる   ScrollBox

【5】追加した公開のメソッド

【6】追加した公開のプロパティ
著作権

謝辞と解説書「Message of Scroll」の発刊について

ダウンロード

既存のTScrollBoxとの入れ替えの仕方
概要と特徴 目次に戻る↑

 TScrollBox を継承

 スクロールイベントを12種類実装


 

  [▲] ボタンと [つまみ] の間をクリックした場合のスクロール量をオブジェクトインスペクタで指定できるように、プロパティを追加(PageIncVert, PageIncHorz)  


 

 オブジェクトインスペクタで指定したもう一つの SdScrollBox とスクロールが相互に自動的に連動するようにプロパティを追加(ScrollBox)  

 コード記述を簡略化するためにプロパティを追加(PosVert, PosHorz)  

 MaxPositionを得るためのReadOnlyプロパティを追加(MaxPosVert, MaxPosHorz)  


 
 

 ソースコード付のため、使用者の好みに合わせて仕様変更可能 
 バグがあっても修正可能なのでとても安心
 SdScrollBox.pas / Ver1.00 / 2004.7.20. / First Upload 2004.7.21.  

 
 バージョン対応

・ Delphi3 以上に対応のはず。

   テスト環境

  PC 組み立てパソコン  CPU Pentium3 1GHz Windows2000 SP4
  Delphi 3.1 professional, Delphi 6 personal, Delphi 7 professional

 

 使用例 目次に戻る↑

 【1】 スクロールイベントの種類

 TSdScrollBoxが実装しているスクロールイベントの概略をまず知っておいていただきたい。
 継承元 TScrollBox のスクロール方法には、大きく分けて3種類ある。その各種類についても更に細かく分けることができる。
T.[▲]ボタンをクリックする場合。更に上下左右で分け、4種類用意した。
    OnVertButtonUpScroll,  OnVertButtonDownScroll,
    OnHorzButtonLeftScroll, OnHorzButtonRightScroll,
U.[つまみ (Thumb)] をドラッグしてスクロールする場合。これは2種類用意した。
    OnVertThumbScroll,    OnHorzThumbScroll,
V.[▲]ボタンと[つまみ]の間をクリックしてスクロールする場合。
  これも上下左右で、4種類用意した。
    OnVertPageUpScroll,   OnVertPageDownScroll,
    OnHorzPageLeftScroll,  OnHorzPageRightScroll,

  この最後のスクロールは、Windowsのメッセージ定義では "PageScroll" という名称が使われており、Delphiでのデフォルトのスクロール量は、TScrollBox.ClientWidth 及び ClientHeight の値となっている。この値は限定値でもあり、ユーザーからの変更指定はできない。
  TScrollBarではLargeChangeプロパティで可能なのに何故だと長い間悔しがってきたものだ。
W.もっと大ざっぱに分ければ、縦(Vert)・横(Horz)の2つだけに分類することもできる。
 T〜Vのどの種類のスクロールであろうと共通して処理したいことは1回記述すれば済むように
TSdScrollBoxでは、次の2つのイベントも用意したので、計12のイベントが実装されている。
    OnVertScroll,       OnHorzScroll,
 従って、1回のスクロールでイベントは2回起きる。先にT〜Vのどれかが発生し、2回目にWのどちらかが起こる。
 ただ完成してから思ったことは、イベントは12も必要なく、このW番目の2種類だけで十分ではないのかと。しかし、「お金は有るけど使わないだけ」なのと、「お金が無いので使えない」のとでは前者のほうが良いに決まっている、ということにした。

 

 【2】 スクロールイベントを使ってみる

目次に戻る↑

  次のコードは、デモ・アプリより、HorzScrollBarの右側の[▲]ボタンをクリックした時のイベントハンドラと、Horzスクロール時に共通して起こるHorzScrollイベントハンドラを写したものである。

procedure TForm1.SdScrollBox1HorzButtonRightScroll(Sender: TObject;
                           Msg: TWMScroll);
begin
 Memo1.Lines.Add('OnHScrollBtnR 1');
end;

procedure TForm1.SdScrollBox1HorzScroll(Sender: TObject; Msg: TWMScroll);
begin
 Memo1.Lines.Add('OnHScroll 1');
 Memo1.Lines.Add(IntToStr(SdScrollBox1.PosHorz)); // @
end;

 上記イベントハンドらが記述してあるデモ・アプリで、HorzScrollBarの右側の[▲]ボタンを6回クリックした時の実行結果が次の【図1】である。

 【図1】

 [▲]ボタンのクリック1回でスクロールする量は、HorzScrollBar.Incrementに設定してある値で決まり、デフォルト値の "8" のままにしてある。8*6回=48の位置に移動したのが判る。
 Memo1で、イベントが2回起きているのも確認できる。
 その他のスクロール方法の結果も、同様にデモで確認することができるので、実際に体験してみていただきたい。
  尚、@の[PosHorz]は、TScrollBox.HorzScrollBar.Positionと同じ機能で、記述の簡略化のために追加したプロパティである。コードを比較すると次のようになる。 

Case TScrollBox:
    Memo1.Lines.Add(IntToStr(ScrollBox1.HorzScrollBar.Position));
Case TSdScrollBox:
    Memo1.Lines.Add(IntToStr(SdScrollBox1.PosHorz)); 

 
 

  【3】ページスクロールでのスクロール量を指定する   

目次に戻る↑

 PageIncVert, PageIncHorz
 ページスクロールとは、[▲] ボタンと [つまみ] の間をクリックした場合のスクロールのことである。
 重複するが、TScrollBoxではこういうことはできない。
 TScrollBox.ClientHeight 及び ClientWidth の値しかスクロールできない。
 TSdScrollBox では、追加のプロパティ PageIncHorz PageIncVert にオブジェクト・インスペクタで値を設定するだけで、1行のコードも書かずに実現できる。デフォルト値は "0" であるが、"0" の場合には ClientHeight および ClientWidth の値と見なし、TSdScrollBox としては何も介入しない。
 では、次のコードが記述してあるデモで[PageIncHorz=0]
【図2】の場合を試し、結果を【図3】に示す
  尚、偶然だが ClientWidth の値は”180”というキリの良い数値となっている。

 
【図2】

procedure TForm1.SdScrollBox1HorzPageRightScroll(Sender: TObject; Msg: TWMScroll);
begin
  Memo1.Lines.Add('OnHScrollPageR 1');
end;

【図3】

  ClientWidth の値である 180 だけスクロールしているのが判る。

 では、Scroll.Positionを一旦 [0] に戻してから、次に [PageIncHorz=48] 【図4】 に変更してページスクロールを実行してみる。その結果は【図5】に示す
  指定どおり [48] の位置にスクロール
されているのが確認できるだろう。

【図4】

【図5】

若干の問題点
 ということで、静止画像の上では見事に成功したかに見えるのだが、実際にデモで試していただくと少し変な動きをするのが判るだろう。
 実際の [つまみ] の動きは、まずDelphiのデフォルト値であるClientWidthの分だけスクロールし、然る後、PageIncHorzで指定した位置にスクロールする。
【図5】でいうと、まず [180] の位置にスクロールし、その後 [48] の位置に再度スクロールする。
 この問題を解決するためには、TWinContriolより継承して一から作り直す以外ない、というのが私の調査結果である。現状では断念せざるを得ない。機会があれば試みたいが、挑戦しようという方には、ご一報いただければ追加資料を提供させていただきたい。

 

 【4】2つのスクロールボックスどうしを同期スクロールさせる ScrollBox

目次に戻る↑

 次の【図6】は、私のホームページからダウンロードできる Effect.exe の部分図である。

【図6】

  このアプリでは、左右どちらかの ScrollBox をスクロールさせると、もう片方も連動して同様にスクロールするようになっている。これは、TSdScrollBox の双方のスクロールイベントにコードを書けば実現できるのだが、けっこう長ったらしくなって面倒くさい。
 そこで今回、オブジェクトインスペクタの ScrollBox でペアの ScrollBox を指定するだけで、1行のコードも書かずに実現できるようにした。【図7】

【図7a】

【図7b】

 

 【5】追加した公開のメソッド

 追加した公開のメソッドはない。

 

 【6】追加した公開のプロパティ

目次に戻る↑

  << published = オブジェクトインスペクタでも設定できるプロパティ>>
@ PageIncVert, PageIncHorz : Integer
 ページスクロールによるスクロール量を指定する。指定できる値は [0..32767] 。
 [0] を指定した場合には、ClientHeight または ClientWidth の値を指定したと見なされる。
 詳しくは【3】を参照。
A ScrollBox : TSdScrollBox
 スクロールを自動的に同期させる対象の ScrollBox を指定する。詳しくは【4】を参照。
<< public = コードからのみアクセスできるプロパティ>>
B MaxPosVert, MaxPosHorz : Integer // Read Only
 TScrollBox.****ScrollBar.Position が取り得る最大値を常に保持しており、読込み専用。
 この値を TScrollBoxレベルで得るためには、次のようなコードを必要とする。

var
  MaxPosVert: Integer;
begin
  MaxPosVert := ScrollBox1.VertScrollBar.Range - ScrollBox1.ClientHeight;

C PosVert, PosHorz : Integer
  機能は、TScrollBox.****ScrollBar.Position プロパティとまったく同じ。
  ただし、Positionプロパティと異なり、オブジェクト・インスペクタには表示されない。
  このプロパティを使う積極的な意味は、コードの簡略化のみにある。どの程度か例を示す。

Case TScrollBox:
    Memo1.Lines.Add(IntToStr(ScrollBox1.HorzScrollBar.Position));
Case TSdScrollBox:
    Memo1.Lines.Add(IntToStr(SdScrollBox1.PosHorz)); 

Case TScrollBox:
    ScrollBox1.HorzScrollBar.Position:= 200;
Case TSdScrollBox:
    SdScrollBox1.PosHorz:= 200; 


   著作権 目次に戻る↑

  佐渡山 博(さどやま ひろし)にあります。
  商用・業務用を含めて使用・配布・掲載・改造等は自由です。
  尚、バグやコードの問題点などを見つけられた方は、ご連絡いただけると助かります。
  また、改良された方は、勉強のため私にもソースを分けて頂けると幸いです。 (メール)

 謝辞と解説書「Message of Scroll」の発刊について 目次に戻る↑

  今はHalbow資料館で保存公開されているHalbow氏の著作、「API with Delphi VCL 第3章 コントロールのメッセージ処理(その2)」を じっくりと学ぶことにより、このコンポーネントは実現しました。
  学ぶにあたっては、B5版両面製本印刷用にdocファイル化し、1年持ち歩いて精読しました。Windowsプログラミングの予備知識を何も持たずにDelphiを始めた私にとっては、他に例を見ない貴重な教科書でした。高度な内容を豊富な事例で一つひとつ解き証し、私を引き上げてくれました。
  docファイル化するについては、それ自体に相当な時間を費やしました。私だけが利用するにはもったいない内容であり、Halbow資料館館長Mr.XRay氏の快諾を得て、同時公開させていただきます。
  できることなら、Halbow資料館の文献はすべてdocファイル化してじっくりと学びたいのですが、そうもいきません。1章づつ手分けして協力してくださる方が現れるとありがたいのだがなあと思っています。
  Halobow氏とともに、氏の著作の保存・公開に尽力くださったMr.XRay氏に感謝申し上げます。
  尚、サイト出版にあたっては、Mr.XRay氏の助言により、A4版も用意させていただきました。

 ダウンロード 目次に戻る↑

  scrollboxcomp.exe (本体とデモ及びHelp)    messageofscroll_a4.exe    messageofscroll_b5.exe

  SdScrollBox.pas と SdScrollBox.dcr を同じフォルダに置いてインストールしてください。
  インストール先タブは「Samples」になっていますが、事前に適宜直してお使いください。

 既存のTScrollBoxとの入れ替えの仕方 目次に戻る↑

@  TSdScrollBox をインストールする。

A  フォーム上で右クリックし、PopUpMenu を表示する。

B  「テキストとして表示」(Delphi3) または「エディタで表示」(Delphi6,7) を選択する。

C  例えば "object ScrollBox1: TScrollBox" とある行の "TScrollBox" の部分を "TSdScrollBox" に変更する。
【図8】

D  エディタ上で右クリックし、PopUpMenu を表示する。

E  「フォームとして表示」を選択する。 

F  再コンパイルする。次のメッセージが現れるので

【図9】

G  「はい」を選択すると完了。

このページのトップへ
ホーム -> Windows プログラミング -> 本頁(Delphi コンポーネント) 
ホームページ パソコン
サービス案内
フリーソフト Windows
プログラミング
お勧めリンク プロフィール
メール