• ベストアンサー

VB .Netの構造体について

構造体について教えて下さい。 クラスで構造体を作成しました。 クラスでIniファイルを読み込み、Formのボタンを押した処理の中で構造体を読み込みたいのですが、何をしても空白(Nothing)になります。 クラスの中では格納されたままなのに・・・。 違う場所で構造体を呼んだときは別の処理がいるのでしょうか? それともVB .Netの仕様なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.4

>Dim ini As Test >MassageBox.Show (ini.bbb) ここでの変数iniは、この関数の中で作成された変数なので、iniファイルの設定を保持していません。 #2では、フォームの側に値を渡していますけど、その関数の外にでたら失われてしまいます。 保持しておきたいなら、そうした、最初に渡されたときにフォームのクラスの中の変数で保持するようにするか 単純には、こうした関数の外での寿命を持つ変数としてモジュールの中での変数を作っておくとかそういうことをしなければいけません。 やり方は色々あるので、 例えば、iniファイルを保持するクラスを作っているというのなら、 フォームとか使用するクラスで、ファイル名を指定して、初期化して値を保持するようにし、必要ならそこから値を読み出すようにするとよいと思います。 例えば、iniファイルを保持するクラスを IniFileクラスとすると 使用するフォームの側で Dim ini as IniFile = new IniFile("data.ini") とかしておいて (pointはプロパティでTest構造体) ini.point.aaa ini.point.bbb とかして使うようにすればいいと思います。

okkomu
質問者

お礼

たくさん教えていただきありがとうございました!

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

#2>えっと、まずですね。 frm.Proc1 = (pt) の部分がビルド通りません、エラーになります。 最低でも frm.Proc1(pt) じゃないといけないです。 あと、 Dim frm As Form1 は、 Dim frm As Form1 = new Form1 でないと、例外が発生するはずです。 そこら辺をちゃんとしたら、構造体をProc1に渡すことができるのはちゃんとできました。(Proc1でaとbに値を設定することは確認できました) そもそもMyPointが呼ばれるようなプログラムになっていないのではないでしょうか

okkomu
質問者

補足

返答が遅くなってしまい本当にすみません。 上記のことを変更するできたのですが、下記の方法だとできなくなりました。 起動時にIniファイルの設定を構造体に格納して、 データを受信した時に構造体を参照しにいくとNothingになっています。 構造体の宣言は前回書いたとおりです。 データを受信した時は Private Sub Received(ByVal sender As Object, ByVal evt As UdpEventArgs) Handles _UDP.DataReceived   Dim ini As Test   MassageBox.Show (ini.bbb) End Sub よろしくお願いします。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

>Class.vb内ではデータを保持したまま使えるのですが、 クラスの中でdim … Asとかで実際に確保したという意味ですよね。補足では、構造体の定義だけしか書いていないと思うので、もう少し詳しく補足していただけませんか? >Form1.vbでaaaを使用しようとしてもNothingになっています。 >引き継がれてこないのでしょうか? フォームの側でどのようにクラスや構造体を利用しているのかもう少し詳しく補足していただけませんか? 引き継がれるというのは、クラスの継承をしたということですか? できたら、ソース(クラスの定義の部分と、それを、フォームの側で利用している部分のソース)を補足でアップしていただけませんか

okkomu
質問者

補足

Class.vbで Public Structure Test   Public aaa As Integer   Public bbb As Integer End Structure Public Sub MyPoint()   Dim pt As Test   Dim frm As Form1   pt.aaa = 10   pt.bbb = 20   frm.Proc1 = (pt) End Sub Form1.vbで Public Sub Proc1(pt As Test)   Dim a As Integer   Dim b As Integer   a = pt.aaa   b = pt.bbb End Sub としているのですが、a又はbに値がはいりません。 Nothingになります。 間違っているのでしょうか?

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

もうひとつ意味がわからないのですが どんなふうにやっているのですか?

okkomu
質問者

補足

補足します。申し訳ないです。 Class.vbに Public Structure test   Public aaa As Integer   Public bbb As Integer End Structure を宣言しました。 それをClass.vb内ではデータを保持したまま使えるのですが、Form1.vbでaaaを使用しようとしてもNothingになっています。 引き継がれてこないのでしょうか? 又は何か宣言が必要なのでしょうか?

関連するQ&A

  • VB6でやると構造体の配列になる変数をVB2008では何で作ればいいか

    VB6でプログラムを作っていたときは 値のセットが配列になるとき 構造体を動的配列で宣言してデータを足して作りました。 VB2008で開発をすることになり 同じようなことをしたいのですが もっと便利なやり方が登場したりするのでしょうか? クラスで挑戦したのですが動的配列はできないようでした。

  • CSVファイルを読み込んで計算するには、構造体か?

    はじめまして。C++プログラミングの質問です。 初心者レベルの質問で申し訳ないのですが、お付き合いください。 CSVファイルを読み込んで、書かれている値を使ってある計算を行う、 ということをしたいのですが、処理方法をどうするか悩んでいます。 CSVファイルに書かれる最大行86400行、最大列6000列です。 また、開発環境はLinuxとなります。 私は「CSVファイルの項目を構造体に格納するクラス」と、「構造体の値を使って計算 するクラス」を考えました。 しかし、構造体ですと最大86400行のものを格納するのは、メモリを食うだけで無駄だという 指摘を受けました。 直接ファイルから値をとってきて、計算クラスに処理させるほうが無難と言われましたが、 「CSVファイルの項目を構造体に格納するクラス=データベース」と考えており、 後々拡張する場合に融通が利くのではないでしょうか。 経験が浅いので、断固たる主張ができないのですが・・・ 構造体に入れることばかり考えていたので、開発のボリュームを抑え、かつ、メモリを食わない 方法を全く思いつきません。 有識者の方へアドバイスを受けたいのですが、 ・大量のデータを読み込む場合、構造体等に格納する方が後ほど助かるか、 それとも、直接ファイル読み込みした方がよいか ・構造体格納のほかに相応しいやり方はないか この2点をメインにお答えいただけないでしょうか。 何か良いやりかたがありましたら教えていただきたいです。 よろしくお願い致します。

  • クラスと構造体

    VB6.0です。 ある画面の入力値を保持するオブジェクトを作成しようとしています。 このオブジェクトは、複数の画面やクラスの間で受け渡しすることを想定しています。 このオブジェクトは、クラスと構造体のどちらにした方がいいんでしょうか?

  • 構造体→文字列→構造体 をする方法

    VB6.0の話です。  不特定の構造体を文字列(String)に格納し、これを最初の構造体に戻す事はできませんか?  具体的には「共有メモリを使い構造体を文字列にして格納>別ウインドウで文字列を取得して構造体に戻す」と言う事をやりたいんです。  共有メモリに不特定の構造体をいれる方法でもいいんですが…VALIANTだとサイズが大きすぎて実用性がありませんし、違う主旨の質問をするのも良くないので回答はあくまで「構造体→文字列→構造体 をする方法」と言う事でお願いします。

  • DLLで格納された値をVBに渡す方法

    <VC++で作成したDLLをVBで呼ぶ処理> VBから変数をDLLに渡して値を格納してVBで受け取りたいのですが、 文字列が格納されている先頭アドレスをVBに渡したい場合の 方法を具体的に教えてください。 構造体を使用する方法はできたのですが、使わない方法(引数が変数)を 教えてください。 よろしくお願いします。

  • 不要になった、普通の構造体の処理

    VB初心者です。スミマセン教えて頂けないでしょうか? VB 2005 の場合、構造体が不要になったときは何か処理が必要ですか? メモリから削除する処理とかしなくて良いのでしょうか? よろしくお願いします。

  • ファイル読み込みと構造体について

    Q1 VB始めたばかりの超初心者です。クイズゲームを作成したく、構造体を用意したいのですが、同じ構造体を100個用意したい場合どのように宣言するのでしょうか? Public Type mondai_REC Question As String * 100 choice(5) As String * 30 justness(3) As Byte End Type ↑の構造体を100個用意したいのです。 また100個用意して、その中のchoice()を参照したい場合どのように使うのでしょうか? Q2 テキストファイルを読み込み、この構造体に格納したいと考えてます。ファイルをオープン・クローズドする、任意の文字(たとえば”。”)がみつかめまで読み込むなど、固定長でない文字列の入ったファイルを読み込むのに便利な関数を教えてください。 よろしくお願いいたします。

  • VBからVCへ渡す構造体の設定について

    VB2005からVCで作られたDLLをコールするときにエラーが出て困ってます。 関数のパラメータに構造体を指定して、構造体のメンバの文字列を渡したいけれど、なんかうまく行かないんですよね。 VB2005だと固定長文字列ってのがサポートされていないとか何とか言うのは分かったけれど、 解決方法が不明となっています。 アドバイスをお願いします。 コードはこんな感じ。 *VC2005******************************************************* typedef struct{  int iTemp;  char cTemp[256]; }tag_strTemp; void __declspec(dllexport) WINAPI TestFunction(tag_strTemp* pstrTemp) {  MessageBox(NULL, pstrTemp->cTemp, "", 0); } *VC2005******************************************************* *VB2005******************************************************* Moduel Module1  Public Structure tag_strTemp   Public iTemp as Integer   Public cTemp as String ←ここの定義に問題があるんだと思ってます。  End Structure End Module Public Class Form1  Private Sub Form1_Load(・・・)   Dim strTemp as tag_strTemp   strTemp.cTemp = "ABCDE"   TestFunction(strTemp)  End Sub End Class *VB2005*******************************************************

  • VB2008: 構造体に関連して・・・。

    VB.Net を知って60日という初学者です。 プログラマではなくデザイナ。 ですから、未だに Sub Main() で基本事項の確認中です。 フォームなどの演習は、まーだ、当分はしない予定です。 さて、質問は構造体に関するMSDN の記述です。 >構造体の要素が文字列型 (String) やオブジェクト型 (Object) などの参照型である場合は、 >データへのポインタがコピーされます。 この下り。 「なんでポインタがコピーされるんや」という疑問を抱きました。 ・文字列型にプロパティやメソッドという機能を付加するためにクラス型にした。 ・クラス型は、「・・・・」ということで参照型。と ・「・・・・」と同じ理由。 というように背景を推測しました。 この推測も単なるど素人の推測。 当を得たいるか?実に怪しい物。 仮に当らずとも遠からずとしても、肝心の「・・・・」がわかりません。 この辺りに関して、「このように考えてたらよい」という回答がありましたらお願いします。

  • バイト配列の構造体変換について

    TCPの通信アプリケーションをて作成しています。 Recvbuff(1024) as byte と定義した変数に受信したデータを格納し以下のような構造体に格納 したいのです。 構造体A id as integer Usercode as string Username as string Filename as string このとき、共用体のような使いかたはVBではできないようなので すが、このような場合 整数なら「Recvbuff(1) * 256 + Recvbuff(0)」のように計算する。  文字列なら必要な文字のみ切り取ってGetStringで変換する。 といった方法しかないのでしょうか。 環境は VS2008 VB.NET です。