R"(...)", R"***(...)***" 系機能問題なしNo.09022
天翔記.jp さん 16/08/26 13:33
 
機能確認の報告です。

表題の件、問題なく機能しているようです。


いくつか試しましたが、以下のように、
言語を内側にそのまま記述でき、かつ、
変数とのやりとりとの距離が記述的に近いので、
「秀丸マクロは言語を問わない、ファイル内に複数の言語を入れ混ぜても問題なし、
変数共有も容易、かつ、見やすい」
といった状態にまでなったと思います。

確認したソースのうちの1つ

#PY = loaddll( hidemarudir + "\\hmpy.dll" );

if (! #PY) {
 message(".dllが無い");
}

#_ = dllfunc( #PY, "DoString", R"IRONPYTHON(
# coding: cp932
 
import sys
import clr
clr.AddReference("System.Drawing")
clr.AddReference('System.Windows.Forms')
clr.AddReference('Microsoft.Ink')
from System.Drawing import Font, Color
from System.Windows.Forms import (Form, Timer, DockStyle, Panel, TextBox, Bu
tton,
                                  SplitContainer, Orientation)
from Microsoft.Ink import *
 
f = Form()
f.Text = '手書き入力'
 
btnClr = Button()
btnClr.Text = 'クリア'
 
btnCng = Button()
btnCng.Text = "消しゴムに変更する"
 
pnl = Panel()
pnl.BackColor = Color.Khaki
overlay = InkOverlay(pnl)
overlay.Enabled = True
 
tb = TextBox()
tb.Font = Font('MS 明朝', 20)
tb.Multiline = True
 
sc = SplitContainer()
sc.SplitterWidth = 10
sc.Orientation = Orientation.Horizontal
 
# Layout
f.Width = 600
f.Height = 400
sc.Dock = DockStyle.Fill
btnClr.Dock = DockStyle.Top
btnCng.Dock = DockStyle.Top
tb.Dock = DockStyle.Fill
pnl.Dock = DockStyle.Fill
f.Controls.Add(sc)
sc.Panel1.Controls.Add(btnClr)
sc.Panel1.Controls.Add(btnCng)
sc.Panel1.Controls.Add(pnl)
sc.Panel2.Controls.Add(tb)
 
def OnStrokesDeleted(sender, args):
    tb.Text = overlay.Ink.Strokes.ToString()
overlay.StrokesDeleted += OnStrokesDeleted
 
def OnBtnClr_Click(sender, args):
    overlay.Ink.DeleteStrokes()
    pnl.Refresh()
    tb.Text = ''
btnClr.Click += OnBtnClr_Click
 
def OnBtnCng_Click(sender, args):
 
    if overlay.EditingMode == InkOverlayEditingMode.Ink:
        overlay.Enabled = False;
        overlay.EditingMode = InkOverlayEditingMode.Delete;
 
        # 削除を指定します。
        overlay.EraserMode = InkOverlayEraserMode.StrokeErase;
 
        # オーバーレイを再び有効にします。
        overlay.Enabled = True;
        btnCng.Text = 'ペンに変更する'
    else:
        overlay.Enabled = False;
        overlay.EditingMode = InkOverlayEditingMode.Ink;
 
        # オーバーレイを再び有効にします。
        overlay.Enabled = True;
        btnCng.Text = '消しゴムに変更する'
 
btnCng.Click += OnBtnCng_Click
 
gLastText = ""
def TimerDraw(t, args):
    global gLastText
    tb.Text = overlay.Ink.Strokes.ToString()
    gLastText = tb.Text # 秀丸に渡すためのテキスト変数
    hm.debuginfo("update")
    if t:
        t.Stop()
        t = None # 破棄
 
# Event handling
def OnStroke(sender, args):
    t = Timer();
    t.Tick += TimerDraw;
    t.Interval = 100; # ミリ秒単位で指定
    t.Start();
overlay.Stroke += OnStroke
 
def FormClosed(sender, args):
    hm.debuginfo("close")
f.FormClosed += FormClosed
)IRONPYTHON");

// 同じシンボルが問題ないか

#_ = dllfunc( #PY, "DoString", R"IRONPYTHON(
f.ShowDialog()
)IRONPYTHON");


freedll(#PY);


R"(...)"の内部にコメント「//」があっても、マクロ側ではなく、
文字列としてちゃんと解釈されているので(マクロパーサーとして、評価順を間違っ
たりしていない)、
主だったバグはないのではないかと思います。

とりあえず、ご報告まで

[ ]
RE:09022 R"(...)", R"***(...)***" 系機No.09025
秀丸担当 さん 16/08/26 14:25
 

ご確認ありがとうございます。
ちなみに、もともと""で書く文字列の長さは4KBくらいまでという上限がありま
した。
R"()"もこの点は変えていなくて、同じように長すぎるとエラーになると思いま
す。
上限を増やす必要性もあるかもしれません。

[ ]
RE:09025 R"(...)", R"***(...)***" 系機No.09042
天翔記.jp さん 16/08/30 02:39
 
>上限を増やす必要性もあるかもしれません。
そうですねぇ。

・内容にもよりますが、仮にスクリプトを内側に記述する際は、
 4Kは200行ぐらいのかな、という印象ですね。
 16Kだと800行〜1000行ぐらい。

 スクリプトを内部に埋め込む、といった目的を想定した場合は、
 1000行ぐらいを超えると、外にファイルとして出すという
 判断に切り替えてるように思います。
 (個人の感想の域を出ませんが、なんとなくな経験で)

 節約してちょっと増やすなら16kとか32kとか、そのあたりの数値かと


・個人的には文字列バッファーに制限を設けると、
 ファイルの内容すら変数に入れられなくなるので、
 秀丸マクロを中心軸に据える人は、かなり不便だろうとも思うのですが、
 この辺りは、「使用メモリ制限を明示的に設定している」といった独特なアプリな
ので
 難しい問題ですね。



 
 
 


 

[ ]
RE:09042 R"(...)", R"***(...)***" 系機No.09048
秀丸担当 さん 16/08/31 14:35
 

文字列を書いたときの上限を増やしてみて、問題なさそうなので、次のβ版では
とりあえず64KBくらいにしてみようと思います。

あと使っている変数の総合計の上限というものもあって、通常では1MBになって
います。
総合計は設定があって、[その他]→[動作環境]→[環境]の「マクロ変数の上限」
で指定することができます。

[ ]