CLOSE

みなさん、こんにちは!

このブログは、「PowerBuilder ってなに?」「PowerBuilder って何ができるの?」という疑問に、IT 用語の解説もしつつ、簡単に分かりやすくお答えすることをモットーにしています。
気になる方はぜひ続きを見てみてくださいね。

登場キャラクター紹介

ねこぴ
PowerBuilder レクチャーのキャラクター。
(猫に見えるが)PowerBuilder の先生。
ゆる~く楽しく!がモットー。

ちまき
PowerBuilder をこれから学びたい開発初心者。
ITの知識はちょっとあるようなないようなレベル。

動画でも PowerBuilder について学習できます!

YouTube では、この PowerBuilder 入門シリーズの動画版を公開しています!

動画版では、実際の PowerBuilder の画面操作をしているところを確認しながら進められるので、より理解力が深まります。
あわせてぜひご視聴ください!

入門シリーズ再生リストはこちらから!

腹筋を鍛えようと思うんだけど・・・
今更腹筋がないことに気づいたにゃ。

まずねこぴ先生のお腹ってどこですか…
そして筋トレ始めたんですか?

そうにゃ!何事も実践だにゃ!腹筋がなくても実践だにゃー!
ということで、ユーザーオブジェクトの内容が分かったところでさっそく使い方を実践してもらおうかにゃ。

今日のテーマですね!!!
前回はユーザーオブジェクトの継承について深く掘り下げた回でしたよね!

そうにゃね。
今回は「ユーザーオブジェクトの集大成」ということでまず先祖を作成し、その後に他の機能を兼ね備えた子孫を作成してもらおうかにゃ。

えーっと・・・
継承!ですね?

そうだにゃ。
今回の方法でより実践に近い使い方を感じてくれるといいにゃ~。

前回のブログでは「ユーザーオブジェクトの継承」について解説しました。
今回はユーザーオブジェクトの使い方を実践に基づいて解説したいと思います。

PowerBuilder 入門をまずはおさらい!

PowerBuilder って何なの?と思ったあなた!
PowerBuilder 入門シリーズの第 1 弾ブログをぜひご覧ください(^◇^)

まず例題を出します

ではユーザーオブジェクトをどのように使用すればいいかを実践するため、例題を出しますね!
標準ビジュアルを使用してエディットマスクをユーザーオブジェクト化し、基本となる先祖を作成した後に別の機能を持った子孫を作成してみましょう( •̀ ω •́ )✧

つまり先祖オブジェクトを作成して子孫に継承したい機能を定義し、子孫オブジェクトにも新しく機能を定義してみようということですね!
ではさっそく、新規作成から標準ビジュアルを選択して作成してみましょう。

データ型を選択するウィンドウが出てくるので、「editmask」(エディットマスク) を選択します。

エディットマスクを選択すると、こちらの画面が表示されます。

プロパティで色々と設定を行いましょう。
あ、今回先祖にはテキストをハイライト表示する SelectText 関数を定義しますよ(o゚v゚)ノ

プロパティは全般タブの「テキスト」を空欄、「IME」の設定はなしで、マスクタブの「マスク」は空欄にし、「マスクデータ型」は 「stringmask! 」にしてみましょう。
つまり、このエディットマスクに入力されるのは文字列型ということになります。

では先祖に機能を定義してみましょう

さて、次に先祖に機能を定義してみましょう。
先祖に関しては、先ほども述べた通り SelectText 関数を定義します。
定義する場所は getfocus イベントです。

getfocus イベントはフォーカスがコントロールにセットされたときに起動するものですね。
SelectText 関数はフォーカスがセットされた際、テキストを全選択するというものです。
まずは SelectText 関数からご紹介します/^o^/

SelectText 関数とは?
編集可能なコントロール内のテキストを選択するのに使用する関数のこと。

書き方 : editname.SelectText ( start, length )
editname = コントロールの名前、start = 選択範囲の先頭の位置を指定、length = 選択する文字数を指定。

戻り値はデータウィンドウおよびリストボックスの場合は Integer 型、ほかのコントロールの場合は Long 型で選択された文字数を返す。エラーが発生した場合、-1 を返す。

editname に記述できるコントロールの種類は限られているため、詳細については「Appeon PowerBuilder 2022 R3 日本語翻訳マニュアル」をダウンロードして確認してみてください( •̀ ω •́ )y

「イベント リスト」タブから「getfocus」を選択して、以下のコードを記述してみましょう。
getfocus イベントに記述したスクリプトとその画像は以下です。

/*フォーカス時の動作*/

This.SelectText(1,Len(This.Text))

では、uo_em という名前でユーザーオブジェクトを Ctrl + S で保存してみましょう。
システムツリーに uo_em オブジェクトが表示されていると思います。

これで先祖の作成は終了です。

次に子孫にも機能を定義してみましょう

では先ほど作成した先祖から子孫を作成し、子孫にも機能を定義していきましょう。
子孫は西暦が入力できるオブジェクトにしたいと思います。

メニューバーから「ファイル」-「継承」を選択し、先ほど作成した「uo_em」の先祖オブジェクトを選択してみましょう。

先祖で設定したプロパティが受け継がれ、getfocus イベントの SelectText 関数が定義されていることも確認できますね!
先祖にしか定義されていない場合は、青色のアイコンが定義されているイベント名の横につくのでした。

では子孫には「日付用プロパティの設定」と「losefocus イベント」を定義していきたいと思います!
「日付用プロパティの設定」から行いましょう。
「プロパティ」の箇所を見てください。

最初に全般タブの「テキスト」の「未設定」という文字を削除し、空欄にしましょう。
そして全般タブの「IME」を「オフ固定」に設定しましょう。

IME は、英数字や日本語など入力するエリアによって入力できる方法を設定できるプロパティです。
たとえば、システムによって「この項目は半角英数のみ」など制限したいことがあるかと思います。
金額入力欄に全角の数字を入力させたくない、といった場合などですね。
そういう場合に IME の機能をオフにしたうえで、切り替えもできなくしてしまえば、全角の入力を防ぐことができます。それが「オフ固定」です( -`ω-)✧

そしてマスクタブの「マスク」ですが、日付入力に合わせて「####/##/##」にし、マスクデータ型は「stringmask!」にしてください。
ちなみにプルダウンでも、入力形式を選べますよ(´▽`)

続いて「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

ここで 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 オブジェクトを追加しましょう。

ここで裏技ですが、システムツリーから直接 uo_em_ymd オブジェクトをドラッグアンドドロップでレイアウト画面の配置したい場所に持っていくと配置できます。
ご存じでしたか?(∩^o^)⊃━☆

今回は割愛しますが、上記のようにデータベースに登録されている生年月日から対象者を検索したい場合など、今回のユーザーオブジェクトが記述したコードに沿ってデータを照合してくれます。
他の画面で生年月日の検索が必要になれば、このユーザーオブジェクトを配置すればいちいち作成しなくても済みますね。

なるほどー!先祖に基本となるコードを記述することで、子孫にも継承され、さらに子孫オリジナルの機能を定義することで、楽に開発ができちゃうわけですね!
ユーザーオブジェクトさすがです!

そゆことだにゃ。
これを覚えていると開発の速さも倍増にゃ!

それでは、最後におさらい!

・先祖に機能を定義することで、子孫に同様の機能が継承される
・子孫にオリジナルの機能を定義できることで開発の幅が広がり、かつ素早い開発が可能になる

こちらのブログシリーズ次回の記事はこちら↓↓

入門シリーズ全記事のまとめ

PowerBuilder 入門シリーズの全記事を、まとめページからもご覧いただけます!

PowerBuilder入門シリーズまとめ

いかがでしたでしょうか?
より詳しく PowerBuilder に関してお知りになりたい方は、Appeon 社の製品サイトをチェック!

x instagram facebook youtube