テキスト
テキスト型
Text-Cには、HTEXT(テキスト)データ型が標準で提供されています。
テキスト型によって、文字列データの操作が容易になります。
テキストは、挿入削除ができる文字列バッファとして動作します。
バッファの容量が足りなくなると、自動的に拡張されます。原理上は4GBまでのデータを扱えます。
テキストはnewで作成し、各種のAPIで操作します。
HTEXT text = new();
add(text,"abc");// 現在位置(=先頭)に"abc"を挿入
add(text,"def");// 現在位置(=abcの次)に"def"を挿入
- 「HTEXT text」は、テキスト型の変数textを宣言します。
- 「new()」は、テキストを作成します。
宣言したtext編集にnew()を代入して、以降はtext変数を用いて扱います。
new()で作成したテキストは、自動的に削除されるのでint型と同様に扱えます。
- テキストは、テキストファイルの読み書き、画面表示と各種編集に対応しています。
テキストは、C言語標準ライブラリの「strcpy」などの文字列関数にも対応しています。
HTEXT text = new();
strcpy(text,"Hello,world");
printf("%s\n",text);
テキストは、バッファサイズを越えた文字列の追加「バッファオーバラン」がなく、信頼性の高いプログラムを作成できます。
Text-Cでは、各種の処理をおこなうライブラリAPIが標準で用意されています。
Text-CのAPI一覧は、"wz://text.h"(WZフォルダのtext.hファイル)にあります。
関数宣言のうち、textapi修飾子が付いた関数がAPIとなります。
段落とリスト
Text-Cでは、テキストを文字列の配列「リスト」として扱うことができます。
1段落 改行
2段落 改行
3段落
テキストの改行で区切った文字列は段落となります。
Text-Cでは、各段落を1つの配列要素と見なします。上記の例では3つの要素の文字列配列となります。
APIの「STR型」の引数にテキストを渡すと、テキストの現在段落の文字列が引数となります。
C文字列型「char*」を渡すと、C言語のstrcpyと同じ動作をします。
(例1) 「strcpy(STR sz1,STR sz2)」のsz1とsz2にテキストを指定すると、sz1の現在段落がsz2の文字列に置き換わります。
(例2) printfの"%s"にテキストを指定すると、現在段落を表示します。
下記の段落操作に対応しています。
- 前後の段落にジャンプ
- i番目の段落にジャンプ
- 現在位置に段落を挿入
- 段落の削除
- 前後の段落の入れ替え
- テキストのリストボックス表示。
カラムと表
Text-Cでは、テキストのタブ文字(文字コード0x09)と改行で、表形式のデータを扱います。
文字列11 タブ 文字列12 タブ 文字列13 改行
文字列21 タブ 文字列22 タブ 文字列23 改行
文字列31 タブ 文字列32 タブ 文字列33 改行
タブで区切られた各文字列を、カラム(CLM)と呼びます。
APIの「CLM型」の引数にテキストを渡すと、テキストの現在位置のカラムの文字列が引数となります。
(例1) 「clmcpy(HTEXT clm1,CLM clm2)」
- clm1にはテキスト、clm2にはテキストまたはC文字列を指定します。
clm1の現在カラムがclm2に置き換わります。
- clm2にテキストを指定すると、clm2の現在カラムがclm1にセットされます。
- clm2にC文字列型を指定すると、先頭から「タブ」「改行」「\0」までの文字列が、clm1にセットされます。
(例2) printfの"%cs"にテキストを指定すると、テキストの現在のカラムが表示されます。
テキストを表形式とする、各列の幅を揃えた画面表示も可能です。
アウトライン
Text-Cでは、見出し段落を認識したアウトラインで木構造を扱います。
ツリーの各項目の「ノード」は、テキストの段落で表します。
ノードの親子/兄弟関係は、見出しのネストレベルで表します。
プロパティ
Text-Cではテキストのプロパティによって、設定データのファイル読み書きと、プログラムからの項目の取得参照・変更、プロパティシートによる一覧表示とユーザ設定に対応しています。
プロパティは、項目名と項目内容を組み合わたものです。
項目名には、6文字までの任意の英数字(識別値)を指定します。項目内容には、文字列または整数値を設定します。
項目名 | 項目内容 |
POP3 | mailserver.mycorp.co.jp |
USER | myname |
PASSWD | xxxx |
APOP | 1 |
テキストに上記のプロパティをセットするには、「text ピリオド 項目名 = 項目内容」を記述します。
文字列のプロパティをセットするには、項目名の前にclmを付けます。
HTEXT text = new();
text.clmpop3 = "mailserver.mycorp.co.jp";
text.clmuser = "myname";
text.clmpasswd = "xxxx";
text.apop = 1;
プロパティは、「項目名: 空白 項目内容 改行」の形式でテキストにセットされます。
(空行)
pop3: mailserver.mycorp.co.jp
user: myname
passwd: xxxx
apop: 1
プロパティの項目内容を取得するには、「text ピリオド 項目名」を記述します。
文字列のプロパティを取得するには、項目名の前にclmを付けます。
if (!clmcmp(text.clmpasswd,"xxxx")) ...
if (text.apop) ...
プロパティシートを表示するには「property」APIを用います。
- property APIでは、プロパティを視覚的に表示して設定の確認や変更をします。
- ユーザによる設定変更は、プロパティのテキストに反映されます。
- プロパティシートの表示方法は、サンプルの「プロパティ」をご参照ください。
プロパティの設定内容を永続化するには、プロパティをファイルに保存します。
「cfgnew(id)」APIでプロパティのテキストを作成すると、保存場所の決定と保存処理が自動化されます。
引数のidには、プロパティの名称を「ID_PROP」などの「ID_+識別値」を指定します。
プロパティを文字列で取得すると、テキストバッファのポインタが直接返されます。
このポインタを変数に代入して長時間保持すると、プロパティが変更されたときに位置がずれて無効となり、不具合の原因となります。
テキスト内の、文字列プロパティのコピーには対応していません。
下記のプログラムは無効となります。
text.clmname = text.clmstr;
テキストのプロパティ
テキストには、下記のプロパティが標準で用意されています。テキストの情報の取得と変更をおこないます。
_edit | (getset) 編集フラグ |
_nedit | (get) 変数回数のカウンタ |
_ro | (get) リードオンリー |
_type | (set) テキストのタイプをセット(ID_LISTOL,ID_RSS,ID_HTML) |
_mbx | (getset) MBXフラグ |
_msg | (getset) メッセージフラグ |
clm_fname | (get) ロードしたファイル名 |
v | (get) (HVIEW)ビュー |
(get)はプロパティの取得、(set)はプロパティの変更、(getset)はプロパティの取得と変更に対応します。
識別値
「識別値」は6文字までの任意の名前です。
プログラムでは、先頭に「ID_」を付けて大文字で記述します。
ID_TEXT , ID_OPEN , ID_A , ID_B
識別値の大文字と小文字は区別されないので、ID_TEXTとID_textは同じ識別値になります。
識別値には半角の英字と数字が指定できます。
識別値は固有の32bit整数値に変換されます。ID_Aは1、ID_Bは2に変換されます。
識別値はcase文に記述できます。
switch(id) {
case ID_OPEN: ...break;
case ID_TEXT: ...break;
}
識別値は「#define」の定数の代わりに指定します。
- プロパティ名
- メソッド名
- メニューコマンド名
- プロパティダイアログの各プロパティ名
- アプリケーションID
- 設定ファイルID
- プログラムの作者ID
- その他、任意の名前としてプログラムで用います。
「プロパティ名」「メソッド名」に指定する識別値は、「ID_」は外して小文字で「text」と記述します。
先頭が"_"で始まる識別子「ID__FNAMEなど」は予約されています。