TButton

represents a click button on a Web page. It is mainly used to trigger page postback.
Webページ上のクリックボタン表現。ページのポストバックのトリガーとして主に用いられる。
TButton creates a click button on a Web page. The button's caption is specified by Text property. A button is used to submit data to a page. TButton raises two server-side events, OnClick and OnCommand, when it is clicked on the client-side. The difference between OnClick and OnCommand events is that the latter event is bubbled up to the button's ancestor controls. An OnCommand event handler can use CommandName and CommandParameter associated with the event to perform specific actions.
TButtonはWebページの上のクリックボタンを作成します。 ボタンの表題はTextプロパティによって指定されます。 ボタンは、データをページに実行するために使われます。 それがクライアント側でクリックされる時に、TButtonは2つのサーバサイドのイベント、OnClick、およびOnCommandを生じさせます。 OnClickとOnCommandイベントの違いは、OnCommandイベントがボタンの原型のコントロールまで泡立せることです。 OnCommandイベントハンドラは、具体的な行動を実行するためにイベントと関連したCommandNameとCommandParameterを使うことができます。
Clicking on button can trigger form validation, if CausesValidation is true. And the validation may be restricted within a certain group of validator controls according to ValidationGroup.
CausesValidationの設定がtrueの時には、ボタンをクリックすることで、フォーム内容の検証を行うことができます。 そして、このフォーム内容の検証はValidationGroupによる一定のバリデータコントロールグループに限定されます。

Try & Error

Try & Error の実行ページでつくったページは、http://felix-labo.org/myprado/
はじめてのコントロールなのでいろいろと試して生きたいと思います。まず、このTButtonにある例をそのままコピーしてもTContentが邪魔してうまくいかないので、以下の部分を HOME.page にコピーします。
<com:TForm>
<com:TButton
 Text="text"
 Width="200px"
 ForeColor="silver"
 BackColor="black"
 Font.Size="14pt"
/>
<br><br>
</com:TForm>
これで、myprado を更新してみると・・・ 黒いボタンが見えると思います。通常のボタンのプロパティを設定する要領ですね。・・・CSSファイルについては、別途設定が行えるようです。(いつの日かたどり着いて解説します。)
次に、ボタン実行のコマンド付きボタンを書いて見ます。上記のコードの</com:Tcom>の前に、
<com:TButton Text="click me" OnClick="buttonClicked">
<br>
を差し込みます。この状態で、myprado をあけてみてもエラーになります。OnClick に該当するメソッドの定義がないからですね。この部分は、別ファイル(クラスファイル)を同じフォルダーに作ります。名前は HOME.php です。このファイルに、
<PHP?
 class Home extends TPage
 {
  public function buttonClicked($sender,$param)
 {
  if($param instanceof TCommandEventParameter)
  {
   $sender->Text="Name: {$param->CommandName},Param:{$param->CommandParameter}";
  else
   $sender->Text="I'm clicked";
  }
?>
を記述します。そして再度mypradoをあけると、今度はうまくいきますね。ちなみにボタンをクリックすると、ボタンのキャプション(表題)が"I'm clicked"となっています。この中のphp構文のif 文のelse が適用されているのが分かります。”I'm clicked"を好きな文字に変えて遊んでみましょう!(この段階ではブラウザーを閉じて再度読み込ませる必要があります。)utf-8では、日本語へ何の芸もなく移行できます。
条件式の部分ですが、なんだろ・・・と思ってしまったのは私だけでしょうか?phpの構文か?と疑いたくなる部分ですが、 "instanceof" は、親クラスを指定した場合に、true を返すものだそうです。そりゃつかったことないわなぁ・・・ パラメーターの \( sender と  \)parame ですが、おそらくは、予約語的なパラメーターで、\( sender は、おされたボタンそのもので、 \)parame は、ボタンアクションにより引き渡される値ではないかと思います。
$param instanceof TCommandEventParameter を説明するには、もう一つ、サンプルからボタンをコピーしてくる必要がありそうです。
<com:TButton
 Text="click me"
 OnCommand="buttonClicked"
 CommandName="test"
 CommandParameter="value"
/>
<br><br>
なにやら、見たことのない属性をたくさん持っていますね。また、イベントハンドラが、”OnClick”ではなく、"OnCommand"になっています。ほうほう、そういえば、TButtonの説明に、2つのサーバーサイドイベントがあると書いてありますね。文中の・・・ The latter(OnCommand) event is bubbled up to the button's ancestor controls. については、なんのことやら分からなかったですが、どうやら、クラスファイル内の例の 条件文は、$param が、OnCommand により呼び出されたインスタンスなのか?といっているようです。そして、解説文にあるように、ボタンに、CommandName と  CommandParameter という2つのパラメーターをもてるのが、OnCommand ということみたいです。このボタンイベントは、その2つのプロパティをボタンのキャプションに指定しているメソッドになっていますね。
では、なぜ、この様なイベントが用意されているのでしょう?今は良く分かりませんが、おそらくは、フォームのステータス(状況)や、アクセスされてきたページの前後関係から、ボタンに複数の働きをさせたいとき、通常なら、hidden などの項目をもって、制御しますが、そのようなことをボタンだけで、やろうとしているのが、OnCommand なのだと思います。
この、メソッドの例にもありますが、各コントロールやパラメーターのプロパティは、 "->" で繋いで指定していますね。内部処理としては、XMLの属性指定が行われているのでしょうね。
プロパティがどのように指定されているかを見るために、以下の実験をしてみました。
<com:TButton
 ID="btn_2"
 Text="クリック前"
 OnClick="buttonClicked_2" />
<br><br>
クラスファイルのほうには、
public function buttonClicked_2($sender,$param)
{
 $strTest=$sender->ID;
 $sender->Text=$strTest;
}
と書きます。”クリック前” というボタンができますね。 クリックしてみると・・・ ”btn_2” とIDに変わります! $sender がボタンのインスタンスなので、そのプロパティのID というわけですね。
さて、ボタンなどの各コントロールが持っているプロパティはどうやってわかるのか・・・ API Manual  を除いてみると、Get・・・ と Set・・・・ という対になったメソッドが多くあるのが分かります。この ・・・ にあたるものが、それぞれのプロパティなのですね。Text もプロパティであることが分かります。
そういえば・・・、もしIDをセットしないで、IDを取得したらどうなるんでしょう。やってみると 空欄になることが分かります。ID のデフォルトは設定がないんですね。ところが、コントロールに共通でつかえるプロパティ"ClientID"を使ってみると、”ctl4” などと表示されます。なるほど、コントロールはいくつかIDを持っているといっていたが、これなのか? ちなみにこのIDは、通常HTML上で認識されるIDと同じ見みたいです。
IDが振れるので、もう一つボタンを追加して、追加したボタンから、前に作ったボタンのプロパティを操作してみます。次をHome.pageに追加します。
<com:TButton
ID="btn_3"
Text="クリック前 その2"
OnClick="buttonClicked_3">
<br><br>
HOME.php には、
public function buttonClicked_3($sender,$param)
{
 $this->btn_2->Text="下のボタンに、変えられた><";
}
を追加。アクションの部分は、$this->btn_2->setText("下のボタンに、変えられた><"); でもOK。このボタンを押すと、その上のボタンのキャプションが変更されますね。
最後は、入力値のエラー表示機能の validator との連携です。この例ではTRequestFieldValidator という空欄の場合にエラーを表示させるものを使っています。
<com:TTextBox ID="TextBox">
<com:TRequiredFieldValidator
 ControlToValidate="TextBox"
 Display="Dynamic"
 ErrorMessage="input required in the textbox"
 ValidationGroup="Group"
/>
<com:TButton Text="submit" ValidationGroup="Group" />
Validator  の説明は2節にまとまってあるようですので、そこで学習するとして、ここでわかるのは、エラー表示部分がValidatorというコントロールになっていて、そこに、チェックする対象ID "ControlToValidatie" , エラーメッセージ、"ErrorMessage" 、アクションとのグループをしていする "ValidationGroup" といったプロパティが指定できるということは分かります。ボタンにも、ValidationGroupが指定されていていますね。
Validator にはメソッド設定がありません。pageにプロパティを設定するだけで、つかえるという優れものです。
いくつかやってみて、すごく違和感があるのが、更新したり、実行したときに、データが保持されているという点ですね。これは、PRADOのステータス管理によるものと思われますが、WEBの動きとしては違和感がありますね。ただ、この方が、更新されたときのリセットを考える必要がないので、楽に書けそうです。