このドキュメントでは、次のトピックについて説明します。
このセクションでは、ツリービューコントロールおよびリストビューコントロールの項目ラベルを編集するプロセスについて説明します。 ここでは "項目" という言葉を、"ツリービュー項目" および "リストビュー項目" の代わりに使用します。
項目のラベル編集は、禁止されていない限り(下記参照)、以下の 3 つの方法のいずれかで開始できます。
ユーザーが選択した項目のラベルをクリックする。
ユーザーが F2 キーを押す(フォーカスのある矩形の項目があれば編集可能)。
プログラムで EDIT-LABEL
アクションを呼び出す。
開始方法に関係なく、Natural によって実行される一連のアクションは同じです。
コントロールの MODIFIABLE
属性が確認されます。 この属性が FALSE
の場合(コントロールの属性ウィンドウで[変更可]オプションが選択されていない場合など)、これ以上アクションは実行されず、ラベル編集モードは開始されません。
コントロールの ITEM
属性が、ラベル編集が要求されている項目("ターゲット" 項目)のハンドルに設定されます。
抑制されていない場合、そのコントロールの BEFORE-EDIT
イベントが発生します。
ターゲット項目の MODIFIABLE
属性が確認されます。 この属性が FALSE
の場合、これ以上アクションは実行されず、ラベル編集モードは開始されません。
ラベル編集モードに入ります。 Esc キーを押すと、入力した変更をすべてキャンセルできます。 この場合、元のラベルがリストアされ、編集モードは終了します。これ以上アクションは実行されません。 一方、Enter キーを押すか、または別のウィンドウやコントロールにフォーカスを移すと、変更を確定できます。
ターゲット項目の STRING
属性が、新しいラベルテキストで更新されます。
抑制されていない場合、そのコントロールの AFTER-EDIT
イベントが発生します。
項目のラベルとその項目の STRING
属性が同一でなくなった場合(つまり、AFTER-EDIT
イベント中にアプリケーションによって属性が変更された場合)、項目のラベルも変更に合わせて更新されます。
BEFORE-EDIT
イベントの目的には、2 つの部分があります。 1 つは、特定のコンテキストに従って、アプリケーションでダイナミックに項目の MODIFIABLE
属性を設定できるようにすることです(これにより、ラベル編集を有効化/無効化できます)。 もう 1 つは、後で実行される AFTER-EDIT
イベントでリストアする場合に備えて、元のラベルをアプリケーションで保存できるようにすることです。
AFTER-EDIT
イベントには、以下の 4 つのオプションがあります。
何もしない。この場合、新しい項目ラベルが受け入れられます。
新しいラベルを拒否する。項目の STRING
属性の元の値(BEFORE-EDIT
イベントで保存)がリストアされます。
新しいラベルを拒否する。項目の STRING
属性を、新しい値とも元の値とも異なる、別の値に設定します(例えば、ユーザーが入力したラベルを黙って "修正" する場合など)。
項目の編集モードに戻る。(おそらく、新しく入力されたラベルが無効であることを伝えるメッセージボックスを表示してから)強制的にユーザーにもう一度ラベルを変更させます。
上記のトピックの実践例として、以下の例を考えてみます。 まず、後で必要となるローカルデータ変数をいくつか定義します。
01 #CONTROL HANDLE OF GUI 01 #ITEM HANDLE OF GUI 01 #LABEL (A) DYNAMIC 01 #POS (I4)
定義が終了したら、編集する項目の既存のラベルをダイナミック変数 #LABEL
に保存するだけの簡単な BEFORE-EDIT
イベントを記述します。
#CONTROL := *CONTROL #ITEM := #CONTROL.ITEM #LABEL := #ITEM.STRING
上記の手法のいくつかを説明するために、以下のような AFTER-EDIT
ハンドラを使用します。
#CONTROL := *CONTROL #ITEM := #CONTROL.ITEM IF #ITEM.STRING = ' ' #ITEM.STRING := #LABEL ELSE EXAMINE #ITEM.STRING TRANSLATE INTO LOWER EXAMINE #ITEM.STRING FOR ' ' GIVING POSITION #POS IF #POS > 0 PROCESS GUI ACTION CALL-DIALOG WITH #DLG$WINDOW #ITEM 'EDIT-LABEL' FALSE END-IF END-IF
上記のコードにより、以下のアクションが実行されます。
新しい項目ラベルが空白のみの場合、BEFORE-EDIT
イベントで保存した元の項目ラベルがリストアされます。
そうでない場合、新しい項目ラベルは小文字に変換されます(EXAMINE TRANSLATE
)。
新しい項目ラベルに空白が含まれている場合、そのデータを無効とみなしてこの項目に対する非同期のユーザー定義イベントを発生させ、ユーザーにデータの訂正を(後で)要求します。
非同期のイベントにより、無効な項目ラベルは一時的に受け入れられます。 ただし、ユーザー定義の EDIT-LABEL
イベントが発生するとすぐに、データが無効で訂正が必要であることを伝えるメッセージボックスをユーザーに表示して、ラベル編集モードに再び入ります。 これは、ダイアログの DEFAULT
イベントハンドラに記述された、以下のようなコードによって実行されます。
IF *EVENT = 'EDIT-LABEL' #ITEM := *CONTROL OPEN DIALOG NGU-MESSAGEBOX USING #ITEM.PARENT WITH #BUTTON 'Invalid data - please re-enter' 'Label Edit' '!O' PROCESS GUI ACTION EDIT-LABEL WITH #ITEM GIVING *ERROR END-IF
文字列に編集マスクやラベルの最大長を設定したり、さらに大文字のみを認めるよう指定したりする場合、項目の EDIT-MASK
属性、LENGTH
属性、または "大文字(U)" STYLE
フラグをそれぞれ設定することにより、コードをまったく記述することなくこの処理を実現できます。 編集マスクを指定した場合、編集マスクに合致しないラベルが入力されると、Natural によって元のラベルが自動的にリストアされ、ビープ音が鳴らされます(有効な場合)。
項目のラベルは、STRING
属性を使用して直接設定できます。 次に例を示します。
#ITEM.STRING := New label'
#ITEM
は、対応するツリービュー項目またはリストビュー項目のハンドルです。
この場合、項目の編集マスク(存在する場合)のみが使用されます。 前述のラベル編集に関する他のすべてのポイントは、ここでは適用されません。 特に次の点に注意してください。
ラベルはコントロールおよび項目の MODIFIABLE
属性の値に関係なく変更されます。
BEFORE-EDIT
イベントおよび AFTER-EDIT
イベントは発生しません。
コントロールの ITEM
属性は設定されません。
項目の "大文字(U)" STYLE
フラグが設定されていても、テキストは自動的には大文字に変換されません。
指定されたラベルは、項目の LENGTH
属性による長さの制限(存在する場合)を超えることができます。