var
str,lbuff:String;
CRLF,CR,LF:String;
ptcr,ptlf,line:Integer;
MaxCol,MaxRow:Integer;
cx,cy:Integer;
begin
CRLF := '
';
CR := Copy(CRLF,1,1);
LF := Copy(CRLF,2,1);
// 選択範囲のサイズを調べる
// MaxCol:横幅(バイト数)
// MaxRow:縦幅(行数)
str := S_GetSelectedString(0);
MaxCol := 0;
MaxRow := 0;
while (str <> '') do // strが空で無ければループ
begin // {
MaxRow:=MaxRow+1; // 行数+1
// str中の先頭行の長さ調査
line:=Length(str); // 文字列全体の長さ
ptcr:=Pos(CR,str); // CRの位置
ptlf:=Pos(LF,str); // LFの位置
if(ptcr <> 0) and (ptcr < line) then line:=ptcr-1; // CRあり&&lineより前→line:=CRの前までの長さ
if(ptlf <> 0) and (ptlf < line) then line:=ptlf-1; // LFあり&&lineより前→line:=LFの前までの長さ
// ここまででlineに先頭の行の長さが格納されている
if(MaxCol < line) then MaxCol:=line; // MaxCol:=最大の長さの行
// str から先頭行を削除
str:=Delete(str,1,line); // strから先頭行長さ分 削除
if(Copy(str,1,1) = CR) then str:=Delete(str,1,1); // 先頭1バイトがCRなら削除
if(Copy(str,1,1) = LF) then str:=Delete(str,1,1); // 先頭1バイトがLFなら削除
end; // }
// サイズ調査完了
// 選択領域の左上へ
S_Delete(0); // 削除
S_MoveHistSet(0); // 現在位置を移動履歴に登録
S_Undo(0); // 元に戻す
S_MoveHistPrev(0); // 移動履歴: 前へ
// 横MaxCol×縦MaxRowの箱出力
MaxCol := MaxCol div 2; // MaxCol / 2
for cy:=1 to MaxRow do
begin
// 行出力バッファlbuff初期化
if(cy = 1) then lbuff:='┏'
else if(cy=MaxRow) then lbuff:='┗'
else lbuff:='┃'
;
// 横サイズ分lbuffに文字追加
for cx:=2 to MaxCol-1 do
begin
if(cy = 1) then lbuff:=lbuff+'━'
else if(cy=MaxRow) then lbuff:=lbuff+'━'
else lbuff:=lbuff+' '
;
end;
// lbuff行末尾文字追加
if(cy = 1) then lbuff:=lbuff+'┓'
else if(cy=MaxRow) then lbuff:=lbuff+'┛'
else lbuff:=lbuff+'┃'
;
S_MoveHistSet(0); // 現在位置を移動履歴に登録
S_InsText(lbuff); // 1行出力
S_MoveHistPrev(0); // 移動履歴: 前へ
S_Right(0); // カーソル右移動
S_Left(0); // カーソル左移動
S_Down(0); // カーソル下移動
end;
end;