テキストエディタやワープロソフトのように自由に文字を表示したり入力し、
またキーボードやマウスを使って表示済みテキストを編集できる非常に高機能な
ウィジェットです。
指定した行数/桁数の領域をウィンドウ内に確保し、その領域の中にプログラムから文字を表示できるほか、操作者がキーボードやマウスを使って自由に文字を入力したり編集することができます。
また文字の修飾についても、フォントの指定、色付け、アンダーライン、取り消し線、網掛け、左右寄せなど豊富な機能を利用でき、簡単なワープロソフトのような機能を持っています。
またメニューバーやポップアップメニューと併用すれば、テキストエディタのような使い勝手にすることができます。
注:以下の解説では「テキストウィジェット」よりも、「テキストボックス」という言い方を多く使っています(特に処理単語名で)。理由は、単に「テキスト」と言うとウィジェットへ付与された文字列を連想してしまうからです。
■テキストボックスのID取得と配置
構文=
<ウィンドウID>と <行数>と <桁数>で
テキストボックスのIDを取得 → テキストID
・・必要であれば属性設定・・
<テキストID>を 有効化して配置 → ・
プログラム例:
テキストボックスは ID
(取得)
メインウィンドウと
20行と 60桁で
テキストボックスのIDを取得し テキストボックスに 入れ
(有効化と配置) *1
テキストボックスを 有効化して配置し
注1:配置は並べ配置の場合です。他の配置手段
を使う場合はその手順に従ってください
親となるウィンドウID、行数、桁数を指定することでテキストウィジェットのIDを取得して準備をおこないます。
他のウィジェットと同様に引き続き有効化と配置が必要です。テキストウィジェットは配置に関するパラメータを設定するケースは少ないため、上記のようにIDを取得してすぐに 「有効化して配置」 するのが楽です。
なお「有効化して配置」を使った場合は、自動的に”並べ配置”となるため、他の配置手段を適用したい場合には「有効化して配置」は使わず、そちらの手順に従ってください。
(詳しくは
その他の配置手段(座標配置と格子配置) を参照ください)
■スクロールバーを付ける場合
先の「テキストボックスのIDを取得」単独での設置の場合はスクロールバーは付きません。そのため表示域からあふれる長いテキストを表示した場合はキー操作だけのスクロールとなり操作性が悪いため、スクロールバーを付与するこちらの方式を勧めます。
スクロールバーを付けるには、「
フレーム収容のテキストボックスのIDを取得」 と 「
フレーム収容のテキストボックスを有効化」をコンビネーションで使います(さらに別途配置が必要です)。
注:横スクロールは本バージョンではサポートしません
構文=
(ステップ1)
<ウィンドウID>と <行数>と <桁数>で
フレーム収容のテキストボックスのIDを取得
→ フレームID、テキストID、スクロールバーID
(ステップ2)*1
<フレームID>と <テキストID>と <スクロールバーID>で
フレーム収容のテキストボックスを有効化 → ・
(ステップ3)*2
<フレームID>を 並べ配置のIDを取得し 配置する
注1:テキストボックスにオプションを付与したいな
らステップ1とステップ2の間でおこないます
(たとえばアンドゥ機能や背景色の設定など)
(フォントの設定は「デフォルトフォント」の
項目をお読みください)
注2:ステップ3は並べ配置の場合です。他の配置
手段を使う場合はその手順に従ってください
プログラム例:
テキストボックスは ID。 *1
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・この間で各種イベントの処理を記述・・ *1
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
テキストボックスを設置とは (・ → ・)
フレームは ID
スクロールバーは ID
メインウィンドウと
30行と 55桁で
フレーム収容のテキストボックスのIDを取得し
フレームと テキストボックスと スクロールバーに 入れ
フレームと テキストボックスと スクロールバーで
フレーム収容のテキストボックスを有効化し
フレームの 並べ配置のIDを取得し 配置すること。 *2
注1:イベント処理でテキストボックスを操作することが
多いため、どのソース位置からもIDを参照できるよう、
IDは大域変数に格納しておきます
注2:この行は並べ配置の場合です。他の配置手段
を使う場合はその手順に従ってください
本機能を使うと,テキストボックスとスクロールバーは合体して1つのフレームに収容され、このフレームを配置することで描画されます。フレームの配置には並べ配置のほか、他の配置手段も使えます。
(他の配置手段については、その他の配置手段(座標配置と格子配置) を参照ください)
■デフォルトフォント
テキストウィジェット内に表示される文字のフォントは、既に
「フォント」−「フォントマクロ」 で解説した「TkFixedFont」というフォントマクロが使われます。以下のような解説でした。
・TkFixedFont(標準固定幅フォント)
もしテキストボックス全体にフォントを指定したいなら、以下の方法でおこなってください。
プログラム例:
テキストボックスは ID。 *1
テキストボックスを設置とは (・ → ・)
フレームは ID
スクロールバーは ID
メインウィンドウと
30行と 55桁で
フレーム収容のテキストボックスのIDを取得し
フレームと テキストボックスと スクロールバーに 入れ
フレームと テキストボックスと スクロールバーで
フレーム収容のテキストボックスを有効化し
フレームの 並べ配置のIDを取得し 配置し
(以下を追加)
<フォント情報>を テキストボックスに フォントを設定し ←★
テキストボックスを 変更を反映し ←★
(以上を追加)
そうではなく、テキストウィジェットの中の一部の文字のフォントを変更したいなら(文字の表示前・表示後どちらであっても)後ほど解説する
フォントの設定 の項を参考してタグを使ってください。
■メニューバーとの併用
メニューバーと併用することもできます。最初にメニューバーを設置し、その後にテキストボックスを設置します。メニューバーについては
メニューバー を参考にしてください。
以下に示す「テキスト表示」など、テキスト表示系の処理単語を使い、テキストボックスに文字列を表示したり改行することができます。感覚としてはコンソールへの文字表示(「表示」や「改行」など)と似ています。
■サンプルプログラム1 (text-edit)
キャレットや表示位置などテキスト中の位置を操作するカーソルの概念、およびそこへの文字・文字列の表示機能を以下のサンプルプログラムにまとめてあります。この先の解説はこのサンプルを併せて動かしながら確認してください。
- text-edit.exe
- (機能)
・ウィンドウ内にテキストウィジェットを確保
・テスト用の長いサンプルテキストの表示
・キャレットや表示位置を設定
・キャレットや表示位置を表すシンボルの値をダンプ
・表示位置に文字列を表示(挿入)
・表示位置にイメージを挿入
・選択範囲をコピー・削除など
・テキストの一部の参照(文字を読み取る)
・クリップボードの利用
・ポップアップメニューによる編集
・書き換え禁止・書き換え許可
■テキスト表示など
構文=
<文字列>を <テキストID>に テキスト表示 → ・
<文字列>を <テキストID>に 一行テキスト表示 → ・
<文字>を <テキストID>に 一文字テキスト表示 → ・
<数値>を <テキストID>に 数値をテキスト表示 → ・
<テキストID>を テキスト改行 → ・
プログラム例:
「こんにちは」を テキストボックスにを 一行テキスト表示する
テキストボックスを テキスト改行する
現在の”テキスト表示位置”に文字や数値を表示したり改行します。コンソールアプリケーションでの「表示」「数値表示」や「改行」などに相当しますが、出力先のテキストボックスを指定する点が特徴です。
これらの表示系単語を使って表示すると、”テキスト表示位置”は自動的にその文字のぶんだけ先に進むため、次々とテキスト表示系単語を実行することができます。
(テキスト表示位置についてはこの先で詳しく説明します)
「テキスト表示」に与えるべき文字列が複数行に渡る場合ですが、ソースプログラム中に固定値として記入するとき、改行を示す記号はコンソール系のアプリケーションと同様に、
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
「1行目&改行&」続
「2行目&改行&」を テキストボックスに 一行テキスト表示
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
のように、ソース中に「
&改行&」を入れることで改行コードを含めたり、「
続」によって文字列定数の継続を行うこともできます。
(「続」を使って文字列定数を複数行に分割して書くのはあくまでソースを読みやすくするためであり必須ではありません。コンパイラはこれを連結して1つの文字列定数として扱います)
■複数のテキストボックスへ表示を行う
メインウィンドウにテキストボックスが複数ある場合、あるいは、メインウィンドウだけでなく子ウィンドウにもテキストボックスがある場合の注意について述べます。
1つのテキストボックスに対して文字を表示したあと、別のテキストボックスにも文字を表示すると、フォーカスが後のテキストボックスに移動してしまいます。たとえばキャレットが前のテキストボックスから消えてしまいます。
これが不都合な場合には、別のテキストボックスへ一連の文字を表示したあと、元のテキストボックスに対して「フォーカスを当て」ることでフォーカスを戻してください。
なお、この対処のためのフォーカス当てはウィンドウに対してではなく、テキストウィジェットに対しておこなってください。(理由は
選択状態の挙動について補足 で解説しています)
テキストボックス内の特定の文字位置を指し示したり、取得することがあります。
■文字位置列(概念)
まず「文字位置」という概念があります。
それを表す文字列形式のデータを(GUIエンジン特有の形式で)「文字位置列」と呼ぶことにします。単に「位置」では整数のように見えてしまうからです。
(文字位置列)
行、桁を指し示す位置として「文字位置列」という言い方をします。形式は以下の通りですが、数値であったりシンボル名であったりまちまちです。
注:以下の具体値はGUIエンジン特有の内部形式であり、ユーザが使う場合はより抽象化された日本語を使うため覚えていただく必要はありません。参考程度とお考えください。
−−−−−−−−−−−−−−−−−−−−−−−−−
文字位置の例 その文字位置列の具体値
−−−−−−−−−−−−−−−−−−−−−−−−−
テキストの先頭 1.0
2行5桁目 2.4
キャレットのある行頭位置 insert linestart
−−−−−−−−−−−−−−−−−−−−−−−−−
たとえば、GUIエンジンのネイティブな表現で "1.0" となるところ、Mindのソースコードでは抽象的に「テキスト先頭位置」と書くことができます。(もちろん、あえてネイティブな表記を書くこともできます)
- 注意:
-
テキストウィジェットにおいては、行番号は論理的行数です。長い行が折り畳まれて表示されているとき、折り畳まって複数行に渡る全体を1行として扱います。したがってプログラムで扱う1行と、テキストボックス内の表示行数とは必ずしも合致しません。
- 参考情報1:
-
Mind側での表現「テキスト先頭位置」や「テキスト末尾位置」は次のように定義された単語です(常に定数を返します)。Mindでは抽象的に表します。
−−−−−−−−−−−−−−
テキスト先頭位置は "1.0"。
テキスト末尾位置は "end"。
−−−−−−−−−−−−−−
- 参考情報2:
-
GUIエンジンのネイティブ表現の "1.0" は1行1桁目を表します。
'.'は小数点ではなく行と桁を区切る記号です。GUIエンジンネイティブな表現
では桁位置はゼロから数えますが、Mindでは1から数えます。
■キャレット位置とテキスト表示位置
- ・キャレット位置
-
アプリを操作する人から見て「ここに文字を入力する」と言う意味で
「キャレット位置」があります。見た目もキャレット(カーソル)が
表示されています
- ・テキスト表示位置
-
プログラムによってテキストを表示するときの表示位置を設定できます。
目では確認できません。また参照もできません。
-
注:テキストボックスの先頭から順次テキストを表示していく場合、キャレット位置とテキスト表示位置は一致していますが、そうでない場合もあります。
キャレットか点滅している所ではない個所にテキストを表示することができます。
- ・テキスト先頭位置、テキスト末尾位置
-
たとえば「テキスト末尾位置」という語がありますが、テキストボッ
クスに表示されている全テキストの末尾位置という意味になります。
注:「末尾位置」という用語はあちこちで出てきますが”末尾の文字の位置”ではないので注意してください。正確には、
”末尾の文字のその次の位置(=Next)”
になります。たとえば行末位置であれば行末コードの位置です。行末位置を表示位置として設定して何か文字列を挿入すれば行末への(改行コード直前への)挿入ができます。
■抽象的なキャレット位置
以下の単語群でキャレットに関連する抽象的な位置を指示できます。
構文=
キャレット位置 → 文字位置列
キャレット行頭位置 → 文字位置列 ←キャレットのある行の行頭の位置
キャレット行末位置 → 文字位置列 ←キャレットのある行の行末の位置
キャレット位置+1 → 文字位置列 ←キャレットの位置の次の文字位置
キャレット位置+2 → 文字位置列 ←キャレットの位置の次の次の文字位置
キャレット位置−1 → 文字位置列
キャレット位置−2 → 文字位置列
キャレット前行位置 → 文字位置列 ←キャレットのある行の前の行の行頭位置
キャレット次行位置 → 文字位置列 ←キャレットのある行の次の行の行頭位置
■テキスト先頭・末尾位置の参照
テキスト全体の先頭あるいは末尾の位置を得る単語があります。
構文=
テキスト先頭位置 → 文字位置列
テキスト先頭行末 → 文字位置列
テキスト末尾位置 → 文字位置列
テキスト末尾行頭 → 文字位置列
テキスト末尾行末 → 文字位置列
テキスト末尾行末−1 → 文字位置列
テキスト末尾行末−2 → 文字位置列
テキスト末尾前行位置 → 文字位置列
プログラム例:
キャレットを末尾に移動とは (・ → ・)
テキスト末尾位置を テキストボックスに キャレットを移動すること。
■キャレットを移動
構文=
<文字位置列>を <テキストID>に キャレットを移動 → ・
プログラム例:
キャレットを左端に移動とは (・ → ・)
キャレット行頭位置を テキストボックスに キャレットを移動すること。
指定した文字位置にキャレットを移動させます。
注:テキストウィジェットを開いて何かテキストを表示しただけではキャレットは現れません。次のいずれかでキャレットが現れます。
−−−−−−−−−−−−−−−−−−−−
・テキスト域でマウス左クリック
・テキスト域にフォーカスを与える
・処理単語 「キャレットを移動」 を実行
・処理単語 「指定位置が見えるようにする」 または
「指定位置が1行目に見えるようにする」 を実行
−−−−−−−−−−−−−−−−−−−−
■表示位置を設定
構文=
<文字位置列>を <テキストID>に 表示位置を設定 → ・
プログラム例:(キャレットのある行の左端に「ABC」を挿入)
キャレット行頭位置を テキストボックスに 表示位置を設定し
「ABC」を テキストボックスに テキスト表示する
「テキスト表示」, 「テキスト改行」などテキスト表示系の処理単語を使ってテキストウィジェットへの文字列表示を行う際、それに先だって「どの位置に表示するか」を指定する機能です。
テキストウィジェットを生成した直後の表示位置はテキストボックス先頭です。
表示位置を特に指定しない場合は前回にテキスト表示した次の位置から表示が行われます。
■行と桁を文字位置列に変換
たとえば、3行5桁目をテキスト表示位置に設定したい時、
3行 5桁目を テキストボックスに 表示位置を設定 ←誤り
と書くことはできません。「3」や「5」は整数値なので、本ライブラリが規定する "文字位置列" 形式ではないためです。この変換をおこなう処理単語です。
構文=
(作業用の文字列実体を省略する場合) (通常はこちらで良い)
↓整数 ↓整数
<行位置>と <桁位置>を 行と桁を文字位置列に変換
→ 文字位置列
(作業用の文字列実体を指定する場合)
↓整数 ↓整数 ↓「をつかい」は送り仮名必須
<行位置>と <桁位置>を <文字列実体変数>をつかい 行と桁を文字位置列に変換
→ 文字位置列
注:整数 3、5 を与えると文字位置列 "3.4" が返されます
プログラム例: (3行5桁目に「ABC」を挿入します)
○○とは
3行 5桁目を 行と桁を文字位置列に変換し
テキストボックスに 表示位置を設定し
「ABC」を テキストボックスに テキスト表示する
同上: (同じことをするのに作業用文字列実体を明示する)
○○とは
バッファは 文字列実体 長さ 文字位置列長さ
↑「文字位置列長さ」はライブ
ラリで定義済の定数です
3行 5桁目を バッファをつかい 行と桁を文字位置列に変換し
テキストボックスに 表示位置を設定し
「ABC」を テキストボックスに テキスト表示する
本処理単語は生成した文字位置列をライブラリ内部の文字列実体変数に格納し、そこを指す文字列情報をスタックに返します。その仕組み上、2度続けて本単語を呼び出すと後の実行で前の文字列を破壊してしまうので、もし最初に取得した文字列を消費しないまま次の単語呼び出しをするような場合は、作業用の文字列実体変数を明示する呼び出し方法を使うか、あるいは得られた文字位置列を別獲得した文字列実体変数に退避するようにしてください。
作業用に、あるいは退避用に文字列実体を確保する際、その実体長さは「文字位置列長さ」という定数が使えます。(上記プログラム例の後者がそのようにしています)
(参考までに‥以下が定義済です)
文字位置列長さは 定数 40桁。
↑この定数がGUIライブラリ内で定義されています
■文字位置列を行と桁に変換
先と逆で、文字位置列データを整数としての行位置と桁位置の2つの整数値として返す機能です。
構文=
<文字位置列>を 文字位置列を行と桁に変換 → 行位置、桁位置
(整数) (整数)
注:文字位置列 "3.4" を与えると整数 3 と 5 が返されます
注:与えることのできる文字位置列は "N.M" 形式のものに
限るためたとえば「テキスト末尾位置」(実態は"end")
などシンボル系の値は使えません。
プログラム例:
○○とは
行位置は 変数
桁位置は 変数
キャレット位置を 文字位置列を行と桁に変換し
行位置と 桁位置に 入れ
■文字位置から具体値を得る
構文=
<テキストID>で <文字位置列>を 文字位置から具体値を得る
→ 文字位置列
プログラム例:
○○とは
具体位置は 文字列実体 長さ 文字位置列長さ
↑「文字位置列長さ」はライブ
ラリで定義済の定数です
テキストボックスで
キャレット位置を 文字位置から具体値を得て 具体位置に 入れ
↑
たとえば "2.0"
たとえば「キャット位置」や「テキスト末尾位置」など抽象名を使って文字位置を指定することがありますが、そられが具体的にどのような位置なのかを知りたいときに使います。
返される文字位置列は必ず数値を使った形式(例:"2.0")です。
補足:サンプルプログラム "text-edit.exe" のメニュー「その他の操作」に次の2つのボタンがあり具体値を確認できますが、これのボタン処理が「文字位置から具体値を得て」を使っています。
ボタン:「抽象表現のキャレット文字位置の具体値を確認」
ボタン:「抽象表現のテキスト文字位置の具体値を確認」
サンプルプログラム "text-edit.exe" では右クリックで現れるポップアップメニューの中に選択領域を操作する多くの項目(たとえば、「選択域のテキストを参照」など)がありますから解説と併せてお試しください。
一般的なエディタやワープロと同様に、テキストの一部を選択状態にすることができます。
テキストの一部をマウスでドラッグした個所が選択状態になり、青色反転になるので選択されていることが分かります。選択する方法としてマウスのドラッグのほか、左クリックしたあと Shiftキーを押しながらカーソル移動キーを操作することでも可能です。
マウスやキーボードを使ってテキストの一部を選択すること自体のためにMind側でプログラムを組む必要はありません。テキストウィジェットが基本機能としてサポートしているためです。
Mindで書くのは選択されたテキストに対して何らかのアクションをとる段階・・たとえば選択範囲のテキストを参照したり、文字修飾したり、削除するなど・・からになります。
記: もっと言えば、選択状態でDelキーを押すと選択領域が削除され、あるいは Ctrl-c 打鍵で領域がコピーされますが、これもまたMind側でプログラムを組む必要はなく、テキストウィジェットの基本機能として実現されます。
人による編集機能 にテキストウィジェットの標準機能としてのキー操作が解説されているので参考にしてください。
選択状態になった文字領域(青地に白抜き文字になった個所)のことを「選択領域」あるいは「選択域」と呼ぶことにします。
■選択域の文字位置を表すシンボル
選択域の開始/終了の文字位置を表すシンボルがあります。
これは抽象表現なので選択域の場所を問わず一定で、この値を得たあと退避する必要はありません。ソース中に必要な都度、この定数を記述してください。
構文=
選択域開始位置 → 文字位置列 (文字列定数「sel.first」をシンボル定義したもの)
選択域終了位置 → 文字位置列 (文字列定数「sel.last」をシンボル定義したもの)
注:返される値は抽象表現の文字列定数であり、選択域の場所を問わず一定です
注: 選択域終了位置は ”選択範囲の最終文字の位置” ではないので注意してください。正確には、”選択範囲のその次の位置(=Next)” になります。
プログラム例:
■選択域の文字位置を利用する場合の注意
先の「選択域開始位置」,「選択域終了位置」を使うには注意が必要です。共に選択域の文字位置を表すシンボルですが、何も選択されていない状態でこのシンボルを使うとGUIエンジン内部でエラーが発生します。
したがって、「選択域開始位置」,「選択域終了位置」を引用する処理を書くには、必ず事前に”今選択中かどうか”を調べ、選択中でない場合にはすぐリターンするとか、文字列を返す処理単語であれば空列を積んでリターンする・・などの前処理を行ってください。
”今選択中かどうか”を調べるにはこの先で解説する処理単語
「選択状態?」 が使えます。サンプルプログラム "text-edit" のソースコードでも随所にこの検査を入れています。
■選択領域のテキストを参照するには
先に解説した 選択域の文字位置を表すシンボルと、処理単語 「指定範囲のテキストを参照」 のコンビネーションで実現できます。
プログラム例1: (格納先を指定しない、選択状態チェック無し)
選択域のテキストを参照とは (・ → 文字列)
テキストボックスの
選択域開始位置から 選択域終了位置までを
指定範囲のテキストを参照すること。
プログラム例2: (格納先を指定しない、選択状態チェック有り)
選択域のテキストを参照とは (・ → 文字列)
テキストボックスが 選択状態?
でなければ
空列を 返し
終り
つぎに
テキストボックスの
選択域開始位置から 選択域終了位置までを
指定範囲のテキストを参照すること。
プログラム例3: (格納する文字列実体変数を明示、選択状態チェック有り)
選択内容バッファは 文字列実体 長さ 1024桁。
↑予想される最大長を指定します
選択域のテキストを参照とは (・ → 文字列)
テキストボックスが 選択状態?
でなければ
空列を 返し
終り
つぎに
テキストボックスの
選択域開始位置から 選択域終了位置までを
選択内容バッファをつかい 指定範囲のテキストを参照すること。
■選択状態であるかを知るには
構文=
<テキストID>が 選択状態? → 真偽(1/0)
現在、選択状態であるかを調べて真偽を返します。
■選択状態を解除するには
GUIエンジン標準の機能として、Ctrl キーを押しながら ¥ キー を操作することによって解除できますが、プログラムで解除することもできます。
構文=
注: Escキー打鍵で選択を解除したくなるかも知れませんが、テキストウィジェットの素のままではEscキーでは解除できません。もちろんそのようなバインドを組めば可能です。
■選択状態の挙動について補足
特殊なケースですが、
選択状態にあるとき、自身のウィンドウ(多くの場合メインウィンドウ)にフォーカスを当てると選択状態が解消されたように見えますが、内部的にはまだ維持しているという奇妙なことが起きます。そのあと、どこかのテキスト個所をクリックすると選択は内部的にも解除となります。これはGUIエンジンの特性でありバグではありませんのでご承知願います。
サンプル "text-edit.exe" の 「編集」−「選択範囲のテキストを参照」 を実行すると、選択範囲の内容がモニタ表示されます。モニタ表示は子ウィンドウへ出力しており、そのままだとフォーカスは子ウィンドウに行ったままになってしまいます。それを避けるため、出力が終るとメインウィンドウにフォーカスを戻しています。ただし、素直にメインウィンドウにフォーカスを当てると上記問題が発生するため、主画面のテキストボックスに対してフォーカスを当てることでこの問題を回避しています。
テキストウィジェットはテキストエディタのような機能であり、素の状態で使ったとしても・・つまり単にテキストボックスを生成しただけであっても、ある程度の編集機能が利用できます。このことを知っておけば、キー入力やマウス操作に応答する処理を二重に作ってしまう無駄が避けられます。
■標準で備わっている操作
テキストウィジェットに標準で備わっている操作を以下に示します。
概ねエディタなどでよく見かける操作に合致しているはずです。(一部はUNIX系OSのviに似ています)
- 通常の文字キーの打鍵で文字がキャレット位置に挿入されます
- カーソル移動キーによりキャレットを上下左右に移動できます
- Home、Endキーを押すとキャレットを行左端・右端に移動できます
- Ctrlキーを押しながらHome、Endキーを押すとキャレットをテキスト先頭、テキスト末尾に移動できます
- 任意の場所で左クリックするとキャレットをそこに移動できます
- 任意の場所でダブルクリックすると、キャレットのある行全体が選択状態になります
- 任意の場所でShiftキーを押しながらカーソル移動キーを押すと、なぞった部分を選択状態にできます
- 任意の場所でShiftキーを押しながらHome、Endキーを押すと、キャレットの行左側、行右側を選択状態にできます
- Ctrlキー押しながら / キーを押すとテキスト全体が選択状態になります
- Ctrlキー押しながら \ キーを押すと選択状態を解除できます
- マウスでドラッグすると、その領域が選択状態になります
→その状態でカーソル移動キーを操作すると選択範囲を調整できます
→その状態でCtrlキーを押しながら別の個所を左クリックすると
選択を維持したままキャレットを移動できます
- Delキーを押すとキャレット位置の文字を1文字だけ削除できます
もし選択状態であれば選択域のテキストが削除されます
- Ctrlキーを押しながら k キーを押すとキャレットから右の行後半部を削除できます
- Ctrlキーを押しながら o キーを押すとキャレットから右の行後半部を次行に送り、行後半を空けます
- Ctrlキーを押しながら z キーを押すと直前の編集操作をやり直し(アンドゥ)します(アンドゥ機能を有効化してある場合)
- Ctrlキーを押しながら c キーを押すと選択範囲をコピーします
- Ctrlキーを押しながら x キーを押すと選択範囲を切り抜きます
- Ctrlキーを押しながら v キーを押すとコピーバッファ内容を挿入します
注:Ctrl-c による選択範囲のコピーですが、GUIエンジンの標準はコピー操作をしても選択状態が残りますが、本ライブラリではコピー操作で選択が解除されます
■アンドゥ機能
テキストボックスを単に生成した状態ではアンドゥ機能は抑制されていますが以下の機能を使うことで有効にできます。
構文=
<状態シンボル>を <テキストID>に アンドゥ機能を設定 → ・
状態シンボルは文字列で、以下のいずれかのシンボルを指定
有効状態 (文字列「normal」です)
無効状態 (文字列「disabled」です) ←デフォルト
プログラム例:
有効状態を テキストボックスに アンドゥ機能を設定する
アンドゥ機能が有効になっているとき、Ctrlキーを押しながら z キーを押すと直前の編集操作が元に戻されます(GUIエンジン標準の機能)。デフォルトは無効です。
アンドゥ機能を有効したとき、GUIエンジンの標準として Ctrl-z でアンドゥが働くので、テキストウィジェットに対して明なバインドをおこなう必要は無いのですが、「Ctrl-z でアンドゥが働く」ことを知らせることは意味があります。もしユーザが作成するアプリにメニューバーがあるなら、「編集」メニューから誘導されるサブメニューに「やり直し」ボタンを設置し、そのボタンに Ctrl-z を(見かけ上)バインドすると良いでしょう。( 「この番号のメニュー項目にショートカットを表示」 のほうを使います)
■サンプルプログラム
プログラムによる編集機能は、以下のサンプルプログラムが使っています。併せて動かしながら読み進めてください。
- text-edit.exe
-
一般的な編集
- text-tag-simple.exe
-
タグを使った表示・簡単なもの
→ 最初からタグ付きで表示および後からタグ付与
- text-tag-complex.exe
-
タグを使った表示・複雑なもの
→タグを使った色付けやフォント設定
→タグを使った行間の設定
■文字・文字列の表示
まずテキストボックス中への文字列の表示は、
「文字・文字列の表示」−「テキスト表示など」 で解説したテキスト表示系の処理単語でおこなってください。
テキスト表示系の単語名に「表示」という言葉が使われていますが厳密には挿入です。どこへの挿入かと言えば”テキスト表示位置”への挿入です。キャレット位置ではないので注意が必要です。
プログラム例:(キャレットのある個所に「ABC」を挿入)
キャレット位置を テキストボックスに 表示位置を設定し
「ABC」を テキストボックスに テキスト表示する
プログラム例: (3行5桁目に「ABC」を挿入)
3行 5桁目を 行と桁を文字位置列に変換し
テキストボックスに 表示位置を設定し
「ABC」を テキストボックスに テキスト表示する
なお、テキスト表示系単語を使って表示した場合、表示位置は自動的にそのぶんだけ先に進むため、再度の「表示位置を設定」は不要で、次々とテキスト表示系単語を実行することができます。
プログラム例: (3行5桁目に 「ABC」 ・ 改行 ・ 「DEF」を挿入)
3行 5桁目を 行と桁を文字位置列に変換し
テキストボックスに 表示位置を設定し ※1度だけ表示位置を設定
「ABC」を テキストボックスに テキスト表示し ※表示1
テキストボックスを テキスト改行し ※表示2
「DEF」を テキストボックスに テキスト表示し ※表示3
■イメージの表示
テキストウィジェット内にイメージを表示させることができます。
構文=
<イメージID>を <テキストID>に
<揃え指定>と <Xパディング> <Yパディング>で
イメージをテキスト表示 → ・
揃え指定として以下のいずれかのシンボルを記述(文字列定数)
左揃え
中央揃え
右揃え
下揃え
上揃え
下辺揃え ※これはText中imageのみで利用
パディングが不要なら、X, Y のいずれかまたは両方に0を指定してください
プログラム例1: (3行3桁目にイメージを表示)
猫を描くとは (・ → ・)
猫のイメージは 変数
"mage\cat.png"で イメージをロードし 猫のイメージに 入れ
3行と 3桁目を
行と桁を文字位置列に変換し
テキストボックスに 表示位置を設定し
猫のイメージを テキストボックスに
中央揃えと 0 0で
イメージをテキスト表示し
プログラム例2:
サンプルプログラム "text-edit.src/.exe" には
多少のイメージを表示する例があります。
(メニューバー「文字列を挿入」中の下部項目)
サンプルプログラム "text-align-image.src/.exe"
では多くの揃え指定でイメージを表示しているので参
考にしてください。
イメージを表示するために少し時間がかかります。
テキストウィジェットでの適用かどうかにかかわらず、
イメージを扱うプログラムは起動後の最初にイメージ
を表示する際、少し待たされます。(一般的なマシンで
2秒〜数秒といったところでPCの性能も関係します)
ただ、一度でもイメージ表示がおこなわれると次回か
らは待ちは無くなります。つまり最初の起動かつ起動
後の最初のイメージ表示のみで待ちが生じます(OS再
起動後はまた待ちが生じます)。
恐れ入りますがこの時間待ちはバグではなく、GUIエン
ジンの特性によるものとしてご承知をお願いします。
(将来のGUIエンジンの版によって解消される可能性も
ありますが現在はまだ未定です)
最初に「イメージをロード」によりイメージIDを得て、そのIDを使って「イメージをテキスト表示」を行ないます。
〇表示される位置は文字列の表示の時と同様にテキスト表示位置です。必要に応じて「表示位置を設定」により事前に表示位置を指定してください。
〇揃え指定にある「下辺揃え」は前後の文字ラインの下辺にイメージの下辺を揃える意味になります。
〇パディングはイメージの周囲に空白を作るものです。不要なら0を指定してください
〇ビットマップはファイル経由での指定であればイメージと同様に使えます。ただし標準ビットマップ(ビットマップを名前で指定するタイプ)は表示できません。
■指定範囲のテキストを削除
構文=
<テキストID>を
<開始位置列>から <終了位置列>まで 指定範囲のテキストを削除 → ・
注:
・開始位置列、終了位置列はともに "文字位置列" です
・終了位置列は "削除域の末尾位置" ではなく、その次
の位置(NEXT)なので注意してください。
たとえば2行3桁目にある1文字を削除したいのなら、
開始位置・終了位置として、
2行3桁目 と 2行4桁目
を表す文字位置列を指定します。
・改行コードも1文字と数えます。改行位置を含む削除
をおこなうと次行が当行に繰り上がってきます
・Windowsの標準的な行末コードは CR/LFの2文字ですが
本ライブラリ内部では行末コードをLFの1文字で格納し
ています。行末の制御文字は1字しかありません。
プログラム例1: (キャレット位置にある1文字を削除する)
テキストボックスを
キャレット位置から キャレット位置+1まで
指定範囲のテキストを削除する
プログラム例2: (キャレット位置から行末までの文字列を削除する)
テキストボックスを
キャレット位置から キャレット行末位置まで
指定範囲のテキストを削除する
プログラム例3: (キャレット位置から行末までの文字群を改行コードを含めて削除する)
テキストボックスを
キャレット位置から キャレット次行位置まで
指定範囲のテキストを削除する
上のプログラム例2では「キャレット行末位置」を使っています。文字通りの意味ですが、これは厳密には "キャレットのある行の末尾文字位置+1" で、結局のところ、改行コードの位置を表すことになります。その改行コードの位置をNextとするような指定なので、末尾文字までになります。
プログラム例4: (キャレットの位置からテキスト末尾まですべて削除)
テキストボックスを
キャレット位置から テキスト末尾位置まで
指定範囲のテキストを削除する
上の例では「テキスト末尾位置」を使っています。「テキスト末尾位置」とは、テキスト全体の末尾文字の次の位置(そこには最終行の行末コードが有るか、または何も無いかのいずれか)を示します。
プログラム例5: (キャレットのある行のすべての文字を削除)
テキストボックスを
キャレット行頭位置から キャレット行末位置まで
指定範囲のテキストを削除する
(行末コードは温存される)
プログラム例6: (キャレットのある行自体を削除)
テキストボックスを
キャレット行頭位置から キャレット次行位置まで
指定範囲のテキストを削除する
(行末コードも含めて削除される)
上の2例の違いをよくご覧ください。前者ではキャレットのある行内のすべて
の文字を削除するのに比べ、後者ではキャレットのある行自体を削除します。
■指定範囲のテキストを参照
注: 本単語「指定範囲のテキストを参照」とよく似たものに、単なる「テキストを参照」という語もあります。そちらはラベルやボタンなどの汎用ウィジェット向けです。混同しないようご注意ください。
構文=
(格納先を指定しない)
<テキストID>の
<開始文字位置列>から <終了文字位置列>まで
指定範囲のテキストを参照 → 文字列
(格納先の実体変数を指定する)
<テキストID>の
<開始文字位置列>から <終了文字位置列>まで
<文字列実体変数>をつかい ←送り仮名「をつかい」必須
指定範囲のテキストを参照 → 文字列
プログラム例1: (キャレットのある1行分のテキストを得る)
当行を読み取りとは (・ → ・)
当行内容は 文字列
テキストボックスの
キャレット行頭位置から
キャレット行末位置までを
指定範囲のテキストを参照し 当行内容に 入れ
プログラム例2: (同上、格納する文字列実体変数を明示)
当行バッファは 文字列実体 長さ 1024桁。
当行を読み取りとは (・ → ・)
当行内容は 文字列
テキストボックスの
キャレット行頭位置から
キャレット行末位置までを
当行バッファをつかい
指定範囲のテキストを参照し 当行内容に 入れ
指定する文字範囲のテキスト内容を参照します。
GUIエンジン内部での行末コードは LF の1文字ですが本ライブラリでWindows標準の行末コード CR/LF の2文字に置換してから返します。
上のプログラム例1,2は、キャレットのある1行分のテキストを得るものです。行末コードは含みません。もし行末コード込みで得たいのなら、
キャレット行頭位置から
キャレット次行位置までを
としてください。(終了位置はNext位置なのでそのようになります)。
本処理単語は、読み出したテキスト内容をライブラリ内部の文字列実体変数「テキスト参照文字列」に格納し、そこを指す文字列情報をスタックに返します。
その仕組み上、2度続けて本単語を呼び出すと後の実行で前の文字列を破壊してしまうので(たとえ文字列情報変数を別にしたとしても)最初に取得したデータを消費しないまま次の単語呼び出しする場合は次のいずれかの対応を行ってください。
A: データを得る都度、別々の文字列実体変数に退避する
B: 格納先の実体変数を明示するような呼び出しをおこなう
(上記構文の後者)
■書き換え禁止
テキストボックス内を編集不可(書き換え禁止)にすることができます。
構文=
<状態シンボル>を <テキストID>に 状態を設定 → ・
状態シンボルは文字列で、以下のいずれかのシンボルを指定
書き換え禁止状態 (文字列「disabled」です)
書き換え許可状態 (文字列「normal」です)
プログラム例:
書き換え禁止状態を テキストボックスに 状態を設定する
アプリの操作者がテキストウィジェットの内容を編集できないように(文字の挿入や削除などを禁止)します。読んでもらうだけの情報表示に使うと良いでしょう。
書き換え禁止にするとキャレットが消え、キー入力が効かないことが分かります。
許可にすれば再び現れます。
さらに、書き換え禁止にすると操作者のみならずプログラムからであっても文字列表示や削除ほか、すべての編集操作ができなくなります。もし「プログラムから表示する時を除き、常時書き込み禁止」にしたい場合は、プログラムからの表示の都度、禁止を解除してください。
補足:サンプルプログラム "text-edit.exe" で「その他の操作」メニューの中に書き換え禁止・許可を試すためのボタンがあります。
■書き換え禁止を参照
書き換え禁止状態であるかを参照するには処理単語「状態を参照」を使います。構文など詳細は
「ウィジェットの属性指定」−「ウィジェットの状態を参照」 を参照願います。
プログラム例:
テキストボックスの 状態を参照したものが 書き換え禁止状態に 等しい文字列
ならば ・・・
つぎに
■テキストの特定の場所が見えるようにする
テキストボックスのビューの中に特定の文字場所が見えるように自動スクロールする機能が2種類あります。
たとえば、プログラムからテキストボックスに大量のテキストを表示させた後に、末尾部分がテキストボックス内に見えるように調整する、あるいは、何らかのキーを打鍵(たとえば Ctrl-Home)することでテキスト先頭部から改めて表示しキャレットも1行目に行く・・といった用途に利用できます。
記: 上記はあえて説明のために書きましたが、実は Ctrl-Home 打鍵によってビューをテキストの先頭に戻すのはテキストウィジェットの標準機能なのでプログラムを組む必要はありません
構文=
<文字位置列>が <テキストID>に
指定位置が見えるようにする → ・
<文字位置列>が <テキストID>に
指定位置が1行目に見えるようにする → ・
注:キャレットも指定位置に移動します
前者は指定位置がビューのどこかに見えれば可というものであり、後者は指定位置が必ず
テキストボックスの1行目から表示されるようにします。
補足:サンプルプログラム "text-edit.exe" で主メニュー「文字位置を設定」の中に「指定位置が見えるようにする」および「指定位置が1行目に見えるようにする」というボタンがあるので操作してみてください。(あらかじめ同メニューグループ内の「以下の試験のため大サイズのサンプル文に取り換え」というボタンを実行しておいてください)
注: 文字位置の指定について注意があります。
サンプルプログラム "text-edit.exe" で「指定位置が・・に見えるようにする」の試験では、大サイズのサンプル文を表示してからおこなうことを前提としています。
大サイズのサンプル文は全サイズだけでなく1行も長いため、テキストボックス内で折り畳み表示されていますが、折り畳まった長い行が1行として数えられます。したがって、本試験のため指定した行番号は、かならずしもテキストボックスの表示を上から数えた視覚的な行位置には合致しません。
マウスやキー操作によるコピー&ペーストは、プログラムからでも行うことができます。
■クリップボードのクリア
構文=
<テキストID>を クリップボードをクリアする → ・
■クリップボードへの追加
構文=
<文字列>を <テキストID>に クリップボードに追加 → ・
指定した文字列をクリップボードに追加します(格納ではなく追加です)。
一般的な「コピー」操作に相当するプログラム処理は、次のプログラム例のようにクリアと追加のコンビネーションとして実現してださい。(クリアしたあと、追加を繰り返せば累積を記憶することもできます)
プログラム例:
クリップボードへ格納とは (文字列、テキストID → ・)
文字列1は 文字列
テキストIDは ID
文字列1と テキストIDに 入れ
テキストIDを クリップボードをクリアし
文字列1を テキストIDに クリップボードに追加すること。
■クリップボードの参照
構文=
(格納先を指定しない)
<テキストID>を クリップボードを参照 → 文字列
(格納先の実体変数を指定する)
<テキストID>を
<文字列実体変数>をつかい ←送り仮名「をつかい」必須
クリップボードを参照 → 文字列
現在のクリップボードの内容を得ます。
よく使われる「ペースト」操作に相当するプログラム処理は、「クリップボードを参照」と「テキスト表示」系単語のコンビネーションとして実施してください。
本処理単語は読み出したテキスト内容をライブラリ内部の文字列実体変数「クリップボード参照文字列」に格納し、そこを指す文字列情報をスタックに返します。
その仕組み上、2度続けて本単語を呼び出すと後の実行で前の文字列を破壊してしまうので最初に取得したデータを消費しないまま次の単語呼び出しする場合は次のいずれかの対応を行ってください。
A: データを得る都度、別々の文字列実体変数に退避する
B: 格納先の実体変数を明示するような呼び出しをおこなう
(上記構文の後者)
■クリップボードを使うサンプルプログラム
"text-edit.src" をお読みいただき、また実行してみてください。サンプルプログラムでのクリップボードの操作はメニューバー「編集」の下のほうの項目にあります。
ここまでの解説により、テキストウィジェットを
エディタのように使うための基本的な機能を学習しました。
このセクションでは、各種文字修飾など、テキストウィジェットを
ワープロソフトのように使うための解説をおこないます。
テキストボックス中の文字の修飾は「
テキストタグ」と呼ぶタグを使うことでおこないます。(タグにはほかに、キャンバスウィジェットで使う「図形タグ」と呼ぶものもあります)
■タグを使うサンプルプログラム
このセクションで解説するタグ機能は以下のサンプルプログラムで実際に確認できます。この先の解説はサンプルを併せて動かしながら確認してください。
- text-tag-simple.exe
- (機能)
・タグを使った文字表示
・テキストとタグはソース内に固定的記述
・最初からタグ付きで表示および後からタグ付与
4行目の表示に注目してください。
4行目先頭の「1234」は最初からタグ付けで表示しています。
それに続く「5678」のうち「56」の個所は通常表示したあと、
「56」部に後からタグを付与することで文字修飾しています。
- text-tag-complex.exe
- (機能)
・タグを使った色付けやフォント設定
・メニューから各種実験
・タグを使った行間の設定
■テキストタグを使う理由
テキストの文字修飾をおこなうのに、文字に対して直接修飾を施すのではなく、まずタグを作成し、そのタグに対して各種属性を付与し、そのあと必要とするテキスト個所にタグを適用・・という手順になります。
たとえばテキスト中の複数個所(例えば見出しなど)について同じフォントを設定する場合、それぞれの個所にフォント指定を行うのは煩雑で処理時間もかかります。
一方、まずタグに対してフォント指定を行い、そのタグを複数個所のテキストに適用するほうがフォント指定が1回で済むだけでなく、後になって修飾を変更する場合もその1個所のタグ設定を修正するだけて済みます。
■テキストタグの生成と有効化
構文=
<テキストID>で テキストタグのIDを取得 → タグID
〜略〜 (各種属性設定)
<タグID>を 有効化する → ・
プログラム例:
見出しタグは ID
テキストボックスで テキストタグのIDを取得し
見出しタグに 入れ
○○を 見出しタグに 文字色を設定し
○○を 見出しタグに フォントを設定し
見出しタグを 有効化し
テキストウィジェットのIDを指定し、テキストタグのIDを取得します。
このIDは後に各種属性設定をおこなったり、タグをテキストの一部に付与するのに使われます。
属性設定が終った後、タグの有効化をおこなうとタグが使えるようになります。
記: 属性付与による実際の見え方の効果はサンプル
"text-tag-complex.exe" を動かして確認して
ください。
(1)「タグ操作」−「以下の試験の前に多くのタグを定義」
(2)「タグ操作」−「各種タグを使い分けてテキスト表示」
■テキストまたはタグに対する属性設定
この先、テキストに属性を指定する方法を解説しますが、幾つかの処理単語で、属性設定に使うIDとして
テキストウィジェット または
テキストタグ のいずれも可・・というものがあります。このため、そのような処理単語の文法解説ではIDの指定を以下のように記述することにします。
<WidgIDorタグ>
上記のように書いた部分には、
テキストウィジェットID または
テキストタグID の、どちらも指定可能であることを意味します。(たとえば「テキスト行間を設定」がそうです)
■色の設定
構文=
<色指定>を <タグID>に 文字色を設定 → ・
<色指定>を <タグID>に 背景色を設定 → ・
プログラム例:
色付けタグは ID
テキストボックスで テキストタグのIDを取得し
色付けタグに 入れ
緑色を 色付けタグに 文字色を設定し
色付けタグを 有効化し
タグに対して文字色または背景色を設定できます。
色の指定方法については既に、「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 にて解説しているので詳細はそちらを参照してください。
■フォントの設定
構文=
<フォント情報>を <タグID>に フォントを設定 → ・
プログラム例:
フォントタグは ID
明朝20は 文字列定数 「{MSP 明朝} 20」
明朝20を フォントタグに フォントを設定し
フォントタグを 有効化し
タグにフォントを設定します。
フォントの指定方法については既に、
「26 フォント」−「フォントの設定」 にて解説しているので詳細はそちらを参照ください。
■網掛け
構文=
<網掛けパターン>を <タグID>に 網掛けを設定 → ・
注:網掛けパターンとしてビットマップ名を指定します
(例:「gray25」)
網掛けの設定をおこないます。正確には、網掛けするビットマップパターンを設定します。多く使われるのは「gray25」など、GUIエンジンに標準で備わっている網掛け用のビットマップ名です。
記:網掛けを使うサンプルプログラムとして samplew\text-tag-complex.exe をご覧ください。
なお、「網掛けを設定」単独で網掛けになるわけではないため注意が必要です。
上記例のように併せて「背景色を設定」が必須です。「
指定した背景色を使った網掛けパターン」により網掛けをおこなうことになります。
(多くの場合背景色は白であるため網も白になり「網掛けを設定」しただけでは見えません)
プログラム例:
網掛けタグは ID
テキストボックスで テキストタグのIDを取得し
網掛けタグに 入れ
「#a0a0a0」を 網掛けタグに 背景色を設定し ←これもセットで指定
「gray25」を 網掛けタグに 網掛けを設定し
網掛けタグを 有効化し
「ここは網掛けです」を
テキストボックスに 網掛けタグで タグを付けてテキスト表示し
■取り消し線
構文=
<真偽>を <タグID>に 取り消し線を設定 → ・
取り消し線の属性をタグに与えます。
プログラム例:
取り消し線タグは ID
テキストボックスで テキストタグのIDを取得し 取り消し線タグに 入れ
真を 取り消し線タグに 取り消し線を設定し
取り消し線タグを 有効化し
「ここは取り消されています」を
テキストボックスに 取り消し線タグで タグを付けてテキスト表示し
■ベースライン
構文=
<オフセット>を <タグID>に ベースラインを設定 → ・
オフセットは整数で単位はピクセル
文字のベースライン(底辺)の位置を指定ピクセルだけ上に持ち上げます。
サンプルプログラム "text-tag-complex.exe" のメニュー 「タグ操作」 − 「以下の試験の前に多くのタグを定義」 を選んだあと、「各種タグを使い分けてテキスト表示」を押すと、さまざまな文字修飾が現れますが、そのうち「ベースラインを変更しています」の表示部が適用例です。
■字下げ
構文=
<オフセット1>と <オフセット2>を
<タグID>に テキスト字下げを設定 → ・
オフセットは整数で単位はピクセル
オフセット1は折り畳み先頭行に適用される
オフセット2は折り畳み2行目以降に適用される
字下げ量をピクセル数で指定します。
長い行は先頭行と、その先の折り畳み行とで区別して字下げが行われ、それぞれについて指定できます。同じで良いなら2つとも同じ値を指定してください。
「字下げ」という言葉から文字単位のように感じてしまいますが、ピクセル単位なので注意が必要です。
サンプルプログラム "text-tag-complex.exe" のメニュー 「タグ操作」 − 「以下の試験の前に多くのタグを定義」 を選んだあと、「タグを使い字下げをテスト」 を押すと字下げの効果を確認できます。
■右側余白
構文=
<オフセット>を <タグID>に テキスト右側余白を設定 → ・
オフセットは整数で単位はピクセル
長い行は折りたたんで表示されますが、そのときの右側余白を指定できます。デフォルトは余白無しです。
■テキスト揃え
構文=
<揃え指定>を <タグID>に テキスト揃えを設定 → ・
・揃え指定として以下のいずれかのシンボルを記述(文字列定数)
左揃え
中央揃え
右揃え
下揃え
上揃え
下辺揃え ※これはText中imageで利用
文字の揃え方については既に、
「ウィジェットの属性指定」−「ウィジェット中の文字の揃え方」 にて解説しているので詳細はそちらを参照してください。
■行間
構文=
<行間1>と <行間2>を <WidgIDorタグ>に テキスト行間を設定 → ・
・行間1:前の行と当行との隙間を指定 (デフォルトは4)
・行間2:当行とその折り返し行との隙間を指定 (デフォルトは4)
・行間は整数でピクセル単位
・<WidgIDorタグ> は テキストウィジェットID または タグID を記入
プログラム例:
(行間をテキストボックス全体に適用)(注:テキストボックスが有効状態で使う)
12と 12を テキストボックスに テキスト行間を設定し
テキストボックスを 変更を反映
(行間を一部のテキストに適用するためタグを生成)
テキストボックスで テキストタグのIDを取得し
行間空けタグに 入れ
12と 12を 行間空けタグに テキスト行間を設定し
行間空けタグを 有効化し
・・このあと、タグをテキストに付与・・
行間を指定します。
デフォルトの行間と異なる値にしたい場合に使います。
テキストウィジェットに対して(全テキストに適用)だけでなくテキストタグに対しても適用できます。
■複数の属性の付与
たとえば文字色とフォントを共に設定したい場合、次の2つの方法があります。
A.文字色を設定するタグ、フォントを設定するタグをそれぞれ設置
次に、両タグをテキストに対応させる
B.1つのタグに文字色とフォントを共に設定し、
次にその1つのタグをテキストに対応させる
上記いずれも可能です。Aは冗長ではありますが、テキストからのタグの取り除きを独立しておこなえる利点があります。
サンプルプログラム "text-tag-complex.exe" で次の操作をおこなうと、2つのタグを使うケースを確認できます。
(1) 「タグ操作」−「タグを使い色を付ける」
(2) 「タグ操作」−「タグを使いフォントを変更」
(3) 「タグ操作」−「フォントタグを削除」((2)のタグを削除)
上記操作によると、まず(1)で2個所のテキストに色が付けられ、(2)で2個所目のフォントが大きくなります。2個所目については都合、2つのタグが使われることになります。最後に(3)でフォントタグのみ除去して文字の大きさを元に戻しています。
作成したタグをテキスト(すべてまたは一部)に適用させるのに2通りの方法
があります。
方法1:
(1)テキストを素の状態で表示する
(2)タグを設置し、それをテキストの一部に適用する
方法2:
(1)タグを設置する
(2)そのタグを使うようなテキスト表示をおこなう
まずサンプルプログラム "text-tag-complex.exe" で次の操作をおこなってみてください。
● 「タグ操作」 − 「タグを使い色を付ける」を実行し、
次いで 「タグを使いフォントを変更」 から始まる
4つの項目を順次実行してみてください
→この4種は、既に表示されたテキストに対して、後付け
タグを適用する方法で色を付けています
● 「タグ操作」 − 「以下の試験の前に多くのタグを定義」
から始まる5つの項目を順次実行してみてください
→この5種はあらかじめ設置したタグを付与しながら
テキスト表示をおこなうものです
■タグを付けてのテキスト表示
構文=
(表示)
<文字列>を
<テキストID>と <タグID>で
タグを付けてテキスト表示 → ・
(表示して改行)
<文字列>を
<テキストID>と <タグID>で
タグを付けて一行テキスト表示 → ・
(改行のみ)
<テキストID>を <タグID>で タグを付けてテキスト改行 → ・
記:最後の「タグを付けてテキスト改行」は表示すべき
文字データを含まないためあまり意味がなく、
サンプルでも使っていません
プログラム例:
「12345678」を
テキストボックスに 赤色タグで
タグを付けてテキスト表示する
文法で示した単語群はそれぞれ、素の文字列表示であるところの 「テキスト表示」、 「一行テキスト表示」 、 「テキスト改行」 のタグ付与版です。
タグを付与しながら表示するため、後からタグを取り外すことは向いていません。
■タグを付与
構文=
<タグID>を
<テキストID>の
<開始位置列>から <終了位置列>までに
タグを付与 → ・
プログラム例:
サイズ大タグを
テキストボックスの
文字位置1から 文字位置2までに
タグを付与する
指定するタグを既存のテキスト範囲(開始位置から終了位置)に付与します。位置は整数ではなく文字列なので注意が必要です(詳しくは
「文字位置列」 の項を参照してください)。
終了位置は ”末尾文字の位置” ではないので注意してください。正確には、
”末尾文字のその次の位置(=Next)”
になります。
■タグを取り除く
構文=
<タグID>を
<テキストID>の
<開始位置列>から <終了位置列>までに
タグを取り除く → ・
プログラム例:
サイズ大タグを
テキストボックスの
文字位置1から 文字位置2までに
タグを取り除く
指定するタグを既存のテキスト範囲(開始位置から終了位置)から取り除きます。
■タグの削除
構文=
プログラム例:
指定するタグをテキストウィジェットの全領域から取り除き、その後タグ自体も抹消します。
タグを削除した後は、変数に記憶していたタグIDはもはや無効になっているため使わないでください。
■タグ付与領域内での文字挿入
既にタグを使った表示をおこなったテキスト領域の内部にキーボードから、あるいはプログラムから文字を挿入した時、その挿入文字にはその周辺にあるタグが自動的に付与されます。
■タグ付与領域より前での編集操作
既にタグを使った表示をおこなったテキスト領域より前の部分で文字の挿入あるいは削除などを行って文字の増減があった時、その先でタグを付与していたテキスト領域は自動的にそのタグ位置が調整されタグ付与状況には影響を与えません。
■タグ付与領域でのコピー、ペースト
タグ付与領域でのコピー、ペーストなどの操作をおこなっても、タグ情報はコピー、ペーストには含まれず、純粋に文字だけのコピー、ペーストになります。
ポップアップメニューはテキストウィジェット専用というわけではなく、他にキャンバスウィジェットでも使われますが、このセクションではテキストウィジェットでの利用について解説します。
まず、実際にどのように動作するかをサンプルプログラム "text-edit.exe" を操作して確認しておいてください。テキストボックス内で
右クリック すると
ポップアップメニュー が出現します。
ポップアップメニュー関係のソースコード記述は、同プログラムの副ソースファイルである "text-subsource-popupmenu.src" にほとんどが書かれています。ご覧になると分かりますが、プログラムの書き方は
メニューバー でのそれと良く似ています。
■ポップアップメニューを準備
構文=
<親ウィジェット>で ポップアップメニューを準備 → メニューID
プログラム例:
○○とは
ポップアップメニューは ID
テキストボックスで ポップアップメニューを準備し
ポップアップメニューに 入れ
・・・ボタンなどの登録・・・
・・・ボタンなどの登録・・・
ポップアップメニューを出すための準備をおこないます。メニューバーの時と違って有効化をおこなう必要はありません。
引数として親ウィジェットを指示しますが、この親ウィジェットの中で右クリックしたときにポップアップが開くことになります。通常はテキストウィジェットのIDを与えます。
■ポップアップメニューに項目を追加
既に、
「メニューバー」 − 「メニュー項目の追加」 で解説したボタンや区切り線などのメニュー項目追加がそのまま使えます。以下では参考のためボタンの追加例を書きますが詳しくはそちらをお読み願います。
プログラム例:
○○とは
ポップアップメニューは ID
ポップアップメニューと 「切り取り」と
ポップアップメニューのボタン処理の 実行情報と 「CUT」で
メニュー項目としてボタンを追加し
追加されるボタンなどの項目はポップアップメニューの上から下に向かって並びます。
ボタンの場合、押された時に起動すべき処理単語の実行情報をその引数と共に指定する仕様もまたメニューバーと同じです。
■ポップアップメニューのイベント処理
メニュー項目としてのボタンが押された時のイベント発生などもメニューバーとまったく同じです。
プログラム例:
ポップアップメニューのボタン処理とは (引数1,1 → ・)
引数1は 文字列
(パラメータ数が) 1と 異なる
ならば 「パラメータ数異常」で 重大エラー
つぎに
引数1に 入れ
引数1が 「CUT」に 等しい文字列
ならば 切り取り処理し
さもなければ
引数1が 「COPY」に 等しい文字列
ならば コピー処理し
さもなければ
・・・・