投稿者 タカジィ  (社会人) 投稿日時 2020/10/30 17:55:52
再度の、魔界の仮面弁士さんのご回答、ありがとうございました。

●先にメールへの返信…のようなモノを書きます。
>1982年: OA-BASIC ※独学:最初に触ったプログラム言語
全然知らない名前なので、Webで見たら東芝パソピアなんですね。

私はビンボーだったので(今も昔も)「FM-7」(富士通=タモリが宣伝)でスタート。
当時ホントにビンボーで、買う前の1年間、キーボードの実物大写真(NHK入門講座の本に見開き付録)を机に広げ、練習してました(懐)
それにしても魔界の仮面弁士さんは「Professional」→「Enterprise」→「Subscription」…と、快調に「おカネ持ち街道」をひた走り…されたことが、容易に想像できます。

スレッドの件(なんとなく)わかりました。
新PCに変えたらバグがなくなる…なんてハズはないので、今後も注視していたいと思います(笑)


●さて、お二人に「With」の見やすさを例示して、最後に一矢、報いたいと思い…
見本になるモノは… 何かないかと… 探してたら~ ♪あった!
※ちょうど、さっきから、BGMがYouTubeで♪「悲惨な戦い/なぎらけんいち」(世代が違いますね)

↓るきお(管理者)さんのお手本(RPGSample>SoundComposer.vb)より引用 ※以降、動作はすべて未検証
Public Sub New(ByVal music As Musics)
  Select Case music
    Case Musics.A
      FileName = "button-22.wav"
    Case Musics.B
      FileName = "button-23.wav"
    Case Musics.Field
       :

↓With の使用例 ※私はこっちが見やすい(認識しやすい)と思うのですが…?
Public Sub New(ByVal music As Musics)
  With Musics
    Select Case music
      Case .A
        FileName = "button-22.wav"
      Case .B
        FileName = "button-23.wav"
      Case .Field
       :

↓さらに、私には(今では「絶対やめろ」と言われてる)「マルチ」のほうが、断然…
Public Sub New(ByVal music As Musics)
  With Musics
    Select Case music
      Case .A : FileName = "button-22.wav"
      Case .B : FileName = "button-23.wav"
      Case .Field  ←文字数が違うケースがあるとダメですね(笑)
       :
※上の文字数の違うケースのような場合、見やすくするためになら(文字数をムリにでも合わせるためなら)、私は日本語を使うことをいとわない(更なるガラパゴス化?;笑)
例:
With Cast(n敵ボス)
  Select Case course
    Case nt左へ : .X -= 1
    Case nt右へ : .X += 1
    Case nt上へ : .Y -= 1
   :
※上記「nt左へ」などは定数 ※Enumは使わない ※「n」はnmb=integer 「t」はテンキーで方向指示(左=4、右=6 … ←ガラパゴス化極まり?)


●反対に 業界の方が With を使う頻度が少なくなった(かも知れない)理由も一つ見つけました。
私の理解してる「構造体」と、通常に多用される(?)構造体とは、意味が違ってたみたい?
・私の知識の「構造体」は、VB6で「単純な変数を収納したモノ」→ .NET にそのまま移行し、配列などにして使用
・通常の構造体は Location とか Point など、関連性の高い変数をまとめたモノ(しかも階層的に?)(←あくまで私の解釈)

↓るきお(管理者)さんのお手本(RPGSample>FieldContextObject.vb)より引用
Public Sub PlayerUnit_Stepped(sender As Object, e As SteppedEventArgs)
  :
  Select Case Player.MapPoint
    Case New Point(32, 100)
      LoadMap("Home.map")
    Case New Point(105, 79)
      LoadMap("Teracotta.map")
    :

私は「Point」という名称が座標値(X,Y)関連とは、どうしても認識できない(英語がダメだから?)ので、無視してた(使えない)のでした(笑)
上のような使い方( Case New Point(32, 100) …等)は想像もつききませんでした。
このような比較では if文を使うことしか考えられなくて。
その上で「With」を使うと、見やすくなったのでした。
  With Player
      if .MapPointX = 32 AndAlso
         .MapPointY = 100 then
         :


●結論?
どうやら、最新のVBプログラミングを理解するためには、魔界の仮面弁士さんご指摘の「クラスと構造体の違い」を本格マスターする必要がありそうです。
別サイトの記事をチラと見たら、構造体の中で「set」すれば初期化できるみたいで、これも新発見(笑)
これを使うと「With」の使用頻度も少なくなりそう?

ありがとうございました。
(またもやダラダラと長文になってしまいました。お許しを)

タカジィ

今回も追伸を…
魔界の仮面弁士さんのお手本からも、何かないかと…さがしたのですが… なかった …どころか、またびっくりで。
投稿欄の、お隣さん(高校生みたい)への回答メールに、参考プログラムのURLがあったのでノゾいたら、驚愕。
 ttp://www.vb-user.net/junk/replySamples/2010.02.08.14.53/Clipping.txt
・この「参考プログラム」って、質問者の高校生が「試験が終わったら見てみる」ような(気楽な)レベルなの?
・これが理解できるって、最近の高校生のレベルって(昔の高校生のコトも知りませんが)こんなにスゴいの~? と、ア然。

私は、いまだ「Overrides」など使ったこともない。使うと、話が(プログラムが)更にややこしくなる気がして。
※Override=乗っ取り と、脳で日本語に変換できるのみ(笑)

また「doublebufferr」にもイヤな思い出が。
VB.NETに乗り換えた直後、画面の「バタつき」に困りはて、何か…とさがしたら… あった! のがコレ。
でも、どうプログラムしても「バタつき」が治らず、結局自前で考えたPictureBox2つを表裏切り替えるという方法で対処。
※結局、「doublebufferr」には、いまだ近寄ったことがない(笑)

私は、この高校生に「一つのコマンドが使えなくても(理解できなくても)、同じ処理ができる別の方法があるはずだから、投げないように」と言いたいですナ(笑)
…とヤケクソ気味に書いてはみたのですが、何度も魔界の仮面弁士さんのプログラムを見返してみて…
私の知らないテクニックを使うと、こんなに(恐ろしいぐらいの)短いプログラムで収まるのかと、ボー然としてるのも事実です。

「たし算」しか知らない者が、はじめて「かけ算」を目の当たりにしたような…。
※しかもタイムスタンプ(らしきモノ)からみると「2010.02」って、10年前から(普通のテクニックとして)あったの~?

どうやら「構造体の勉強」前に(高校生と一緒に)このプログラムの勉強から始めた方がよさそう(笑)

以上