投稿者 魔界の仮面弁士  (社会人) 投稿日時 2020/10/29 21:53:52
> 若い頃(DOSーBASICの頃)、

自分の言語遍歴……どこまで「若い頃」に入るかな。(汗

1982年: OA-BASIC ※独学:最初に触ったプログラム言語
1984年: N88-BASIC ※数日間のプログラミング合宿
1993年: Turbo Pascal (バージョン失念) ※学校の講義
1994年: Visual Basic 2.0J Standard Edition ※以降はすべて独学
1995年: Visual Basic 4.0J Professional Edition
1997年: Visual Studio 97 Enterprise Edition ※VBAに触れたのもこの頃から
1998年: Visual Studio 6.0 Enterprise Edition with MSDN Subscription
2001年: Visual Basic .NET Beta 2
2002年: Visual Basic .NET (2002)
以下略


> ・「With~End With」は、VBでも使う人はごく少数
いえいえ! そんなことはないと思いますよ。個人の好みの問題でしょう。
本当に NG なら、GoSub のように廃止されていたと思います。

廃止されていたら、匿名型宣言やオブジェクト初期化子の With キーワードも、
もしかしたら別のキーワードに置き換わっていたかも知れませんね。

VB ユーザーに統計を取ったわけでは無いので、利用者数は分かりませんが、
私自身、Excel VBA などにおいては今でも With をよく使います。

それに今回の .nmb1 の件も、 とかのデバッガだと表示できませんが、
 あたりの古い環境であれば、問題無くデバッガに表示されます。

ただし、Stop 中にイミディエイト ウィンドウに「? .nmb1」と入力するような書き方は
 であっても許可されていません。(でも VBA ならば OK !)


With ステートメントに関する stackoverflow でのやりとりを、機械翻訳版と共に紹介しておきます。
https://stackoverflow.com/questions/283749/the-vb-net-with-statement-embrace-or-avoid
https://j.mp/31SVB8S


> それでも私は、Withの提案者に賛同し、激励したいと思います。

操作対象が 1 つだけの場合には、With でまとめると便利ですよね。

VB3 までは、オブジェクトはあってもクラスが無く、組み込みのオブジェクトを使うしかありませんでした。
VB4 以降でも、クラスを自作する人はそれほど多くありませんでしたので、纏めやすかったのだと思います。


> MSが認定した「Most ナンタラ」のはずだから、最もリッパな方だったのですね。
正確には認定制度では無くて、単年の表彰制度ですね。
過去 1 年間の個人の活動実績をもとに、その年の受賞審査が行われます。
https://mvp.microsoft.com/ja-jp/


> 自作プログラムを見て気づいたのですが…私はクラスを一つも使ってませんでした(笑)
とはいえ、Label や Button もクラスです。String だってクラスです。
沢山のクラスを既に扱っているわけですから、少しずつ歩んでいきましょう。


> ※フォーム以外、すべてモジュール「Friend Module Mdl_***」 ←Public も一切未使用(Friendのみ)
その「Public Class Form1」は Form そのものではなく、
「Form クラスを継承した自作の Form1 クラス」なわけで。


> 「Wingdings」ぐらいは、プロシージャ名に使えるようにして欲しい
表示だけの問題ですから、フォントは自由に選べますよ?
特定の文字だけを別のフォントで表示、というわけにはいきませんけれども。


> 「DoEvents」(Application.DoEvents) を使ってみたのですが、どうにも珍現象が続発。
DoEvents はシングルスレッドの処理なので、実はマルチスレッドとは無関係です。

「並行」処理のために DoEvents が使われることはありますが、
「並列」処理となると DoEvents では実現できません。


> 当時の解説本でも「DoEvents は危険」とあって、
マウスやキーボード系のイベントや、画面の描画などの処理という物は、
イベントが何も処理されていない「アイドル時」に行われます。

なので、高速でボタンを連打しても、Button1_Click の処理中に
Button1_Click のイベントが複数同時に走ったりすることはありません。
前のイベントが終わってから、次のイベントが発生します。

TextBox1.Text を書き換えると TextChanged イベントが発生する…といったイベント連鎖ならば
ありますが、それは同期的に起こる物であり、非同期的なものではありません。

DoEvents は、イベント処理中にアイドルタイムを用意することで、
そうした順序処理に割り込みをかけることになります。
「今は Button1_Click を処理している最中だけど、他のイベント処理も必要なら引き受けるよ!」
というのが DoEvents です。
これによって Button1_Click が再入するかもしれないし、Timer のイベントが発生するかもしれない。

そうした、予期せぬタイミングでのイベント処理があると、プログラムの流れが追いにくくなるので、
再現させにくい不具合を作りこんでしまいやすくなります。なので「無暗に多用するのは危険」ですが、
動作を理解して使う分には問題無いと思います。

とはいえ今となっては、DoEvents に頼るよりは、Appliation.Idle イベントを使ったり
Task クラスを使う方が健全かと思います。


> 本来の本格的なプログラム例(スレッドクラスのナンタラを使う…)などが紹介されてたのですが、
非同期プログラミングモデルも、
 APM (素の非同期プログラミングモデル) … VB.NET 2002/2003 世代
 EAP (イベント型非同期プログラミングモデル) … VB2005~2008 世代
 TAP (タスク型非同期プログラミングモデル) … VB2010 以降
のように遷移しているため、生の Thread クラスを使う機会は減ってきています。


> ※今春に「SyncLock」なるモノを見つけて、コレを組み込もうとしたのですが、する前から正常動作してる(笑)
この「正常動作」判定が、また難しい所なのですよね。

たとえば、Public Money As Integer という変数があって、それを複数のスレッドから
排他制御なしに Money += 1 するような単純な処理さえ NG となります。
(微妙な処理タイミングによって、+1 されない可能性があります)

この手の不具合は、数十万回連続実行した時に、数回だけ失敗するといった
再現性の低い問題を作りこむ危険性があります。そのため、スレッドセーフかどうかを
意識してコーディングできるだけの学習土台が求められます。体系立てて学ぶことが肝要な分野です。