投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/23 23:34:51
最初の質問では、
 InkPicture2.ink.DeleteStroke InkPicture2.ink.strokes(29)
のように固定値 29 に対して DeleteStroke していたのに対し、今回は
 InkPicture2.ink.DeleteStroke InkPicture2.ink.strokes(dels(d) - 1)
のような変動値にしているのですね?


今回の場合、Strokes プロパティから得られる InkStrokes コレクションに渡す引数が
間違っています。InkStrokes コレクションに対しては
 .strokes( Id )
ではなく
 .strokes( Index )
が求められます。
Id と Index は全く別物であることに気を付けましょう。


> やってみると、st.idが飛んでいます。
Index は連番を保証しますが、ストロークの Id は連番を保証するものではありません。

ストロークが削除されたとしても、各ストロークの Id は変化しませんが、
ストロークが削除されると、それ以降のストロークの Index は減少するためです。

それゆえ、ストロークの追加・削除によって、Index と Id の組み合わせが変化することになります。


たとえば、3 本のストロークがあって、
 InkPicture1.Ink.InkPicture1.Ink.Strokes(0).Id が 1
 InkPicture1.Ink.InkPicture1.Ink.Strokes(1).Id が 2
 InkPicture1.Ink.InkPicture1.Ink.Strokes(2).Id が 3
となっているときに、
 InkPicture1.Ink.DeleteStroke InkPicture1.Ink.Strokes(Index:=1)
を実行すれば、
 InkPicture1.Ink.InkPicture1.Ink.Strokes(0).Id が 1
 InkPicture1.Ink.InkPicture1.Ink.Strokes(1).Id が 3
という状態になるわけです。


> dels(UBound(dels) - 1) = myStroke.id
今回のケースでは、Id の一覧を管理している点を見直すべきでしょう。
処理として必要なのは、Id や Index ではなく、Stroke オブジェクトそのもののはずです。

ですから、 Id や Index を 「As Long な配列」として管理するのではなく、
それぞれのストロークそのものを「As IInkStrokeDisp な配列」、または
「As VBA.Collection な汎用コレクション」あるいは
「As InkDisp な別インクコレクション」などで管理しておく方が、手っ取り早いのではないでしょうか。

あるいは、複数ストロークの「一括削除」などが目的であれば、戻したい状態のストロークを
バイナリデータとして変数もしくはファイルに保持しておき、リロードするという手もあります。

Option Explicit
Private SavedStrokes() As Byte

Private Sub CommandButton1_Click()
    '現在のストロークをバイナリとして保持 
    SavedStrokes = InkPicture1.Ink.Save()
End Sub

Private Sub CommandButton2_Click()
    '保持しておいたストロークを復元 
    Dim newInk As InkDisp
    Set newInk = New InkDisp
    newInk.Load SavedStrokes
    
    InkPicture1.InkEnabled = False
    Set InkPicture1.Ink = newInk
    InkPicture1.InkEnabled = True
End Sub



> プリザーブを修正してみましたところ、1回目は動くようになりました。
今回のケースに限りませんが、ループ内で毎回 ReDim Preserve するような
コーディングはあまり好ましくありません。Preserve の回数は最小限に留めましょう。

現在のストローク総数は .Count で得られるので、最初に一回だけ
総数分の領域を ReDim で確保しておけば、ループ内で毎回
ReDim Preserve しなおす必要はないと思いますよ。

まぁ、件数が少ない場合はさほど問題になりませんが…。
https://vbabeginner.net/redim-preserve-really-slow/