バージョン 6.3.3
 —  プログラミングガイド  —

ツリービューおよびリストビューコントロールでのラベル編集

このドキュメントでは、次のトピックについて説明します。


はじめに

このセクションでは、ツリービューコントロールおよびリストビューコントロールの項目ラベルを編集するプロセスについて説明します。 ここでは "項目" という言葉を、"ツリービュー項目" および "リストビュー項目" の代わりに使用します。

Top of page

ラベル編集

項目のラベル編集は、禁止されていない限り(下記参照)、以下の 3 つの方法のいずれかで開始できます。

  1. ユーザーが選択した項目のラベルをクリックする。

  2. ユーザーが F2 キーを押す(フォーカスのある矩形の項目があれば編集可能)。

  3. プログラムで EDIT-LABEL アクションを呼び出す。

開始方法に関係なく、Natural によって実行される一連のアクションは同じです。

  1. コントロールの MODIFIABLE 属性が確認されます。 この属性が FALSE の場合(コントロールの属性ウィンドウで[変更可]オプションが選択されていない場合など)、これ以上アクションは実行されず、ラベル編集モードは開始されません。

  2. コントロールの ITEM 属性が、ラベル編集が要求されている項目("ターゲット" 項目)のハンドルに設定されます。

  3. 抑制されていない場合、そのコントロールの BEFORE-EDIT イベントが発生します。

  4. ターゲット項目の MODIFIABLE 属性が確認されます。 この属性が FALSE の場合、これ以上アクションは実行されず、ラベル編集モードは開始されません。

  5. ラベル編集モードに入ります。 Esc キーを押すと、入力した変更をすべてキャンセルできます。 この場合、元のラベルがリストアされ、編集モードは終了します。これ以上アクションは実行されません。 一方、Enter キーを押すか、または別のウィンドウやコントロールにフォーカスを移すと、変更を確定できます。

  6. ターゲット項目の STRING 属性が、新しいラベルテキストで更新されます。

  7. 抑制されていない場合、そのコントロールの AFTER-EDIT イベントが発生します。

  8. 項目のラベルとその項目の STRING 属性が同一でなくなった場合(つまり、AFTER-EDIT イベント中にアプリケーションによって属性が変更された場合)、項目のラベルも変更に合わせて更新されます。

BEFORE-EDIT イベントの目的には、2 つの部分があります。 1 つは、特定のコンテキストに従って、アプリケーションでダイナミックに項目の MODIFIABLE 属性を設定できるようにすることです(これにより、ラベル編集を有効化/無効化できます)。 もう 1 つは、後で実行される AFTER-EDIT イベントでリストアする場合に備えて、元のラベルをアプリケーションで保存できるようにすることです。

AFTER-EDIT イベントには、以下の 4 つのオプションがあります。

  1. 何もしない。この場合、新しい項目ラベルが受け入れられます。

  2. 新しいラベルを拒否する。項目の STRING 属性の元の値(BEFORE-EDIT イベントで保存)がリストアされます。

  3. 新しいラベルを拒否する。項目の STRING 属性を、新しい値とも元の値とも異なる、別の値に設定します(例えば、ユーザーが入力したラベルを黙って "修正" する場合など)。

  4. 項目の編集モードに戻る。(おそらく、新しく入力されたラベルが無効であることを伝えるメッセージボックスを表示してから)強制的にユーザーにもう一度ラベルを変更させます。

上記のトピックの実践例として、以下の例を考えてみます。 まず、後で必要となるローカルデータ変数をいくつか定義します。

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

上記のコードにより、以下のアクションが実行されます。

  1. 新しい項目ラベルが空白のみの場合、BEFORE-EDIT イベントで保存した元の項目ラベルがリストアされます。

  2. そうでない場合、新しい項目ラベルは小文字に変換されます(EXAMINE TRANSLATE)。

  3. 新しい項目ラベルに空白が含まれている場合、そのデータを無効とみなしてこの項目に対する非同期のユーザー定義イベントを発生させ、ユーザーにデータの訂正を(後で)要求します。

非同期のイベントにより、無効な項目ラベルは一時的に受け入れられます。 ただし、ユーザー定義の 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 によって元のラベルが自動的にリストアされ、ビープ音が鳴らされます(有効な場合)。

Top of page

プログラムによる項目ラベルの変更

項目のラベルは、STRING 属性を使用して直接設定できます。 次に例を示します。

#ITEM.STRING := New label'

#ITEM は、対応するツリービュー項目またはリストビュー項目のハンドルです。

この場合、項目の編集マスク(存在する場合)のみが使用されます。 前述のラベル編集に関する他のすべてのポイントは、ここでは適用されません。 特に次の点に注意してください。

  1. ラベルはコントロールおよび項目の MODIFIABLE 属性の値に関係なく変更されます。

  2. BEFORE-EDIT イベントおよび AFTER-EDIT イベントは発生しません。

  3. コントロールの ITEM 属性は設定されません。

  4. 項目の "大文字(U)" STYLE フラグが設定されていても、テキストは自動的には大文字に変換されません。

  5. 指定されたラベルは、項目の LENGTH 属性による長さの制限(存在する場合)を超えることができます。

Top of page