VB6を.NETへ移行するログ
Visual Basic 完全素人がカンでやってみる。
2024/07/12
とりあえず、リリースページからVisual Sutudio をダウンロードしてみる。
バージョンは最新のもの。
2024 年 6 月 18 日 - Visual Studio 2022 バージョン 17.10.3
Community とProfessional, Enterprise の違いがわからんので、ProfessionalをDLしてみる。
続行
ワークロードを選ばないといけないらしい。
web&クラウドは、 ASP.NET, Azureの開発, Pythonの開発を選択してみた。本当にいるのかは不明。
デスクトップとモバイルは、.NETマルチプラットフォームアプリのUI開発, .NETデスクトップ開発を選択してみた。
.NETデスクトップ開発の方は必要なはず。
念のため、他のツールセットの Visual Studio 拡張機能の開発も選択しておいた。
場所は C:\Program Files\Microsoft Visual Studi\2022\Professional にインストールされる。
16:15 インストール開始。
17:10くらいに確認したら、インストールが終わっていた。
再起動する。
winボタンを押したとき出てくる画面
最近追加の Start Experimental Instance of Visua...を開いてみる。
サインインしてみた。
開発設定のプルダウンはVBとかCとかJavaとか言語を選択できたけど、とりあえず「全般」で。
配色テーマは、デフォの濃色で。
Visual Studioの開始。
早速なにすればいいのかわからんぞ。
VB6で書かれた電気抵抗original
が入ったローカルフォルダでも開いてみるか。
開いたはいいが…。
*.frmファイルは開けるが、
*.frxファイルは開けないっぽいね。
frmはVBでフォームモジュールファイルにつく拡張子らしので、UI画面を作ってくれるんだろう。
frxはVBでバイナリフォームファイルにつく拡張しらしいので、人間が読んでもわからないコンピュータくん用の情報が入っているんだろう。たぶん。
frmError.frmを開いてみた。
Begin で始まって、Endで終わっている、入れ子構造。
Begin ###の###の部分がコントロールの型と名前。ここをみて.netへの変換処理をしていくらしい。
このままこのプロジェクトで編集していくことは不可能っぽいので、新しいプロジェクトを作ることにした。
Visual Studioを再起動。
左半分が最近開いた項目
右半分が開始するになっている。
開始するにはボタンが4つ並んでいる。
・リポジトリのクローン
・プロジェクトやソリューションを開く
・ローカルフォルダを開く
・新しいプロジェクトの作成
その下に小さくコード無しで続行。
新しいプロジェクトの作成を開くとする。
フォームを作っていきたいので、
検索窓に「Windows Forms App 」と入力。
.NET Frameworkなるものを開きたいのだが、 似ているアイコンが2人がいる。
違いはアイコン右上がC#かVBか。
もちろんVBの方を選択。
アプリケーションかライブラリの違いもあるっぽいが、とりあえずアプリケーションの方を開いてみる。よくわかんないよ。
適当にプロジェクト名をつけて、
フレームワークのバージョンを選択した。
新しい方がいいのかな?わからん。
ソリューションとプロジェクトを同じディレクトリに配置するに☑を入れておいた。
(複数のPCにディレクトリごと入れたいので。)
(寄り道)
新しいフォームを作ろうとしたんだが、ソリューションを右クリックして追加を押したけど、windowsフォームがない!
「.NETデスクトップ開発」ワークロード は☑してDLしたはずなのに…。
開発設定を「全般」にしたのがよくなかったのかな?
仕方が無いので、Visual Studio Installerを起動し、修正ボタンを押下。
(寄り道の寄り道)
最初に入ってたForm1をコピーして中身を修正することで、ErrorFormを作ることに成功!無駄な努力!
追加のところから新しい項目に行っていたのが間違いでしたね。
下の方にモジュールがありました。
ここにwindowsフォームがありました。
追加~♪
次回以降は、新しい項目に現れます。
気を取り直して、EndFormを作っていこうと思います。
Windowsフォームを押す前に、名前を変更しておかないと、後々めんどくさい。
EndFormを右クリックして、
コードの表示
以下を貼り付ける
Public Class EndForm
Private Sub Command1_Click(sender As Object, e As EventArgs) Handles Command1.Click
Application.Exit()
End Sub
Private Sub Command2_Click(sender As Object, e As EventArgs) Handles Command2.Click
Me.Hide()
End Sub
End Class
24行目Private Sub InitializeComponent()から、
29行目End Subまでをかきかえる。
コードの表示
Me.Command1 = New System.Windows.Forms.Button()
Me.Command2 = New System.Windows.Forms.Button()
Me.Image1 = New System.Windows.Forms.PictureBox()
Me.Label1 = New System.Windows.Forms.Label()
CType(Me.Image1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'Command1
'
Me.Command1.Location = New System.Drawing.Point(36, 192)
Me.Command1.Name = "Command1"
Me.Command1.Size = New System.Drawing.Size(157, 61)
Me.Command1.TabIndex = 0
Me.Command1.Text = "はい"
Me.Command1.UseVisualStyleBackColor = True
'
'Command2
'
Me.Command2.Location = New System.Drawing.Point(264, 192)
Me.Command2.Name = "Command2"
Me.Command2.Size = New System.Drawing.Size(157, 61)
Me.Command2.TabIndex = 1
Me.Command2.Text = "いいえ"
Me.Command2.UseVisualStyleBackColor = True
'
'Image1
'
Me.Image1.Location = New System.Drawing.Point(204, 36)
Me.Image1.Name = "Image1"
Me.Image1.Size = New System.Drawing.Size(48, 48)
Me.Image1.TabIndex = 2
Me.Image1.TabStop = False
'
'Label1
'
Me.Label1.AutoSize = True
Me.Label1.Font = New System.Drawing.Font("MS PGothic", 15.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(128, Byte))
Me.Label1.Location = New System.Drawing.Point(36, 108)
Me.Label1.Name = "Label1"
Me.Label1.Size = New System.Drawing.Size(140, 21)
Me.Label1.TabIndex = 3
Me.Label1.Text = "終了しますか?"
Me.Label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
'
'EndForm
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(468, 309)
Me.Controls.Add(Me.Label1)
Me.Controls.Add(Me.Image1)
Me.Controls.Add(Me.Command2)
Me.Controls.Add(Me.Command1)
Me.Name = "EndForm"
Me.Text = "End"
CType(Me.Image1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Subの後、End Classの前に以下を追加する。
Private WithEvents Command1 As System.Windows.Forms.Button
Private WithEvents Command2 As System.Windows.Forms.Button
Private WithEvents Image1 As System.Windows.Forms.PictureBox
Private WithEvents Label1 As System.Windows.Forms.Label
~省略~
同じ調子で各Form×17書き換えていったら、MainForm以外表示されるようになったけど、
MainFormにものすごくエラーが出るんですがどうしたらいいのか。
フォームロードのイベントハンドラを追加ってやつが全然出来ない。
おそらく、MainFormが立ち上がったら、最初に呼び出す警告AttentionFormとの対応がうまく出来ていないのだろう…。
VB.NETの本を購入するか…。
frmMain.frmの2行目でObjectを指定していた。
comdlg32.ocx というActiveXコントロール を使用しているらしい。
comdlg32.ocx はVisual Basic 6.0のランタイム (プログラムを動かすときに必要な物)らしい。
開く、保存、フォルダの選択等のダイアログに関するサポートをするそう。(参考)
c内を検索してみると、C:\Windows\SysWOW64の中に発見…。
これを呼び出す方法は以下。
[ツールボックス]で右クリック
→「アイテムの選択」
→[COM コンポーネント] を選択し、参照から使用したいocxを選べばいいらしい。
それか、
VB6のコード内で使用されているActiveXコントロールを、
対応する.NETのコントロールに置き換える必要があるらしい。
「保存」する際のダイアログが呼び出せればいいんか?
comdlg32.ocx で保存以外に何をしていたのかが分からないと、うかつに書き換えられない。
VB.NETではOpenFileDialog、SaveFileDialog、ColorDialog などを使うらしいが。
とりあえず、このエラーはMain画面が表示されない問題の端っこぽいので保留。