pagecontrolのTabSheet1〜12上のScrollBox1〜12をScrollさせるprocedureを作りました。
機能はするのですがcase〜of〜end部分の記述が不満です。
簡潔に書けるでしょうか?
procedure TForm1.KeyScroll(UporDown:integer);
var i:integer;
Sb:TScrollBox;
begin
i:=pagecontrol1.ActivePage.TabIndex+1;
case i of
1:Sb:=ScrollBox1;
2:Sb:=ScrollBox2;
3:Sb:=ScrollBox3;
4:Sb:=ScrollBox4;
5:Sb:=ScrollBox5;
6:Sb:=ScrollBox6;
7:Sb:=ScrollBox7;
8:Sb:=ScrollBox8;
9:Sb:=ScrollBox9;
10:Sb:=ScrollBox10;
11:Sb:=ScrollBox11;
12:Sb:=ScrollBox12;
end;
i:=Sb.VertScrollBar.Position;
i:=i+200*UporDown;
Sb.VertScrollBar.Position:=i;
end;
FormのPrivateで
FSbTbl[1..12] of TScrollBox
と定義しておいて
FormCreateイベント内で
FSbTbl[1] := ScrollBox1
・・・
FSbTbl[12] := ScrollBox12
と代入しておけば
procedure TForm1.KeyScroll(UporDown:integer);
var i:integer;
Sb:TScrollBox;
begin
i:=pagecontrol1.ActivePage.TabIndex+1;
Sb := FSbTbl[i];
i:=Sb.VertScrollBar.Position;
i:=i+200*UporDown;
Sb.VertScrollBar.Position:=i;
end;
と回数が多い処理でCase文がなくなります。
FormCreateの記述が単調なものになりますが
ここは仕方ないかと思います。
こんなのは?
function GetScrollBox(TS:TTabSheet):TScrollBox;
var
i:integer;
begin
result := nil;
for i := 0 to TS.ControlCount-1 do
if TS.Controls[i] is TScrollBox then begin
result := TScrollBox(TS.Controls[i]);
exit;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
SB:TScrollBox;
begin
SB := GetScrollBox(PageControl1.ActivePage);
if Assigned(SB) then Label1.Caption := SB.Name;
end;
ScrollBoxの命名が必ずpagecontrol1.ActivePage.TabIndex+1と一致する前提とするなら、
i:=pagecontrol1.ActivePage.TabIndex+1;
Sb:=FindComponent('ScrollBox'+IntToStr(i)) as TScrollBox;
※ひょっとしたら、pagecontrol1.ActivePage.FindComponentの方が良いかも
という感じでもできますね
ではでは
jokさんのコードの場合、コンポーネントの貼り付け順序によっては、1,2,3,4,5...という順序でない場合がありそうです。
# 未確認
私の場合、切り取ってテキストエディタで修正し、また張り直す、ということを良くやるので・・・^^;
よしさんの方法か、takeさんの方法+よしさんの方法(配列に格納する部分をループで処理させる)がよろしいかと思います。
ScrollBoxの命名がpagecontrol1.ActivePage.TabIndex+1と一致していますので
よしさんの方法で極めて簡潔にできました。
jokさんの味わい深いコードはたいへん勉強になりました。
御教示いただきました皆様ありがとうございました。
>jokさんのコードの場合、コンポーネントの貼り付け順序によっては、1,2,3,4,5...という順序でない場合がありそうです。
>## 未確認
ちゃんと確認してくださいね(笑
ActivePage から探してるでしょ。
わたしの方法が貼り付け順序に依存してない唯一の方法ですよ
あっ、にしのさんのコメントの意味がわかりました。
むしろ貼り付け順序に依存するコードでなきゃダメってことですね。
分かりました。
ツイート | ![]() |