BETA

未だに現役!Delphiでもビジュアルプログラミング~

投稿日:2020-07-20
最終更新:2020-07-21

コードミックス・ビジュアルプログラミングStateGoのDelphi用サンプルを更新しました。
更新内容は、データフォーマット1.1への変換、管理クラスの廃止、サブルーチンとループの対応になります。

Delphiを知らない方へ

Delphiは1995年にリリースされ、パスカル言語を使用し、かつ、当時としては先進的な統合開発環境です。
大変話題になったのを覚えている方も多少はいると思います。
さて、このところすっかり鳴りを潜めていたと思っていたのですが、数年程前から無料版が登場し気軽に扱うことができるようになりました。
Win/Mac/Android/iPhoneのクロスプラットフォーム開発ツールとしてまだまだ健在です。
Delphiのパスカルはオブジェクト化されたオブジェクトパスカルで、しかもメソッドの宣言と実装場所が異なるなど、言語進化のパラダイムの途中であったことをうかがわせる構造です。
StateGoならその宣言と実装分離という面倒な部分を楽にさせつつ、ビジュアルプログラミング化が可能です。

環境

Windwos10
Delphi10.3
StateGo

サンプル

StateGoのDelphiサンプルは以下からDL可能です。
psgg-delphi-sample

サンプルの実行

  1. psgg-delphi-sampleをクローンまたはDL
  2. sample/TestControl.psggをStateGoで開く
  3. "保存と変換"ボタンを押してソースコードに変換する
  4. sample/Project01.dprをDelphiで開く
  5. ビルド (ショートカット:Shift + F9)
  6. Project01.exeを実行

サンプルの解説

フロー部分のステート

ステート 説明
[0001] "Hello World!"を表示
[0013] [E0001]の組込プロシージャを呼ぶ
[GSB001] [SBS002] サブルーチンを呼ぶ
[0012] ランダムメソッド使用準備
[0015] 乱数で0または1を発生させて、分岐
[LOP000] [SBS001]サブルーチンを10回呼ぶ

フロー以外のステート

ステート 説明
[C_0003] コメント
[E_0001] hogeプロシージャの定義
[E_0003] [LOP000]のループで使用する変数の宣言

ソースへの変換について

パスカルは宣言と実装が異なる場所となるため、変換時に工夫を行いました。

ステート関数の宣言

各ステートはステート関数(メソッド)に変換されます。
パスカルの宣言パートに全ステート関数の宣言を展開します。
ソースの展開部分は以下の通りです。

// [STATEGO OUTPUT START] indent(2) $/^S_/->#declare$  
   :  
// [STATEGO OUTPUT END]  

1行目の$/^S_/->#declare$は、"S_"で始まるステートを#declareマクロで処理することを意味します。(※"S_"は、フローに関するステートの接頭文字です。)
"#declare"は 設定内で以下の通り定義されています。

#[email protected]@@  
protected procedure [[state]](const bFirst : boolean);  
<<<?state-typ/^loop$/  
protected procedure [[state]]_cond____(const bFirst : boolean);  
protected procedure [[state]]_next____(const bFirst : boolean);  
>>>  
@@@  

このマクロはステート名([[state]])を代入して宣言文を作成します。
かつ、state-typ=="loop"時には、ループ用の関数宣言文も作成します。
下図はサンプルの該当部分になります。

参考
StateGoリファレンス-アウトプット
StateGoリファレンス-マクロ

管理クラス用ステート関数呼び出し

今回の実装においては、ステート名を文字列で扱い、実行時に文字列で検索してステート関数を呼び出します。
ソース上の展開部分は以下の通りです。

// [STATEGO OUTPUT START] indent(4) $/^S_/->#exec$  
  :  
// [STATEGO OUTPUT EMD]  

"#exec"のマクロは以下の通りです。

#[email protected]@@  
if st = '[[state]]' then begin [[state]](bFirst); goto end_proc;  end;  
<<<?state-typ/^loop$/  
if st = '[[state]]_cond____' then begin [[state]]_cond____(bFirst); goto end_proc;  end;  
if st = '[[state]]_next____' then begin [[state]]_next____(bFirst); goto end_proc;  end;  
>>>  
@@@  

各ステート毎にステート名が一致時にステート関数を呼び出すマクロです。
なお、ループの対応もされています。
下図はサンプルの該当部分になります。

組込み宣言と組込み実装

パスカルは宣言部分と実装部分が異なるため、組込み部分も同様の対応が必要になります。
下図はE_0001のアイテムテーブルです。

アイテム名 embdecを宣言用に追加してあります。
"#embdec"マクロを使い展開されます。
下図はサンプルでの展開を示します。

最後に

StateGoを使用すれば、面倒な宣言と実装の分離を自動での配置が可能です。
その結果プログラミングに集中することができます。
StateGoは、構造にとらわれないプログラミングが出来る事で、プログラミング言語を構造の違いでなく機能や環境の違いで見ることができます。それは、言語への適正ではなく、より目的にあった開発環境を選択する助けにもなるでしょう。
興味を持って頂ければ幸いです。

StateGo
StateGo Delphiサンプル

参照

whileによる繰り返し処理 (while文の書式) - Delphi プログラミング
クラスとオブジェクト(Delphi)
配列の初期化時に値を代入する - Delphi プログラミング
ステート処理はナァラティブに

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@programanicの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう