複数行編集ボックスは、複数行の編集ボックスとしてユーザーに表示されます。開発者にとっては、各行が別々のエントリーのリストです。ファイルから編集ボックスを埋め込むには、ADD_ENTRYコマンドを使用し、編集ボックスからデータを選択し、ファイルに書き込むには、SELECTLISTコマンドを使用します。
複数行編集ボックスでは、データを保存するためのフィールドの列が1行以上必要です。この列のColumnRoleプロパティをDataに設定します。オプションで、列を使用して行番号を保存できます(ColumnRoleがLineNumber)。AddEntryPropertyをMultiplePerRowで使用する場合は、通常は行番号の列も生成されます(ColumnRoleがLineContinuation)。
データがファイルから編集ボックスに取得されたり編集ボックスから抽出される場合は、編集ボックスのAddEntryModeを使用して1行で1つのエントリーを処理するか(OnePerLine)、1行で複数行のエントリーを処理するか(OnePerLine)を指定できます。
行の長さは、MaximumLineLengthプロパティを使用して設定します。AddEntryModeがOnePerLineの場合は、行はデータ列のソースとなるフィールドよりも長くすることはできません。
ファイルが複数行編集ボックスから更新され、AddEntryModeがMultiplePerLineの場合、SELECTLISTコマンドは、編集ボックスのデータをまとめてソース・フィールドの長さと等しくなるよう取得し、元の行番号はLineNumberがColumnRoleのフィールドに記録され、行番号はLineContinuationがColumnRoleのフィールドに記録されます。データがファイルから編集ボックスに書き込まれる場合は、エントリーはまとめて行に埋め込まれます。
複数行編集ボックスには、Modifiedプロパティがあります。このプロパティは、ボックスの内容が変更されるとTrueに設定されます。このプロパティの値は、自動的にはリセットされないので、アプリケーションで変更を処理した後にFalseに設定する必要があります。
複数行編集ボックスには、切り取り、コピー、貼り付け、印刷、元に戻すなどの編集で頻繁に必要になるメソッドがあります。現在行やカーソルが置かれている行を判断したり、縦横のスクロール・バーを表示したり、行番号を表示するかどうかを制御するために使用できるプロパティもあります。
以下のコードでは、基本的な複数行編集ボックスの操作を実行する方法について説明します。例は、以下のフィールドから構成されるNoteFileファイルを使用します。
フィールド |
説明 |
タイプ |
長さと小数点部 |
キー |
NoteNo |
この特定の注を識別する番号 |
Packed |
7,0 |
1 |
LineNo |
行番号 |
Packed |
7,0 |
2 |
RowNo |
行番号 |
Packed |
7,0 |
3 |
Text |
テキスト |
Alpha |
50 |
|
複数行編集ボックスの名前は#MeditBoxです。このように設定されます。
プロパティ |
値 |
#MeditBoxのAddEntryMode |
MultiplePerLine |
#MeditBoxのMaximumLineLength |
1000 |
ShowLineNumbers |
True |
#MeditBoxのWordWrap |
True |
#MeditBoxには以下の列があります。
列 |
参照元フィールド |
ColumnRoleプロパティ |
列1 |
Text |
データ |
列2 |
LineNo |
LineNumber |
列3 |
RowNo |
LineContinuation |
NoteFileのNote Numberフィールドは、ノートの識別に使用されます。
フォームの左側に、以下の目的で使用できるボタンがあります。
ボタンには、以下のClickイベント・ルーチンがあります。
* This code deletes any previous text and writes the contents of the
* edit box to the file:
EVTROUTINE HANDLING(#UPDATEB.Click)
if '#meditbox.modified *eq True'
delete from_file(notefile) with_key(#noteno)
selectlist #meditbox
insert fields(#noteno #lineno #rowno #text) to_file(notefile) val_error(*next)
endselect
endif
ENDROUTINE
*This fetches the text lines of a note from the file:
EVTROUTINE HANDLING(#GETBTN.Click)
select fields(#text #lineno #rowno) from_file(notefile) with_key(#noteno)
add_entry (#MEditBox)
ENDSELECT
ENDROUTINE
*This clears the edit box:
EVTROUTINE HANDLING(#CLEARBTN.Click)
clr_list (#meditbox)
ENDROUTINE
*This deletes the entry from the database and clears the edit box:
EVTROUTINE HANDLING(#DELETEBTN.Click)
dowhile '#io$sts *ne NR'
delete from_file(notefile) with_key(#noteno)
endwhile
clr_list (#meditbox)
ENDROUTINE
右側には、複数行編集ボックスのメソッドを呼び出すボタンがあります。以下のClickイベント・ルーチンがあります。
EVTROUTINE HANDLING(#SELECTALL.Click)
invoke #meditbox.selectall
ENDROUTINE
EVTROUTINE HANDLING(#CUT.Click)
invoke #meditbox.cut
ENDROUTINE
EVTROUTINE HANDLING(#COPY.Click)
invoke #meditbox.copy
ENDROUTINE
EVTROUTINE HANDLING(#PASTE.Click)
invoke #meditbox.paste
ENDROUTINE
EVTROUTINE HANDLING(#UNDO.Click)
invoke #meditbox.undo
ENDROUTINE
EVTROUTINE HANDLING(#REDO.Click)
invoke #meditbox.redo
ENDROUTINE
EVTROUTINE HANDLING(#FIND.Click)
invoke #meditbox.find
ENDROUTINE
EVTROUTINE HANDLING(#REPLACE.Click)
invoke #meditbox.replace
ENDROUTINE
EVTROUTINE HANDLING(#PRINT.Click)
invoke #meditbox.print
ENDROUTINE