Page History
[ |../../index.htm#lansa/l4wdev06_1040.htm]
現在地:
...
配列とは異なり、コレクションでは索引によるキーは必要ありません。この例では、社員のコレクションは番号ではなく#Surnameフィールドがキーになっている点を除くと例1と同じです。
社員の名前を入力し、保存ボタンをクリックすると、社員名がコレクションに保存されます。
表示ボタンをクリックすると、コレクションに入力されたすべての社員がメッセージ・ボックスに表示されます。
コレクションのキーは、#SurNameで一意であるため、重複する名前はコレクション内の既存のアイテムを更新します。
コレクションの定義
社員名を保存するコレクションは、以下のように定義されます。
...
Define_Com Class(#Prim_kCol<#GiveName #SurName>) Name(#Employee)
...
コレクションの名前は、#Employee
社員の#GiveName(名前)を収集
キーは、一意の社員の#SurName(名字)
例2:索引によるキーが必要ないコレクション
コレクションへのアイテムの追加
社員の名前全体をコレクションに保存するコードは、保存ボタンのClickイベントに置かれます。
...
Set Com(#Employee<#SurName>) Value(#GiveName)
上の例では、コレクションは#Surnameフィールドでキーが付けられているので、例1のように次の使用可能なコレクション・アイテムのキーを計算する必要がありません。
例2:索引によるキーが必要ないコレクション
コレクション・アイテムの操作
コレクション内の各アイテムには、For/EndForループを使用してアクセスします。
表示ボタンのClickイベントは、各社員の#GiveNameと#Surnameの値をメッセージ・ボックスに取得するFor/EndForループを使用してコレクション内の各エントリーの参照を繰り返します。
For Each(#Employee_GiveName) In(#Employee) Key(#Employee_SurName)Use Builtin(MESSAGE_BOX_ADD) With_Args('Employee' #EMPLOYEE_GIVENAME.VALUE #EMPLOYEE_SURNAME.VALUE 'was found in the collection.')Endfor
...
上の例では、以下のことに注意してください。
For/EndForループは、変数の名前(#Employee_GiveName)が参照されるたびにキーの名前(#Employee_SurName)を指定して現在のコンポーネントのキーにアクセスします。この方法で、#Surnameフィールドの値がメッセージに取得できます。
例2:索引によるキーが必要ないコレクション
コレクションの例2のソース・コード
コレクションの作成方法を見るには、このソースをコピーしてフォームに貼り付け、フォームをコンパイルして実行してください。
Function Options(*DIRECT)Begin_
...
Com Role(*
...
EXTENDS #PRIM_FORM)
...
Clientheight(124)
...
Clientwidth(363)
...
Height(151)
...
Left(269)
...
Top(185)
...
Visualstyle(#VS_NORM)
...
Width(371)
...
* Using a Keyed Collection (PRIM_KCOL)
...
as a keyed array.* Define the keyed collection to be used to store employee names.* The collection is named #Employee.* It collects an employee's #GiveName (given or first name).
...
* It is uniquely keyed an employee's #SurName (last name or surname).Define_Com Class(#Prim_kCol<#GiveName #SurName>) Name(#Employee)* Define the form.* Field #GIVENAME allows the employee's given/first name to be input.* Field #SURNAME allows the employee's last or surname to be input.* Button #PHBN_SAVE saves employee names into the collection.*
...
Button #PHBN_SHOW shows the details of all the employees in the collection.Define_Com Class(#GiveName.Visual) Name(#GiveName) Displayposition(2) Height(19) Left(16) Parent(#COM_OWNER) Tabposition(1) Top(16) Width(329)Define_Com Class(#SurName.Visual) Name(#SurName) Displayposition(1) Height(19) Left(16) Parent(#COM_OWNER) Tabposition(2) Top(40) Width(329)Define_Com Class(#PRIM_PHBN) Name(#PHBN_SAVE) Buttondefault(True) Caption('Save ') Displayposition(3) Left(152) Parent(#COM_OWNER) Tabposition(3) Top(80) Width(97)Define_
...
Com Class(#PRIM_PHBN)
...
Name(#PHBN_SHOW)
...
Caption('
...
Show ')
...
Displayposition(4)
...
Left(264)
...
Parent(#COM_OWNER)
...
Tabposition(4)
...
Top(80)
...
* -------------------------------------------------------------------------* #PHBN_SAVE.Click :Save the detail on an employee in the keyed collection*
...
-------------------------------------------------------------------------
...
Evtroutine Handling(#PHBN_SAVE.Click)
...
*
...
Save the employee's name into the keyed collection.* The collection is uniquely keyed by #SurName so a duplicate* name will update the existing item in the collection.Try putting
...
* in 2 employees with the same surname (eg:JONES).
...
Set Com(#Employee<#SurName>)
...
Value(#GiveName)
...
* Clear the name fields ready for input of the next name
...
* and reset the focus to the first name fieldChange Field(#GIVENAME #SURNAME) To(*NULL)
...
Invoke Method(#GiveName.SetFocus)
...
Endroutine
...
* -------------------------------------------------------------* #PHBN_SHOW.Click :Build a message of all the employees saved*
...
-------------------------------------------------------------
...
Evtroutine Handling(#PHBN_SHOW.Click)
...
* Iterate through the collection referencing each entry in the
...
* collection as an object by using a for / end for loop.For Each(#Employee_GiveName) In(#Employee) Key(#Employee_SurName)Use Builtin(MESSAGE_BOX_ADD) With_Args('Employee' #EMPLOYEE_GIVENAME.VALUE #EMPLOYEE_SURNAME.VALUE 'was found in the collection.')Endfor
...
* Show the employee count and final resultsUse Builtin(MESSAGE_BOX_ADD) With_Args('There are' #EMPLOYEE.ITEMCOUNT 'employees currently in the collection.')Use Builtin(MESSAGE_BOX_SHOW) With_Args(OK OK INFO *COMPONENT)
...
Endroutine End_Com
...
例2:索引によるキーが必要ないコレクション
...



