プラグイン MeryRowCol エレメント数とタブの計算
1行の文字を取得して、行頭からカーソル位置までの文字列を取得します(折り返しがある場合も大丈夫です)。
結合文字として1文字毎にエレメント数を取得します。
各エレメントが1以上で、表示できない文字なら文字幅は0、それ以外は2とします。
各エレメントが1で、情報なしなら文字幅は0、特殊文字なら文字幅は0、タブなら文字幅はMeryのタブサイズ、それ以外なら文字幅は1とします。
取得した桁数(文字幅の合計値)をタブサイズで割り算した結果により桁位置を計算しています。
//該当行の文字列を取得
FillChar(Text, SizeOf(Text), 0);
LineInfo.flags := POS_LOGICAL;
LineInfo.cch := Length(Text);
LineInfo.yLine := iPosY;
Editor_GetLine(hwnd, @LineInfo, Text);
sStr4 := Text;
//設定
sStr6 := Copy(sStr4, 1, iPosx);
//桁位置を計算
iNum2 := 0;
iLen2 := 0;
sStr9 := ' ';
for iRow1 := 0 to iPosX-1 do
begin
//1文字設定
sStr7 := MecsCopyC(sStr6, iRow1+1, 1);
FillChar(LpBuffer, SizeOf(LpBuffer), 0);
StrPCopy(PChar(@LpBuffer[0]), sStr7);
//該当文字のエレメント数
iLen3 := MecsCCSLength(sStr6, iRow1+1);
//各エレメントの内容
iValue1 := Ord(LpBuffer[0]);
iValue2 := Ord(LpBuffer[1]);
//エレメントが1以上
if iLen3 > 1 then
begin
if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFD) = $DFFD) then
begin
iLen5 := 0;
end
else if ((iValue1 and $D83C) = $D83C) and ((iValue2 and $DFFF) = $DFFF) then
begin
iLen5 := 0;
end
else
begin
iLen5 := 2;
end;
end
//エレメントが1
else
begin
if iValue1 = $0000 then //情報なし
begin
iLen5 := 0;
end
else if iValue1 = $200D then //特殊文字
begin
iLen5 := 0;
end
else if iValue1 > $00FF then //半角エリア外
begin
iLen5 := 2;
end
else if iValue1 = $0009 then //タブ
begin
iLen5 := IntTabSize;
end
else
begin
iLen5 := 1; //該当外なので半角
end;
end;
//とりあえず加算
iLen2 := iLen2+ iLen5;
//余り
iMod2 := iLen2 mod IntTabSize;
//無し
if iMod2 = 0 then
begin
iNum2 := iNum2 + iLen5;
iLen2 := 0;
end
//有り
else
begin
//タブ
if iLen5 = IntTabSize then
begin
iNum2 := iNum2 + iLen5 - iMod2;
iLen2 := 0;
end
//タブ以外
else
begin
iNum2 := iNum2 + iLen5;
end;
end;
end;