簡潔な記述

解決


monst  2004-02-27 18:52:40  No: 7384

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;


take  2004-02-27 19:45:54  No: 7385

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の記述が単調なものになりますが
ここは仕方ないかと思います。


jok  2004-02-27 20:26:35  No: 7386

こんなのは?

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;


よし  2004-02-27 21:59:06  No: 7387

ScrollBoxの命名が必ずpagecontrol1.ActivePage.TabIndex+1と一致する前提とするなら、

i:=pagecontrol1.ActivePage.TabIndex+1;
Sb:=FindComponent('ScrollBox'+IntToStr(i)) as TScrollBox;
※ひょっとしたら、pagecontrol1.ActivePage.FindComponentの方が良いかも

という感じでもできますね

ではでは


にしの  2004-02-27 22:27:13  No: 7388

jokさんのコードの場合、コンポーネントの貼り付け順序によっては、1,2,3,4,5...という順序でない場合がありそうです。
# 未確認
私の場合、切り取ってテキストエディタで修正し、また張り直す、ということを良くやるので・・・^^;

よしさんの方法か、takeさんの方法+よしさんの方法(配列に格納する部分をループで処理させる)がよろしいかと思います。


monst  2004-02-28 00:05:56  No: 7389

ScrollBoxの命名がpagecontrol1.ActivePage.TabIndex+1と一致していますので
よしさんの方法で極めて簡潔にできました。
jokさんの味わい深いコードはたいへん勉強になりました。
御教示いただきました皆様ありがとうございました。


jok  2004-02-28 01:20:38  No: 7390

>jokさんのコードの場合、コンポーネントの貼り付け順序によっては、1,2,3,4,5...という順序でない場合がありそうです。
>## 未確認

ちゃんと確認してくださいね(笑
ActivePage  から探してるでしょ。
わたしの方法が貼り付け順序に依存してない唯一の方法ですよ


jok  2004-02-28 01:25:06  No: 7391

あっ、にしのさんのコメントの意味がわかりました。
むしろ貼り付け順序に依存するコードでなきゃダメってことですね。
分かりました。


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

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






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