Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

プログラムでは、アクションでコレクションを作成して組み込み、他のコンポーネントにコレクションを渡して処理し、最後にコレクションを破棄する必要がある場面が数多くあります。

この例では、ボタンのコレクションを動的に作成し、操作し、すべてのボタンをメモリから破棄する方法を説明します。

Image RemovedImage Added

動的なコレクション

この例では、最初にボタンの動的なコレクションを作成します。

DEFINE_COM class(#PRIM_KCOL<#prim_phbn #STD_NUM>) name(#BUTTON_COLLECTION) reference(*DYNAMIC)  STYLE(Collection)

reference(*DYNAMIC)を指定すると、フォームがロードされるとき(通常のDEFINE_COMステートメントではこうなる)ではなく、明示的に参照が作成されるときにのみコレクションを作成するようLANSAに指示します。コレクションを明示的に作成する利点は、後になって好きなときに参照を*NULLに設定して破棄できることです。

実行時に作成されるコレクションとボタン

Image AddedImage Removed
実行時に、ユーザーが作成するボタンの数を入力し、Create Buttonsボタンをクリックした場合にコレクションが存在しないときは、SET_REFコマンドを使用して作成されます。

IF_REF com(#BUTTON_COLLECTION) is(*null)
SET_REF com(#BUTTON_COLLECTION) to(*Create_as #PRIM_KCOL<#prim_phbn #STD_NUM>)
ENDIF 

そして#STD_NUMフィールドで指定された数のボタンがコレクション内に作成されます。

BEGIN_LOOP to(#STD_NUM)
CHANGE field(#BUTTINDEX) to('#ButtIndex + 1')
USE builtin(BCONCAT) with_args('Push Button' #BUTTCHAR) to_get(#STD_TEXTL)
SET_REF com(#Button_collection<#ButtIndex>) to(*CREATE_AS #PRIM_PHBN)
SET com(#BUTTON_COLLECTION<#ButtIndex>) PARENT(#Button_Panel) WIDTH(120) CAPTION(#Std_TextL)
END_LOOP

最後に、実際に作成されます。

* Realize all the buttons just created.You can do this button by button
* but it is more efficient to do them all in one go by (re)realizing their parent ....
INVOKE method(#Button_Panel.Realize)

コレクションの破棄

...

Image Added

コレクション内のすべてのボタンは、ユーザーがコレクション全体の参照を*NULLに設定するDestroy all Buttonsをクリックすると破棄されます。

EVTROUTINE handling(#DESTROY_BUTTON.Click)
SET_REF com(#BUTTON_COLLECTION) to(*null)
ENDROUTINE

コレクションの例5のソース・コード

FUNCTION options(*DIRECT)
BEGIN_COM ROLE(*EXTENDS #PRIM_FORM) CAPTION('Setting References') HEIGHT(324) LEFT(353) TOP(146) VISUALSTYLE(#VS_NORM) WIDTH(643)
* Form layout and button details

...