ル ) の PasteToList1 と Bo 眈 unl の部分に注目 してください , 多くのプロバティが設定さ れたにもかかわらず , Caption や EnabIed な どのプロバティが記録されていません。イ べントハンドラもです。これはいったいど うしたことでしよう ? これはコンポーネントのプロバティが 「リンクされた」状態になっていることを表 しています。コンポーネントの Action プロ パティにアクションを指定すると , コンポ ーネントとアクションの間には , 「アクシ ョンリンク」と呼ばれる双方向リンクが開 設されます ( Fig. 5 ) 。 「リンクされた」コンポーネントのプロバ ティ / イベントは , 対応するアクションの プロバティ / イベントが変化すると自動的 に同じ値に変化します。ひとつのアクショ ンが複数のコンポーネントと接続される と , アクションリンクはコンポーネントご とに作成され , アクションのプロバティの 変化はアクションリンクを介して接続され たすべてのコンポーネントのプロバティ / イベントに伝えられます。これは設計時で も実行時でも同じです。 「リンクされた」状態とはプロバティ / イ べントの個々の状態であることに注意して ください。たとえば , ボタン (Button1) の C 叩ⅱ on プロバティをアクション (PasteToL is c ⅱ on ) とは異なるものに変えると C 叩ⅱ on プロバティは「リンクされていない」状 態になります。この状態では Bu 眈 onl の Ca ption はアクションと連動しません。つま り連動はアクションからコンポーネントへ の一方通行であることに注意してくださ い。イベントも同様で , ボタンの OnClick イベントをアクションリンクの OnExecute のハンドラ以外に設定すると「リンクされ ていない」状態になります。コンポーネン トのプロバテイやイベントをアクションの プロバティ / イベントと同じ値に戻すと , 「リンク」が復活します。 なお , 「リンクされた」ということを示す プロバティの値は , フォームファイル ( *. dfm) にはセープされません。アクション 側の値さえフォームファイルにセープされ Fig. 5 アクションとコンボーネントの関係 メニュー項目 Action CaptiO n Checked Enabled H el pCO ntext Hint lmagelndex S hortC ut Visible OnClick ボタン Action Caption Enabled HeIpContext Hint Visible OnCIick アクションリンク アクションリンク れば , それで十分だからです。 繰り返しになりますが , プロバティ / イ べントの「連動」はアクションからコンポー ネントへの一方通行であることに注意して ください。コンポーネント間でプロバティ がアクションを介して連動するわけではあ りません。 たとえば , TCheckBox コンポーネント はマウスクリックで簡単に Checked プロバ ティを変更できます。しかし , この変更は アクションには伝わりません。 Checked プ ロバティをコンポーネント間で連動させる には , アクションの OnExecute イベントで C + + BuiIderODeIphi [ 解体新書 明示的にアクションの Checked プロバティ を更新する必要があります。 アクションの効用 仕組みがわかったところで , アクション をなぜ使うのか ? アクションを使うとど のような利点があるのかをまとめておきま しよう。 アクションを使う効用は , コンポーネン トのプロバティとイベントをアクションに 「リンク」させることで複数のコンポーネン トの状態と動作をひとつのアクションで集 VCL 解体新書 131 アクション Caption Checked Enabled HeIpContext Hint lmagelndex ShortCut Visible OnExecute
Fig. 7 コンボーネントとアクションの実行処理 マウスクリックなど コンポー ネント OnClick と OnExecute がリンクされていない ショートカットの押下 アクションの更新処理 (Fig. 6 ) アクション OnClick と OnExecute がリンクされている トレベルやアプリケーションレベルで行う ときに便利です。また , アクションリスト の OnUpdate や AppIication の OnActionUpdat e イベントの Handled 引数を True にして返 すと , アクションの OnUpdate イベントの 実行を禁止できます。 アクションの OnExecute イベントの実行 次にアクションの OnExecu イベントが どのように実行されるかを説明しましょ アクションを用いない場合 , ボタンをク コンボーネントの OnClick イベント を実行 TControl.Click の違い ( Delphi 3/C + + BuiIder 3 以前 } procedure EontroI.Click; begin if Assigned(FOnClick) then FOnClick(SeIf); { Delphi 4/c + + Builder 4 以降 } procedure TControI.CIick; begin if Assigned(FOnClick) and (Action ◇ nil ) and (@FOnClick ◇ @Action.OnExecute) then FOnClick(Self) else if not (csDesigning in ComponentState) and (ActionLink ◇れ ) then ActionLink. Execute else if Assigned(FOnClick) then FOnClick(Self); Enabled=False 処理済み の . OnExecute の実行 アクションの属するアクションリスト アクションの . OnExecute の実行 処理済み Application. OnExecuteAction の実行 イベントが起こるだけです。 クションを使わない場合と同様 , OnClick ck と OnExecute が一致していない場合 , ア リンクしていない場合 , つまり , OnCIi 変わります。 「リンク」しているかどうかで処理が大きく トとアクションの OnExecute イベントが ます。この場合 , ボタンの OnClick イベン クリックした場合の動作の流れを示してい Fig. 7 はアクションを設定したボタンを 少々複雑な処理が行われます。 す。しかし , アクションを指定した場合は リックすると OnC1ick イベントが起こりま C + + BuiIderODeIphi 乢 [ 解体新書 リンクしている場合 , つまり OnClick と OnExecute が一致している場合は Fig. 7 で 示されているように いきなり OnClick が 実行されるわけではなく , ・アクションの更新処理 ・アクションが属するアクションリスト の OnExecute イベント ・ Application の OnExecuteAction イベン ト ・アクションの OnExecute イベント というように実行されます。 このように「リンクされている / いない」 で動作が変わるのは Delphi 4 , C + + Builder 4 以降では TCon け 01 の OnC ⅱ ck を起こすイベ ントディスパッチャ TControl. Click が List 5 のように変更されているからです。これは とても重要です。 アクションリストの OnExecute イベント と Application の OnActionExecute イベント は , アクションの実行処理において , アク ションリストレベルで共通処理を実行した り , アプリケーションレベルでの共通処理 を実行するのに便利です。また , アクショ ンリストの OnExecute イベントと Applicati on の OnActionExecute イベントには引数と してアクション自身と Handled が渡されま すが , HandIed 引数に True を返すと , 個々 のアクションの OnExecute イベントの実行 を禁止できます。 おわりに こまでアクションコンポーネント (T Ac ⅱ on ) の使い方を説明しましたが , 実は これはアクションの使い方の半分でしかあ りません。 アクションコンポーネントには TAction とは別に TCustomAction から派生するさま ざまなアクションコンポーネントが用意さ れており , これらは TAc ion とはまったく 異なる機能を持っています。また , このア クションコンポーネントを自作することが できます。 次回はこれらアクションコンポーネント のもうひとつの顔を解説します。 VCL 解体新書 133
中管理できること , およびアクションが自 らの状態を適宜更新して適切な状態に保つ ことです。 こで例をあげましよう。たとえば FTP クライアントソフトを作ることを考えてみ ます。 P クライアントの接続ボタンを押 してホストとのコネクションが確立する ( 1 ) ツールバー上の接続ボタンとメニュ ーの「接続」項目を淡色化して無効に する ( 2 ) ツールバー上の切断とメニューの「切 断」項目を有効にする とし , 次にホストからファイルの一覧の受 信を完了したら , ( 3 ) ツールバー上の一ボタンとメ ニューの [ Upload ] 項目を有効にする ( 4 ) ツールバー上の一ボタンと メニューの [ DownIoad ] 項目を有効に する などの処理が必要になります。 こで重要なのは , (a) 関連するツールバーのボタンとメニ ュー項目の「有効 / 無効 = Ena ed プロ パティ」を常に同じ状態に保つこと (b) 各コンポーネントをアプリケーショ ンの状態に応じて適切な状態にする になります。 (a) はこれまで説明したアク ションのプロバティとイベントの集中管理 機能で簡単に実現できます。 ( b ) はアクシ ョンを使わない場合 , アプリケーションの 状況の変化を検出してコンポーネントの状 態を「更新」しなければなりません。状態が 変わるたびにコンポーネントの状態を変更 するコードをアプリケーションのあちこち に埋め込むのはたいへんです。不可能では ありませんが , アプリケーションの規模が 大きくなるとコーディング漏れが起きてし まい , バグの元になります。 この問題はアクションの「更新機能 = On Update イベント」を使えば解決します。「ア クション側」からアプリケーションの状況 を調べ , アクション自身の状態を「更新」す ることができるのです。この「更新」に必要 132 C MAGAZINE 2 側 0 4 なコードは各アクションの OnUpdate イベ ントに分散します。コンポーネントの状態 管理はアクションに任せればよいので , ア プリケーションの作成が非常に楽になりま す。 アクションが更新される契機 アクションの OnUpdate イベントはアク ションのプロバテイやイベントを適切な状 態に更新するためのイベントです。どのよ うに使うかはプログラム例から明らかでし よう。気になるのはこの OnUpdate イベン トがいったいいつ呼ばれるかです。答えは 簡単です。 コンポーネントが表示されるとき , あ るいは表示されているときにコンポー ネントに関連付けられたアクションか 更新される ということになります。 具体的には , まずフォーム上のコントロ ールとメインメニューのトップレベルのメ ニュー項目に関連付けられたアクション が , アプリケーションがアイドル状態 , つ まり処理が終わって入力待ち状態に入る直 前にすべて更新されます。メインメニュー のサプメニューやポップアップメニューの メニュー項目に関連付けられたアクション は , サプメニューやポップアップメニュー Fig. 6 コンボーネントとアクションの更新処理 コンボーネントの アクションの更新要求 更新要求 コンボー ネント ト アクション プロバティ . イベントの更新 が表示される直前に更新されます。またコ ンポーネントに関連付けられていないアク ションは更新されません。 こで疑問が浮かんできます。コンポー ネントに関連付けられていなくてもアクシ ョンはショートカットキーで実行可能です し , 重い処理を実行中にボタンを押した場 合などはアイドル状態が起きず , ボタンの アクションが更新されずに OnClick イベン トが起きる可能性がありえます。このよう に更新しそこなったアクションを実行して も大丈夫なのでしようか ? 実はアクションが OnExecute イベントを 実行するときはその直前にアクションの 「更新」が行われます。更新の結果 , アクシ ョンの EnabIed プロバティが F se になった 場合 , OnExecu は実行されません。また ショートカットで起動された場合はそのシ ョートカットはヒットしなかったことにな ります。つまり何の問題もありません。 安心ください。 アクションの OnUpdate が実行されると きには , その直前にアクションの属すアク ションリストの OnUpdate イベントと Appli cation の OnActionUpdate イベントが起こり ます (Fig. 6 ) 。イベントには引数としてア クションが渡ります。これらはアクション の更新を個々のアクションの OnUpdate イ べントで行うのではなく , アクションリス アクションの属するアクションリスト の . OnUpdate の実行 処理済み Application.OnActionUpdate の実行 処理済み アクションの . OnUpdate の実行
乢 [ 解体新書 C + + BuiIderODeIphi 第 3 回 アクションリスト ( 1 ) 中村拓男 (Delphian wo 面 ) Windows のインタフェイスにはさまざまなものがあり , ユーザがひとつの 機能を実行するにもメニューや前回のショートカット , ボタンなどを使いま す。今回は , これらをまとめてコントロールできるアクションリストについ て解説します。 はじめに 今回は Borland Delphi ( 以下 Delphi) /Borl and C + + BuiIder ( 以下 C + + Builder) の Ver. 4 から導入された , まだ比較的新しいコンポ ーネント「アクションリスト」を取りあげ , これを掘り下げてみます。 今回のおもなトピックは次のとおりです。 アクションリストの違い アクションと 行 ・アクションの OnExec 猷 e イベントの実 ・アクションが更新される契機 ・アクションの効用 ・プロバティとイベントの集中化 ・アクションを使ってみる 128 C MAGAZINE 20 4 ネントを使って作成します。 ットにはなく , アクションリストコンポー このコンポーネントはコンポーネントパレ クションコンポーネント (TAction) です。 今回おもに説明するコンポーネントはア 違いを簡単に説明しておきます。 として , アクションとアクションリストの 際に使ってみましよう。ここでは予備知識 細かい説明に入る前に , アクションを実 使って , 各種のアクションコンポーネント を追加したり , 削除や編集をします。この 仕組みはメニューコンポーネント ( メイン メニュー , ポップアップメニュー ) とメニ ュー項目コンポーネントや , ページコント ロールとタブシートコントロールの関係に 似ています。アクションリストではおもに アクションリストコンポーネントでは , 用意されているコンポーネントエデイタを サンプルプログラムのコード (Delphi) unit Unit1; interface Windows, Messages, SysUtiIs, Classes, Graphics, Cont て 0 , Forms, Dialogs, ActnList , Menus , StdCtr ー町 type TForm1 = class ( 0 て m ) ListBox1 : TListBox ー ActionList1: TActionList; PasteToListAction : TAction ー MainMenu1: TMainMenu; Edit1: TMenuItem; PasteToList1: NenuItem; Button1: TButton; procedure Nbject); PasteTOListActionExecute(Sender: TObject); private { private 宣言 } pub lic { public 宣言 } FO て m1 : TForm1 ー imp lementation uses ClipBrd; procedure TForm1. Nbject); begin if Clipboard. HasFormat(CF-TEXT) then PasteToListAction. 翫曜b厄d : = True else PagteToListAction. 新a国鹵 : = False; procedure TForm1. PasteToListActionExecute(Sender: TObject); begin ListBox1. ltems. ↑e北 : = *. AsText
を右クリックして , インタラクションウイ トのプロバテイから取り出したものを直接 標準添付のコンポーネントとともに利用す ザードを呼び出す。インタラクションウィ 用いるか , あるいは式を記述する。たとえ ることができる。自作コンポーネントでプ ザードではまずイベントの種類を選ぶ (Fi ば , S ⅲ ng 型の引数をとるメソッドの場合 ログラミング環境を拡充していけるのが g. 4 ) 。 こではアクションイベント ( " ボタ ほかのコンポーネントの String 型のプロバ Ⅵ sualC é4 の醍醐味だといえよう。 ンを押す " など , コンポーネントの一般的 ティを指定するか , あるいは String を返す デバッガ なアクションに対するイベント ) やマウス 式を記述すればよい。 イベント , キーポードイベントなどが選択 このインタラクションウイザードを上手 普段は標準の JDK でこと足りていても , に使えば , 簡単なイベント処理ならばほと デバッグ時に VisualCafe 4 のような統合開 できるが , どのイベントがどのようなユー ザの操作に対応しているかという程度の基 んどコードを書かずに定義することが可能 発環境が提供するデバッガの必要性を感じ 礎知識は必要である。できればイベントの である。まったくコードを書かずに本格的 る開発者も多いだろう。 VisuaICafe 4 のデ 意味を教えてくれるポップヒントやオンラ なアプリケーションを構築するのは難しい バッガは , 最近の C / C + + のデバッガと同様 インマニュアルが出てきてほしいところで に , 次のような機能を提供する。 だろうが , それでもアプリケーションの原 あるが , 残念ながらそれはないようだ。 型を手早く作りたいときにはおおいに役立 ・変数値 , コールスタックの表示 イベントを決めたら , 次はアクションの っと思われる。 ・式評価 ・ブレークポイントの設定 対象となるコンポーネントを選び , あわせ コンボーネントライブラリ て , 実行するアクション , 呼び出すメソッ 一時停止 , ステップ実行 ド , 設定するプロバティのいずれかを選択 コンポーネントプログラミングッールに 変数値に関してはクイックウォッチ ( ソ する (Fig. 5 ) 。アクションとは , 対象コン おいて要となるのはコンポーネントライプ ースウインドウで変数の上にカーソルを置 ポーネントの代表的な動作であり , ウイザ ラリの充実度である。 VisualCafe 4 がサポ くと値を表示する機能 ) も利用できる。 ード上には「 Enable the ImagePaneI 」や「 Set ートするコンポーネントは Table 2 のとお VisuaICafe 4 のデバッガのそのほかの特 the Background Color 」のようにテキストで りである。 AWT Multimedia にはやや変わ 色を TabIe 3 に示す。 動作が表示されるため , 選びやすい。アク り種のコンポーネントがあるが , 全体とし コンバイラ ションとしてあがっていない動作を選択し ては実用路線で取り揃えたコンポーネント たい場合 , メソッド呼び出しやプロバティ 群で , およそ通常の Java プログラミングで エキスパートエディションは , Java ソー 設定のリストのなかから選ぶこともできる。 必要になりそうな汎用コンポーネントはひ スコードから Java バイトコードへの変換を アクション , メソッド , プロバティのい ととおり網羅されている。 行うコンパイラに関して , JDK 標準添付の ずれを選んでも , 対象コンポーネントのい また , 新たなコンポーネントを自作する コンパイラと Symantec 独自の高速コンパ ずれかのメソッドに対する呼び出しに変換 ことも可能である。 VisualCafe 4 は JavaBea イラの両方を提供している。開発作業はコ される。ウイザードの次の画面では , この ns コンポーネントの作成をサポートするウ ンパイル , 実行 , デバッグの繰り返しなの メソッドの引数を設定する ( Fig. 6 ) 。 イザードを備え , 作成したコンポーネント で , 高速コンパイラは開発サイクルを縮め メソ はコンポーネントライプラリに追加して , ッドの引数としては , ほかのコンポーネン るうえでおおいに価値がある。 Fig. 5 対象コンボーネント , アクション , メソッド , プロバティの選択 Fig. 4 イベントの種類の選択 Fig. 6 設定値の選択 ・方知 ) こなう、で発生するイヾントを選択してくださしし 聞 5 で“ー取 1 を 4 れつゆ第生したとき実行したし動作を 舮引い則 ma リ R い ) して ( たさしし のメいに対する引まどのように与えられますか ? を 0 大壊行、第、ド呼び出し ( 0 いア助ライの 、わツトから取り出す⑨ - 0 式を入力する ア叩・テ 可皹フ 選択可能 t アジなル メド、一 第新 3 setBackgmund( CO ) ロ記壓 s getName( ) Ⅷ s ( C リ′ S ) / ふロ s 興面円齢 3 g 引・ ct ・ dTe ( ) - b00 他 ) ! b de や 鬱、劇 0 安 se 正 0 第 0 り nd ( COlOf) param8tnng() 5 ね加 sS OI ⅱ 、団磴山 0n1 ・・ t08tring() 7 第 tabPane11 町℃ uu La リ物 30 町 ) ( 団電山 OB リ Hon2 ロ 0 引 1 博 Me ( ) 円 90 旧 a an 引 1 能市 0 & 旧は側 b 町 1 回 age 日ⅶ 0n1 ~ 引 i 引 1 回的 e 日ⅶ 0 れ 2 加旧” 1 こ」鼾 eal 0 旧 80 6 な 円 100 旧 8 p 3 vmage リ R し : - action 日 component いれ旧 0 一 ( omponen 物 0 覊 d compo れ旧にを d compon をれ旧 hO 物れ ー cusG 謝 0 ( リ 5L0 引 ke 磴 3 “ d に k 町 R “ 880 ヨの ( us 。チ k 0 リ“ 戸 00P 日面日 d をグ第ア代 0 5 物を新協をれ愴 0 by 引を対 ( ompon 日は 148 C MAGAZINE 20 4
Fig. 1 アクションリストの設定 Fig. 3 ボタンの設定 Button1 : TButton ゴロ ) ネ - レ日 Action Paste TOL istAction 區 L T 叩 ] + Anchors BiDiMode bdLeftTo R 扈 O 引鵜引 False PasteToList Oaption ()S izeOonstraints) + Oonstraints Oursor は DefauIt Default False D gO は s は Drag DragKind dk D 「 DragMode dm Manual Enabled True 仟 Fo 猷 ) + Font Height 25 HeIpContext 0 H int 56 Left Modal Result 日リ t れ 1 Name オづシ : ェクトインスペクタ ャ Button1 : TButton プロバテイイベンに「 = 、 lick % 引 e 丁 0 L ist Act ion Execute OnOontextP On Drag Drop OnDragOver OnEndDock OnEndDrag OnEnter OnExit OnKeyDown Fig. 4 クリップボードからテキストをリストボックスにコピーしたときのようす オゴジェクトンスペクタ ロ オゴシェクトインスペクタ PasteToListAct lon: TAct ion PastEToL ist Oaption Category Checked F 引記 Enab led T 仕旧 HeIpOontext 0 H int lmagelndex ー 1 Na PastEToList Action ShortOut Ot 日 + Y Tag 0 PasteToL ist Act ion: T れ on プロバテイイベントー On Execute PasteToListAct ion Execute OnHint P T6 [ 氤 Ae n OnUpdate P TaL 引 ruE Fig. 2 メニュー項目の設定 ロ オフシェクトインスへクタ ゴづシェクトインスペクタ マ PasteTo L istl : TMenuIte m プロバテイイベント On Advanced 併 0 ⅸ P 〒 6 [ 氤Åc 羸取託派 e OnDrawItem On Mea.sureIte PasteTo L istl : TMenuIte m づロバテイイベン日 Act PasteTo L istActlon AutoHotkeys maParent 」 tO [ ineRedut} 旧 Parent なし ) Bitmap 圧 k mb None Oapt ion Ohecked F 引記 Default False Enabled Grouphdex 0 HeIpContext 0 Hint lmagelndex ー 1 PasteToList1 N 引れ 8 RadioItem False ShortOut Ctrl + V SubMenuImagg 0 VrsbIe リ 0 F 研Ⅲ 1 Edit こっ ) ・ズコーラ ・ TObject と TO lass ・クラス型の互換性 ・オゴジェクト型 PasteToList の Enabled プロバティがアクションの Enab い。 Fig. 1 , 2 ではメニュー項目コンポーネ ティをひとつひとつ設定したわけではあり led プロバティに連動して変化します。な ントである PasteToList1 のうち , ません。設計時にメニュー項目 PasteToLis ぜアクションの OnUpdate イベントハンド ・ Caption tl の Action プロバティに PateToListAction ラを書くだけでクリップポードの監視が可 を選択したとき , プロバティ値が PasteTo ・ Checked 能なのかはもう少し読み進んでいただくと ListAction から PasteToList1 へ自動的にコピ ・ Enabled わかります。とりあえずソースコードをコ ・ Hint ーされたのです。プロバテイだけではあり ンパイルし , プログラムを実行していろい ・ HelpContext ません。 PasteToListAction の OnExecute イ ろ試してみてください。 べントも PasteToListI の OnCIick にコピー ・ lmagelndex ・ ShortCut されています。同様に Bottun1 の Caption, プロバティとイベントの集中化 EnabIed , HeIpContext , Hint, VisibIe プロ ・ Visible の各プロバティは , アクションコンポーネ パティと OnCIick イベントにもアクション プログラム例を使ってもう少しアクショ ント PasteToListAction の同名のプロバティ (PasteToListAction) のプロバティとイベン ンリストの動きを深く探っていきましよう。 と値が同じになっていることがわかりま トがコピーされています。 Fig. 1 ~ 3 と List2 を注意深く比べてくださ す。設計時に同じ値になるように各プロバ こでもう一度 List 2 ( フォームファイ 130 C MAGAZINE 2000 4
サンプルプログラムのフォームファイル object FO て ml : TForml Left = 282 Top = 197 Width = 394 Height = 241 Caption = ' FO て ml CO ー 0 て = clBtnFace Font. Charset = SHIFTJIS—CHARSET Font . Color = clWindowText Pont.Height ま -12 Font.Name = ' M S P ゴシック ' Font. style = [ ] Menu = MainMenu1 OldCreateOrder = FaIse PixelsPerInch = 96 TextHeight = 12 object LiStBox1 : TListBox Left = 160 Top = 24 Width = 169 Height = 161 ItemHeight = 12 Tamrder = 0 object Button1: TButton Left = 24 Top = 88 Width = 75 Height = 25 Action = PasteToListAction object ActionList1: TActionList Left = 16 TOP = 24 OnExecute = PasteToListActionExecute ShortCut = 16470 {CtrI+V) caption = 'PasteToList object PasteToListAction: TAction それでは利用例を紹介します。 アクションを使ってみる フェイスを提供します。 アクションを編集するためのユーザインタ end Action = PasteToListAction object PasteToList1 : NenuItem Caption = Ed 土ビ object Edit1: TMenuItem Top = 24 Left = 80 object MainMenu1: TMainMenu アクショ ェクトインスペクタでの設定 , Fig. 4 に実 す。 Fig. 1 ~ 3 に各コンポーネントのオプジ メインメニュー , ボタンを 1 個ずつ置きま ム上にアクションリスト , リストボックス , 作ってみます。このプログラムではフォー ックスに文字列を貼り付けるプログラムを ンを使って , クリップポードからリストボ C + + BuiIderODeIphi [ 解体新書 サンプルプログラムのヘッダファイル ( C + + Bu ⅱ de 「 ) #ifndef Unit1H #define Unit1H #include く CIasses. hPP> #include く Controls. hPP> #include <StdCtrIs. hPP> #include く Forms. hPP> #include く ActnList.hPP> #include <Menus. hPP> #include く CIipBrd. hPP> class TForm1 : public TForm / / IDE 管理のコンポーネント —published: TListBox *ListBox1 ー TButton *Button1; TMainMenu *MainMenu1; TMenuItem * 辻 TActionList *ActionList1; TAction *PasteToListAction; TMenuItem *PasteToList1; VOid —fastca Ⅱ *. e ( *Sender void —fastcall PasteToListActionExecute(TObject *Sender); 〃ユーザー宣言 / / ューザー宣言 —fastcall TForm1(TComponent* Owner); private: public: #endif extern PACKAGE TForm1 * FO て ml ー サンプルプログラムのコード (C + + BuiIder) TForm1 * FO ェ m1 ・ #pragma resource ”*. dfmn #pragma package ( smart—init ) #include "Unit1. h" #pragma hdrstop #include <VCI . h> ListBox1->Items->Text = CIipboard( )->AsText; void —fastca Ⅱ TForml : : PasteToListActionExecute ( Nbject *Sender ) PasteToListAction->Enab led = fal se; PasteToListAction->Enab led = true ー if ( CIipboard( ) → HasFormat(CF-TEXT) ) void —fastcall ↑ FO て m1 : :PasteTOListActionUpdate(TObject *Sender) ・ TForm(Owner) —fastcall TForm1: :TForm1(TComponent* Owner) 行のようすを示します。ソースコードとフ オームファイルの内容は ListI ~ 4 を見てく ださい。すべてのソースコードは , 付録 CD - ROM に収録されています。 このプログラムを実行すると , ・フォーム上のボタンをクリックする ・キーポードから + 団を押す ・メニューから PasteToList を選ぶ のいずれかで , クリップポードからテキス トがリストボックスに貼り付けられます。 これを実行しているのが PasteToListAction の OnExecu に結び付けられたイベントハ ンドラ「 PasteToListActionExecute 」です コードがひとっしかないのにボタンとメニ ートカットの 3 種類の方法で実 ューとショ 行することができます。また , クリップポ ードにテキストがないときは , メニュー項 目やボタンを淡色化し , コピーを実行でき ないようにしています。これは PasteToLis VCL 解体新書 129 ると自動的にメニュー項目とボタンの両方 態に応じて変更しているだけです。こうす EnabeId プロバティをクリップポードの状 が , このハンドラは PasteToListAction の 行っています。ソースを見るとわかります ントハンドラ「 PasteToListActionUpdate 」が tAction の OnUpdate に結び付けられたイベ
4 ApriI 2000 Cover 〃 ra 加れ秋山育 /Design 持田哲 画像処理を極める アルゴリズムラボく第 7 回 > 減色処理の実装昌達 K'z Windows Programming Tips く第 5 回 > スクリーンセーバの作成 tatsuya もっと探求 C + + BuiIder&DeIphi VCL 解体新書く第 3 回 > アクションリスト ( 1 ) 中村拓男 EDITORS' ROOM CD-ROM Contents READERS' ROOM C マガ電脳クラブく第 109 回 > クロススクエアドナンバーパズル吉柄員樹 フィンローダのあつばれご意見番く第 94 回 > 陽はまた昇るか ? 学問のススメ千言万語く第六十四語 > Mother tongue きだあきら C MAGA Bookends ニュース MONTHLY HEADLINE 最新開発環境レポート JProbe Suite 2.5J 礒山賢司 最新開発環境レポート VisuaICafe 4 ひぐべん工房 く第 124 回 > Java のデータ構造の操作劇 te 「 a を使うと便利岩谷宏 c 言語フォーラム恥ずかしながらドジりました 真紀俊男のローテク講座 Low Technique Course く第 50 回 > 努力は地獄の巻 in Ⅳわ 0 / e orin part, in any form wlthoutpermission. Printed in Japan. 〃 rights reserved. Ⅳ 0 material in this publication maybe reproduced. Copynght ◎ 2000 S0ftbank Publishing lnc.. アök / 0. Ed に 0 朝た Phone ( 03 ) 5642 ー 8788 Sales: Phone ( 03 ) 5642 ー 8m0 dve 市 S / hg : Phone ( 03 ) 5642 ー 8 ⅱ 7 Editorial and Business Offices: 24 ー 7 , Nihonbashi—HakozakichO. Chuo¯ku, TOKYO. 703 ー 8508. , JAPAN P リわ〃 s わ e 「 : Makoto Okazaki publishing Director: TOS ん 0 lnaba Ed1tor¯in¯Chief: Jun-ichi Watanabe C MAGA 刀 NE ・ GKit0CX トライアルバージョン ・ WZ EDITOR with WZ EDITOR 4.0 評価版 ・ LSI C -86 Ver. 3.30C ー ・ BorIand JBuiIder Foundation 特別付録 CD-ROM ・本誌および付録 CD - ROM に掲載されたすべてのプログラムは著作権法上 , 個人で使用する目的以外で無断で複製することは禁じられています。 ・本記事中のプログラム名、システム名 , CPU 名は一般に各メーカーの登録商標です。とくに事情がないかぎり , 本文中では TM , ⑧マークは明記していません。 116 124 128 134 138 146 150 156 161 164 166 168 170 172 174
M02 す HEADLINE ormation Server) 用の Web アプリケーシ を用意します。この . SRF ファイルには まとめ ョンを構築できます。 ATL Server は ISA HTML で記述しますが , そのなかに { { T Ⅲ 今回発表された機能は , 次バージョン 円を通して IIS にネイティブにアクセス e } } のようなニ重の中括弧でくくった単 の Visual S 扣 di0 に予定されている機能の 語を用意します。 ATL Server を使用し するクラスを提供します。 なかでもおもに Web アプリケーション て作成した DLL は , この単語をキーワー アクセスが集中すると予想される We 構築を促進する部分です。この先 , 3 年 ドとして何らかのアクションを起こした b サイトでは , 処理を行うコンポーネン 後 , 5 年後を考えたときに , Web アプリ り , この単語自体を書き替えることがで トのパフォーマンスの低さがネックにな ケーションの重要性は Windows アプリ きます。現時点では米 Mic 「 0S0 負は He 恥 る場合があります。また , 現在の VisuaI ケーションを超えているかもしれませ C + + でこのようなコンポーネントを作成 WorId と書き替えるような例しか提示し すると , インプリメントすべきコード数 ていませんが , 使い方によっては HTML ん。マイクロソフトは Windows DNA ア ーキテクチャを推奨していますが , Win に多彩な表現を加えることが可能になり がかなり多くなります。 ATL Server は dows DNA に準拠したアプリケーション このようなアクセス数の多い Web サイ そうです。 であれば容易に We b への展開が行えま トや , 複雑な処理を行うためにトランザ Visual BasiC lnnovations す。このようなインターネットのさらな クションごとの対応時間がかかってしま る普及を見越して , 次バージョンの Visu Visual Basic の文法にも手が加えられ うと予想される場合に威力を発揮しま Studi0 はより Windows DNA に向けて ています。 Visual Basic 6.0 まではでき す。 進化した開発ツールになるもようです。 なかったクラスの継承やメソッドのオー また , ATL Server Application Wizard 気になる発売時期についてはまだ先 バロードなどや try ・・ が用意されるので , 作成された雛型にコ ・・ catch ・・・・・ finally で , どうやら 1 年の発売になるようです。 ードを埋め込むだけで ATL Server アプ といった例外処理など , C + + でサポート なお , 今回紹介した内容は , まだ開発途 しているオブジェクト指向の文法が反映 リケーションを構築できます。 中であり , 発表されている機能や開発環 されています。現行バージョンでもコン では , 具体的に ATL Se Ⅳ e 「でどのよ 境のスクリーンショットは変更される可 パイラバックエンドは Visual C + + のコン うなことができるか見てみましよう。 A 能性があります。今後 , 日米で開催され パイラバックエンドと同様のものを使用 TL Se rve 「で構築した D LL ファイルは , る TechED, VCDC などでさらに新機能 Web サイトごとの旧 A 曰 DLL として使用 しているので , より Visual C + + のコンパ イラを活用できる形式に文法が進化して が発表されると予想されます。 されます。この DLL のほかに . SRF ( サー ( 田中らば ) フと読みます ) という拡張子のファイル います。 Fig. 1 新規プロジェクト作成ダイアログ Fig. 2 公開された次バージョンの Visual Studio の開発画面 ! W 新 F 復ー A を 日 on Te 日 0X1 團玳ル 01 み ロ , 日 5 ⅱーヨ恒矼一ヨ F2J i ( ー P ー・ ct ・ 3 ー山 W ・ bB tonf OnCIick(< し oa 、畩ト凱総 ( セ d. 当 d localho 、 t 洋、 1 、一 0 「 k 、 2 - M に「 0 、 Ott H 谷、に一 d を丨月 、に w P ロリに ( を ゴロ : 5 洋 M 0 : 2 ・い国 0 物・ 日 0 明いト、 2 D設飜 . xrd ーに黻 60 ー 5 ッ女ィれ . A . W 吐 ( れ , 釜ー、地 ( + + 円 0 第 ( ・ロ、物 FO メ 0 。し : ー合 01 ロ 5 物 [ 川 0 炊 ts 0 」い ves ーい一・ entprice CurrentVdlue い「いド、 物 # # を第ツ # を を・ま Cre 00 「旧 wW ⅸ 8 翁第取にトム。求加 店 0 と 20 試最 : ′め炉呶曾ⅸ e ・ WeE 新研冊廴 ( 回 0 ド : ″ 3 MONTHLY HEADLINE 157