ユーザーオブジェクトの使い方 ~PowerBuilder 入門!!第 7 弾 (3)~
![](/images/2023/11/48020b1a2be3cc8a05fd8e6f828e32e4.png)
みなさん、こんにちは!
このブログは、「PowerBuilder ってなに?」、「PowerBuilder ってなにができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。
キャラクター紹介
![ねこぴ自己紹介](/images/2023/05/nekopi.gif)
ねこぴ
PowerBuilder の日本語版オリジナルキャラクター。
(猫に見えるが) PowerBuilder の先生。
最近、筋トレを始めた。
![ちまき自己紹介](/images/2023/05/girl_smile.png)
ちまき
PowerBuilder をこれから学びたい開発初心者。
最近、右肩が痛い。
ある日の午後のこと・・・。
![ねこぴ話す](/images/2023/05/5e62cc2618f136451a23647fe9136a16.gif)
腹筋を鍛えようと思うんだけど・・・
今更腹筋がないことに気づいたにゃ。
![ちまき笑う](/images/2023/05/girl_laugh.png)
あの・・・
なんかアイコンいつもと違いませんか?
そして筋トレ始めたんですか?
![ねこぴ説明](/images/2023/05/5e62cc2618f136451a23647fe9136a16.gif)
そうにゃ!
何事も実践だにゃ!腹筋がなくても実践だにゃー!
ということで、ユーザーオブジェクトの内容が分かったところでさっそく使い方を実践してもらおうかにゃ。
![ちまき説明](/images/2023/05/girl_laugh.png)
今日のテーマですね!!!
前回はユーザーオブジェクトの継承について深く掘り下げた回でしたよね!
![ねこぴ説明](/images/2023/05/5e62cc2618f136451a23647fe9136a16.gif)
そうにゃね。
今回は「ユーザーオブジェクトの集大成」ということでまず先祖を作成し、その後に他の機能を兼ね備えた子孫を作成してもらおうかにゃ。
![ちまき疑問](/images/2023/05/girl_question.png)
えーっと・・・
継承!ですね?
![ねこぴ説明](/images/2023/05/5e62cc2618f136451a23647fe9136a16.gif)
そうだにゃ。
今回の方法でより実践に近い使い方を感じてくれるといいにゃ~。
前回のブログでは「ユーザーオブジェクトの継承」について解説しました。
今回はユーザーオブジェクトの使い方を実践に基づいて解説したいと思います。
![](/images/2024/01/ce81797bfc922bd0530407c907d1531f-1.png)
PowerBuilder って何なの?と思ったあなた!
PowerBuilder 入門ブログシリーズ第 1 弾をぜひご覧ください(^◇^)
PowerBuilder とは? ~PowerBuilder 入門!! 第 1 弾~
動画で分かりやすく PowerBuilder について知りたいなあという方は・・・
YouTube で PowerBuilder 入門シリーズの動画を公開中!なので要チェック★
最新版はこちら↓↓
![タイトル画像](/images/2023/05/f18f3fb026caa2bdebdcedbf518252d7.png)
ではユーザーオブジェクトをどのように使用すればいいかを実践するため、
例題を出しますね!
標準ビジュアルを使用してエディットマスクをユーザーオブジェクト化し、
基本となる先祖を作成した後に別の機能を持った子孫を作成してみましょう( •̀ ω •́ )✧
つまり先祖オブジェクトを作成して子孫に継承したい機能を定義し、子孫オブジェクトにも新しく機能を定義してみようということですね!
ではさっそく、新規作成から標準ビジュアルを選択して作成してみましょう。
![新規作成](/images/2023/05/e29596e63bb8abd145bcb55d754e8ce6.png)
データ型を選択するウィンドウが出てくるので、「editmask」(エディットマスク) を選択します。
![データ型の選択](/images/2023/05/PB190_rnvLL0rcbl.png)
エディットマスクを選択すると、下記画面が表示されます。
![エディットマスク設定画面](/images/2023/05/a606f183c5c9195a02e19f58f7068a12.png)
プロパティで色々と設定を行いましょう。
あ、今回先祖にはテキストをハイライト表示する SelectText 関数を定義しますよ(o゚v゚)ノ
プロパティは全般タブの「テキスト」を空欄、「IME」の設定はなしで、マスクタブの「マスク」は空欄にし、「マスクデータ型」は 「stringmask! 」にしてみましょう。つまり、このエディットマスクに入力されるのは文字列型ということになります。
![タイトル画像](/images/2023/05/3f9788454e4c4d505c47df38f263a40d.png)
さて、次に先祖に機能を定義してみましょう。
先祖に関しては、先ほども述べた通り SelectText 関数を定義します。
定義する場所は getfocus イベントです。
getfocus イベントはフォーカスがコントロールにセットされたときに起動するものですね。
SelectText 関数はフォーカスがセットされた際、テキストを全選択するというものです。
まずは SelectText 関数からご紹介します/^o^/
SelectText 関数とは?
編集可能なコントロール内のテキストを選択するのに使用する関数のこと。
書き方 : editname.SelectText ( start, length )
editname = コントロールの名前、start = 選択範囲の先頭の位置を指定、length = 選択する文字数を指定。
戻り値はデータウィンドウおよびリストボックスの場合は Integer 型、ほかのコントロールの場合は Long 型で選択された文字数を返す。エラーが発生した場合、-1 を返す。
editname に記述できるコントロールの種類は限られているため、詳細については「Appeon PowerBuilder 2019 R3 日本語翻訳マニュアル」をダウンロードして確認してみてください( •̀ ω •́ )y
Appeon PowerBuilder 2019 R3 日本語翻訳マニュアル
「イベント リスト」タブから「getfocus」を選択して、以下のコードを記述してみましょう。getfocus イベントに記述したスクリプトとその画像は以下です。
/*フォーカス時の動作*/ This.SelectText(1,Len(This.Text))
![selecttextのコード](/images/2023/05/8c609e192a68ab6d8452d2156ea32b46.png)
では、uo_em という名前でユーザーオブジェクトを Ctrl + S で保存してみましょう。
システムツリーに uo_em オブジェクトが表示されていると思います。
![selecttextのコード](/images/2023/05/76224d14f39fd9611641b27cad6617b6.png)
これで先祖の作成は終了です。
![タイトル画像](/images/2023/05/3640edaf982b18f4ff1feb9682398753.png)
では先ほど作成した先祖から子孫を作成し、子孫にも機能を定義していきましょう。
子孫は西暦が入力できるオブジェクトにしたいと思います。
メニューバーから「ファイル」-「継承」を選択し、先ほど作成した「uo_em」の先祖オブジェクトを選択してみましょう。
![](/images/2023/05/PB190_DEUknhYs6N.png)
先祖で設定したプロパティが受け継がれ、getfocus イベントの SelectText 関数が定義されていることも確認できますね!
先祖にしか定義されていない場合は、青色のアイコンが定義されているイベント名の横につくのでした。
![](/images/2023/05/0e04434ab9635397598f21900c400245.png)
では子孫には「日付用プロパティの設定」と「losefocus イベント」を定義していきたいと思います!
「日付用プロパティの設定」から行いましょう。「プロパティ」の箇所を見てください。
![カスタムクラス](/images/2023/04/e2b228a241b5767e94aef40f2c3d4c94.png)
最初に全般タブの「テキスト」の「未設定」という文字を削除し、空欄にしましょう。
そして全般タブの「IME」を「オフ固定」に設定しましょう。
IME は、英数字や日本語など入力するエリアによって入力できる方法を設定できるプロパティです。
たとえば、システムによって「この項目は半角英数のみ」など制限したいことがあるかと思います。金額入力欄に全角の数字を入力させたくない、といった場合などですね。そういう場合に IME の機能をオフにしたうえで、切り替えもできなくしてしまえば、全角の入力を防ぐことができます。それが「オフ固定」です( -`ω-)✧
そしてマスクタブの「マスク」ですが、日付入力に合わせて「####/##/##」にし、マスクデータ型は「stringmask!」にしてください。
ちなみにプルダウンでも、入力形式を選べますよ(´▽`)
![](/images/2023/05/66c19942ab4ba346fdb64ccc04cde373.png)
続いて「losefocus イベント」を定義していきます。
losefocus イベントというのは、コントロールからフォーカスが失われた際に起動するイベントですね。
/*フォーカス移動時の動作*/ String ls_birthday This.GetData(ls_birthday) IF Trim(ls_birthday) <> "" THEN IF IsDate(String(ls_birthday,"@@@@/@@/@@")) = FALSE THEN MessageBox("エラー","入力値が有効な日付ではありません") This.SetFocus() RETURN END IF END IF
![losefocusイベント](/images/2023/05/9784367619300b71d88e323724e34694-2.png)
ここで Trim 関数と IsDate 関数をご紹介したいと思います!
Trim 関数とは?
文字列の左端と右端からスペースを削除する関数のこと。
書き方 : Trim ( string {, removeallspaces } )
string = 左端と右端からスペースを削除する文字列を指定
removeallspaces = Boolean 型の値。全種類のスペースの削除を指定。
戻り値は String 型。正常に終了した場合は、string の左端と右端からスペースを削除した文字列を返す。エラーが発生した場合、空の文字列(””)を返す。string が null の場合、Trim 関数は null を返す。
IsDate 関数とは?
文字列の値が有効な日付かどうかをテストする関数のこと。
書き方 : IsDate ( datevalue )
datevalue = String 型の値。有効な日付かどうかを確認する値を指定。
戻り値は Boolean 型。datevalue が有効な日付の場合は true を返し、そうでない場合は false を返す。datevalue が null の場合、IsDate は null を返す。
ということは・・・下記のコードは、一旦 Trim 関数でスペースを削除した後で、その数値を IsDate 関数で数値を確認し、有効な日付でないということで FALSE が返ってきたらエラーメッセージを表示するというコードですね。
最後に SetFocus 関数でフォーカスを戻しています。
/*フォーカス移動時の動作*/ String ls_birthday This.GetData(ls_birthday) IF Trim(ls_birthday) <> "" THEN IF IsDate(String(ls_birthday,"@@@@/@@/@@")) = FALSE THEN MessageBox("エラー","入力値が有効な日付ではありません") This.SetFocus() RETURN END IF END IF
では保存したいと思います。Ctrl + S を押してください。
エディットマスクに関しては「em」なので、ユーザーオブジェクトの頭文字と併せて、「uo_em」と年月日を意味する「ymd」を合わせて「uo_em_ymd」という名前にします。
![システムツリーのuo_em_ymd](/images/2023/05/uo_em_ymdPNG.png)
これで子孫の作成は終了です。
![タイトル画像](/images/2023/05/b435e14226924e58a4623ade98a31e9b.png)
たとえば以下のように、検索条件から対象者を検索してデータウィンドウに表示するアプリがあったとします(^^)/
おや、生年月日のところが空いています。
![アプリ画面](/images/2023/05/6f9d5e63460c0a6edcfe9eba31d9610c-1.png)
では、ここで先ほど作成した uo_em_ymd オブジェクトを追加しましょう。
ここで裏技ですが、システムツリーから直接 uo_em_ymd オブジェクトをドラッグアンドドロップでレイアウト画面の配置したい場所に持っていくと配置できます。ご存じでしたか?(∩^o^)⊃━☆
![生年月日を配置したアプリ画面](/images/2023/05/d253453de0c332f13707f4c521c3d76b-1.png)
今回は割愛しますが、上記のようにデータベースに登録されている生年月日から対象者を検索したい場合など、今回のユーザーオブジェクトが記述したコードに沿ってデータを照合してくれます。
他の画面で生年月日の検索が必要になれば、このユーザーオブジェクトを配置すればいちいち作成しなくても済みますね。
![ちまき喜び](/images/2023/03/girl_idea.png)
なるほどー!先祖に基本となるコードを記述することで、子孫にも継承され、さらに子孫オリジナルの機能を定義することで、楽に開発ができちゃうわけですね!
ユーザーオブジェクトさすがです!
![ねこぴ回答](/images/2023/03/nekopi.gif)
そゆことだにゃ。
これを覚えていると開発の速さも倍増にゃ!
![](/images/2024/01/f91928583fb4975f9fae2513b0af1b2f-1.png)
- -先祖に機能を定義することで、子孫に同様の機能が継承される
- -子孫にオリジナルの機能を定義できることで開発の幅が広がり、かつ素早い開発が可能になる
PowerBuilder 入門ブログシリーズ、次回の内容はこちら↓↓
アプリケーションの配布方法 ~PowerBuilder 入門!!第 8 弾 (1) ~
いかがでしたでしょうか?
より詳しく PowerBuilder に関してお知りになりたい方は、 Appeon 社の製品サイトをチェック!
「難しい言葉は簡単に、分かりやすく」をモットーに、今後も PowerBuilder についてお伝えしていきたいと思いますので、どうぞよろしくお願いします!