あと3日でVB.Net学習2ヶ月目という初学者です。
Sub Main() のみで基本事項の確認のみをしてきました。
ですから、フォーム、レポート、データベース、WEB関連の知識は完全にゼロ。
さて、その基本演習も最終段階に突入。
いよいよクラスです。

' ==============================
' クラスプログラミング; 演習3
' ==============================
Module theClass

  Sub Main()
    Dim T1 As New TEST1

    T1.Member1 = "T1.Member1"
    T1.Member2 = "T1.Member2"
    T1.BSave("D:\Temp\T1.bin", DirectCast(T1, Object)) <--- ?1
    T1.Member1 = "AAA"
    T1.Member2 = "BBB"
    Debug.Print(T1.Member1)
    Debug.Print(T1.Member2)
    T1.BLoad("D:\Temp\T1.bin", T1) <--- ?2
    If T1 IsNot Nothing Then
      Debug.Print(T1.Member1)
      Debug.Print(T1.Member2)
    Else
      Message("T1.bin は読み込めませんでした。")
    End If
  End Sub
End Module

?1=インスタンスを経由する共有メンバ、・・・へのアクセスです。正規の式は評価されません。
?2=Option strict on では、'ByRef' パラメータのオブジェクトの値を・・・縮小変換できませんでした。

Public Shared Sub BSave(ByVal aPath As String, ByVal aObject As Object)
  Try
    Using fs As New FileStream(aPath, FileMode.Create, FileAccess.Write)
      Dim bf As New BinaryFormatter

      bf.Serialize(fs, aObject)
      fs.Close()
    End Using
  Catch ex As IOException
    MsgBox(ex.Message & "(BSave)", MsgBoxStyle.Exclamation, "エラー:")
  End Try
End Sub

Public Sub BLoad(ByVal aPath As String, ByRef aObject As Object)
  If File.Exists(aPath) Then
    Try
      Using fs As New FileStream(aPath, FileMode.Open, FileAccess.Read)
        Dim bf As New BinaryFormatter

        aObject = bf.Deserialize(fs)
        fs.Close()
      End Using
    Catch ex As IOException
      MsgBox(ex.Message & "(BLoad)", MsgBoxStyle.Exclamation, "エラー:")
    End Try
  End If
End Sub

非共有の BSaveメソッドとBLoadメソッドのパラメータはファイルパスだけ。
共有メソッドの場合は、「何を」というのが必要かと思って2つ目のパラメータを追加。
もって、構造体の BSave と BLoad とに援用するテストをしたいと思っています。
し、しかし、上述の2つのエラーを前にどうしてよいか皆目わかりません。

>そのエラーを回避、もしくは発生させないためには次のように改造したらよい!

そういう回答等をお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

?1:


Sharedなメソッドを呼び出すのですから,
インスタンス.メソッド
の形ではなく
型.メソッド
の形になります。
つまり,今回の場合は,
TEST1.BSave("D:\Temp\T1.bin", T1)
のように書く必要があります。
各クラスはSystem.Objectを暗黙の内に継承しているため,Objectへのキャストを書く必要はありません。

?2:
第2引数には,デシリアライズされたオブジェクトを代入するための,Object型の変数を指定します。
つまり,
Dim obj As Object = Nothing
T1.BLoad("D:\Temp\T1.bin", obj)
Dim T2 As TEST1 = TryCast(obj, TEST1)
If T2 IsNot Nothing Then
のような形になります。


ところで,Sharedの修飾がどう考えても逆に思えますが。
<Serializable> _
Public Class Test
 Public Sub Save (ByVal fileName As String)
  '自分自身をfileNameに保存する
 End Sub

 Public Shared Function Load (ByVal fileName As String) As Test
  'fileNameから読み込む
 End Function
End Class
のような形になるのが自然だと思います。
これだと,
Dim t As Test
として,
' 保存
t.Save("D:\Temp\t1.bin")

'読み込み
t = Test.Load("D:\Temp\t1.bin")
のように書くことになります。
    • good
    • 0
この回答へのお礼

>共有メソッドはクラス名でアクセスする!

読み飛ばしていました。

>ところで,Sharedの修飾がどう考えても逆に思えますが。

BLOAD を共有にするのを忘れていました。
無用の混乱を与えてすみません!
ですから、以下の修正で成功しました。
本当にありがとうございました。

' ==============================
' クラスプログラミング; 演習3
' ==============================
Module theClass
  Sub Main()
    Dim T1 As New TEST1
    Dim obj As Object = Nothing

    T1.Member1 = "T1.Member1"
    T1.Member2 = "T1.Member2"
    TEST1.BSave("D:\Temp\T1.bin", T1)
    T1.Member1 = "AAA"
    T1.Member2 = "BBB"
    Debug.Print(T1.Member1)
    Debug.Print(T1.Member2)
    TEST1.BLoad("D:\Temp\T1.bin", obj)
    If T1 IsNot Nothing Then
      Debug.Print(TryCast(obj, TEST1).Member1)
      Debug.Print(TryCast(obj, TEST1).Member2)
    Else
      Message("T1.bin は読み込めませんでした。")
    End If
  End Sub
End Module

Public Sub BSave (ByVal fileName As String)
  '自分自身をfileNameに保存する
End Sub

これは非共有のメソッドとして書きました。
ただ、非共有と共有の共存については未だテストしていません。
本日が、クラス演習の初日なのでよく個も全体もわかっていません。
本当にありがとうございました。

お礼日時:2009/03/24 17:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QクラスJ当日券の購入時間

 ツアーでJALの航空券は確保できましたが、当日にクラスJを購入したいと考えてます。
 そこで、クラスJの当日券は、搭乗時間のどの位前から買えるのか教えて下さい。
 午後3時00分位の便でも、朝一の時間から可能でしょうか?

Aベストアンサー

朝一からの指定変更は可能です。
基本的に空港のカウンター自体は朝5時30分から係員が居ます(旅行会社から事前に二次元バーコードを貰っていれば、カウンターで変更の申し込みが出来ます)。
旅行会社から航空券引換証を当日受け取る場合は朝7時以降が基本となります(6時30分発の路線を予約していれば6時からになります)。
この場合でアップグレードが満席の場合、スタンバイカードをカウンターで受け取り、一先ずエコノミーの搭乗手続きをして保安検査場を通過しておくか空港の有料ラウンジで休憩します。

QSubとEnd Subについて

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate URL
objIE.Visible = True

Do Until objIE.Busy = False
WScript.sleep(250)
Loop

If objIE.document.URL = URL Then
BodyText = objIE.document.body.innerTEXT
AriNashi = InStr(1, BodyText, "Yahoo")
If AriNashi > 0 Then
Set objINPUT = objIE.document.getElementsByTagName("input")
objINPUT(0).value = LoginID
objINPUT(1).value = Password
objINPUT(2).Click
Else
msgbox "NO"
End If
Else
WScript.Echo " ダ メ" & Err.Description
End If
Set objIE = Nothing

VBScriptのSubとEnd Subについて教えて下さい。

Dim LogonID
Dim Password
Dim URL
Dim objIE
Dim objINPUT
Dim BodyText
Dim AriNashi

LogonID = "XXXXXXXX"
Password = "XXXXXXXXX"
URL = "https://login.yahoo.co.jp/config/login?.src=www&.done=http://www.ya..."

下記のようなプログラムはうまくいくのですがSubで囲むと何故か動作しなくなってしまいます。
使い方が間違っているのでしょうか?


Set objIE = WScript.CreateObject("InternetExplorer.Application")
objIE.Navigate ...続きを読む

Aベストアンサー

Subで囲むとプロシージャとなります。
プロシージャは他から呼び出されない限り、勝手に動作はしません。

Sub Hoge
'実体
End Sub

と書いたなら、プロシージャの外で
Call Hoge()
のようにプロシージャを呼び出してあげてください。

QJALの普通席からクラスJへの当日のアップグレードについて

先日JALの国内線を利用して旅行に行きましたが、不思議に思ったことがあります。

JALの国内線クラスJについてです。

クラスJは当日に空席があれば普通席からアップグレードが可能かと思います。

自分が搭乗した機種はB767-300で、クラスJは42席あるみたいです。

当日空港に行って案内表示を見たところ、クラスJは空席なしになっていました。

ダメでもともとという考えで空席待ちをかけてもらいました。

キャンセル待ち順番は4番目でした。

私はJALカードの一般会員ですが、なんと、満席となっているはずのクラスJの席が取れました。

クラスJが取れていて直前にキャンセルする人はあまりいないだろうと思います。
自分が座席が確保できたのはなぜなのかとても不思議でした。

4席分ぐらいは、実際は空いていても「空席なし」とわざと表示しているのでしょうか。
クラスJの座席の4/42を空けておくのも変な話だと思いますが・・・。

それとも今までの搭乗実績(一般会員ですがかなりの利用実績があります)などのおかげで取れたのでしょうか。

詳しい方がいらっしゃいましたらよろしくお願いします。

先日JALの国内線を利用して旅行に行きましたが、不思議に思ったことがあります。

JALの国内線クラスJについてです。

クラスJは当日に空席があれば普通席からアップグレードが可能かと思います。

自分が搭乗した機種はB767-300で、クラスJは42席あるみたいです。

当日空港に行って案内表示を見たところ、クラスJは空席なしになっていました。

ダメでもともとという考えで空席待ちをかけてもらいました。

キャンセル待ち順番は4番目でした。

私はJALカードの一般会員...続きを読む

Aベストアンサー

 どちらの路線をご利用でしたかね。
 航空機は、いつも早くから座席数全て発売するとは限りません。特にローカル空港など、気象条件の厳しい時は重量が重いと離着陸できない場合もあります。その空港周辺の天候が悪くて上空まで行ってみて上空で旋回していたけど、視界が基準まで回復せずあきらめて引き返す場合もあります。こんな時には所定の3倍以上の燃料を積まなくてはならず、燃料が重いため、離陸距離が伸び貨物重量や旅客重量を制限しなくてはならない場合もあります。
 そのような悪天候など、何ヶ月も前の航空券売り出し時点ではわかりませんから、普通席もJシートも座席数の8割だけを売っておいて、それで満席としておきます。そして当日になって、周辺の天候がよく万が一の代替着陸空港もお隣の県の空港とか近くを指定できれば、余裕燃料も少なくてすみ、予定していたよりも多くの航空貨物や旅客を乗せることが可能となります。そうなると、それまで満席表示であったにもかかわらず、さらにキャンセル待ち旅客を多く受け付ける場合がよくあります。また、航空貨物の搭載が予定より少なかったり、搭乗手続きを始めたら荷物室預かりのお客さんの手荷物の重量が想定より軽かったら、さらにキャンセル待ち旅客を乗せることができるようになりますから、追加で乗れる場合もあります。
 それに、特にJシートなどは、超多忙のビジネスマンの利用も多く、直前キャンセルや、連絡なしで乗らない人も多いようです。そうなると出発10分前の搭乗手続き締切り時刻以降キャンセル待ち旅客やアップグレード希望者に割り当てる場合がよくあります。また、その航空会社の超優良マイレージカード会員やVIP旅客のためにJシートは数席空けておいて、該当者の搭乗がなければ一般キャンセル待ち旅客やアップグレード希望者に直前で割り当てることもあるようです。

 どちらの路線をご利用でしたかね。
 航空機は、いつも早くから座席数全て発売するとは限りません。特にローカル空港など、気象条件の厳しい時は重量が重いと離着陸できない場合もあります。その空港周辺の天候が悪くて上空まで行ってみて上空で旋回していたけど、視界が基準まで回復せずあきらめて引き返す場合もあります。こんな時には所定の3倍以上の燃料を積まなくてはならず、燃料が重いため、離陸距離が伸び貨物重量や旅客重量を制限しなくてはならない場合もあります。
 そのような悪天候など、何ヶ...続きを読む

QMicroSoft BasicのDim文とVisualBasicのDim文の違い

私が20年前にMicroSoft Basicを使っていたときは、DIM文はDIMENSIONの略で配列型変数の宣言に使っていました。

最近VisualBasicの勉強を始めたのですが、変数の宣言はすべてDim文になっており、昔のMS BasicのDim文と意味合いが変わっているのに驚いています。

ここで質問させてください。
・なぜ配列を意味するDimension文が変数の宣言なのか?
・どのバージョンのBasicからDim文の意味が変わったのか?

私が使用していたのはNEC N-Basic,N-88Basic,N-98Basicです。

Aベストアンサー

VISUAL BASIC のDimは ディメンジョンの略です。
私の経験ではVB2.0時代からありました。

配列0を考えた場合変数とおなじであるからだとおもいます

QJAL クラスJへの当日変更

こんにちは。

JALで普通席を予約したのですが、
当日予約した飛行機にクラスJの空席が
ある場合は、空港で変更してもらえる
のでしょうか?

Aベストアンサー

空きが有れば自動チェックイン機でも表示されますし、その前に「クラスJへ変更」というボタンがありますので、ダメ元で押して見て下さい。
但し搭乗券が有ればですけど。

QSub-EndでConsole.Writeでコマンドプロンプト出力したい

VB.NET2003:WindowApplication の Sub~End で 出力Console.Write("***") としてもコマンドプロンプトウィンドウにでないで、.NETウィンドウのデバッグ欄にしか出ない。前もって何かを指定しなければならないのでしょうが全くわかりません。ConsoleApplication ではうまくいっていますが。初心者なのでよろしくお願いします。

Aベストアンサー

Windows Applicationは,コンソールを持ちません。
# AllocConsole API等を使えば,専用コンソールを持てますが。

コンソールへ出力したいのであれば,Console Applicationにする必要があります。
なお,Console ApplicationであってもWindows Formsを開く事は可能です。

Qバーゲンフェアー予約でクラスJへの変更

他の方の質問で、JALのクラスJへの変更の
話がありましたが、超割(バーゲンフェアー)で
予約した便に、当日クラスJの空席があったら
変更してもらえるのでしょうか?

よろしくお願いします。

Aベストアンサー

こんばんは。
JALとしてはどんどんクラスJに乗って欲しいので、基本的にどんな運賃でも当日空港で空きがあれば1000円の差額を支払えばクラスJへのアップグレードは可能です。ツアーなどの運賃でもOKです。
係員のいるカウンターにならばなくても自動チェックイン機でアップグレードできますよ。最初の画面、または1度チェックインが終わったタイミングでもアップグレードの画面が出ます。
クラスJはお手軽な値段なので人気があります。良い席を希望するのであれば早めに空港へ行ってチェックインすることをおすすめします。
あまり早く空港へ着いてしまったら1つ前の便に乗れてしまうかもしれませんが…。

Qsubプロシージャーですか?subステートメン

----------------
Sub test()

End Sub
----------------
は、subプロシージャーですか?subステートメントですか?

上記のコードの「Sub」にカーソルをあて、F1を押すとヘルプが立ち上がり「Sub ステートメント」と表示されますが、

挿入(I)→プロシージャー(P)を見ると画像のように「Subプロシージャー」となっています。

どちらが正しいのでしょうか?
どちらも正しいのでしょうか?

Aベストアンサー

Sub~という構文が「Subステートメント」。プログラミング言語では、ステートメントは「文」とも訳されます。
そのSub~End Subで定義した一連のものが「Subプロシージャ」。プロシージャは「手続き」とか言う意味。

だから、Subのヘルプを見ると、Subステートメントの書式などになってるし、
挿入→プロシージャでは、「手続き」とての一かたまりを挿入するから、End Subまでになる。

QJALのJクラスについて

フライト当日に、Jクラスからダウングレード(Jクラスから普通席に)することは可能でしょうか?アップグレードは知っていますが、ダウングレードはできるのでしょうか?

Aベストアンサー

ダウングレードは普通席に空席があれば可能です。
ただしクラスJ料金1.000円は払戻しとなりますので
420円の手数料がかかり580円しか返金されません。
もしくは同路線で同じ方の利用予定があれば
クラスJの利用券?というかたちで次回利用可能です。
(有効期限は90日だったかと思います。はっきり覚えてません)

以前私が同様の事を行った際には上記のような対応となります。

QSub ***( ) と Private Sub ***( ) の違い

初歩的な質問で申し訳ありませんが・・・

自分でコードを書いていても、イベントが発生したりした時の処理で、コードのウィンドウで上のドロップダウンリストで選択できる時の処理などは自動的に[Private Sub Command1_Click( )]などと出てくるのでそのまま使っています。自分で別途プロシージャーを作成する時は[Sub ****( )]としています。
ですがその違いを理解しないまま、自分で作成する時は[Private Sub]ではなくて[Sub]を使っています。

Sub ***( ) と Private Sub ***( ) の違いは何なんでしょうか?
どなたか説明頂けませんか?
よろしくお願いします。

Aベストアンサー

「Sub」の部分にカーソルを置いて[F1]を押せばヘルプが起動します。
「指定項目」のところに「Public」と「Private」の説明がありますよ。
省略して「Sub hogehoge()」とした場合は「Public」とみなされます。

Publicは「すべてのモジュールから呼び出せるプロシージャ」ということになります。
Privateとすると「同じモジュールの中からしか呼び出せないプロシージャ」となります。

もしExcelをお持ちでしたらExcelのVBEで標準モジュールを追加し、「Sub Test1()」と「Private Sub Test2()」を作成してみてください。
そしてExcelの[ツール]-[マクロ]-[マクロ(Alt+F8)]でマクロ実行のダイアログを表示させてみるとわかります。
ここには実行できるプロシージャの一覧が表示されますが、Test1は表示されているけれどTest2は表示されません。
Test1はPublicで、Test2はPrivateだからです。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報