VB.NETでのプログラム質問、フォーム上での構造体の引渡し

このQ&Aのポイント
  • VB.NETでのプログラム質問について解説します。フォーム上での構造体の引渡しについても解説します。
  • VB.NETでのプログラム質問の解説です。フォーム上での構造体の引渡し方について詳しく説明します。
  • VB.NETでのプログラム質問についての解説です。フォーム上での構造体の引渡し方法について詳細に説明します。
回答を見る
  • ベストアンサー

VB.NETでのプログラム質問、フォーム上での構造体の引渡し

こんにちわ。 ただいまVB.NETをやっているのですが、どうしても分からない点があり、プログラムが進みません。 ヒントではなく、答えとして書き込んでいただければ幸いです。 同じプログラム上にForm1とForm2が用意されていて、Form2で構造体を使います。 仮に Private Structure Mypoint Public Name As String Public ID As Integer Public Sex As Double End Structure Private sub~~~ Dim pt As m_Mypoint pt.ID = IDTextBox.Text pt.Name = NameTextBox.Text pt.m_Sex = True End Sub Dim Form1 As New Form(Mypoint) Form1.ShowDialog() として、form2で設定し、form1の方で Private struct Mypoint Public Sub New(ByVal m_Mypoint As String) MyBase.New() InitializeComponent() Mypoint = m_Mypoint として呼び出しているのですが、一向に呼び出せません。 変数とは書き方が違うかも、と思って色々試したり調べたのですが、丸一日分からなくてとまってしまいました。 よろしくお願いします。

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

> あとすみません、質問攻めで申し訳ないのですが。 質問は、良いんですが・・・ > 仮にテキストBoxに書き込む際に、配列を使わずに文字制限を設けることは可能でしょうか? これって、この質問スレッドの主題である 「フォーム上での構造体の引渡し」 とは関係ないですよね? 別の主題なら、新しく質問していただいたほうが・・・ > 配列を使わずに って事ですが、「配列を使った」方法って言うのが良く分かりません・・・ 単純に、TextBoxコントロールのMaxLengthプロパティを指定するのじゃ駄目なんでしょうか?

kaisuke1
質問者

お礼

昨日まで出張でとばされてました(;´Д` 返信遅くなってすみません。 プロパティ指定以外でやる方法ないかなぁ、と思って考えていたのですが、プロパティで簡単に出来てしまうので他は考えないことにします(;´∀` 回答ありがとうございました。

その他の回答 (2)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

書き忘れてました。 Form2側で > Private Structure Mypoint と宣言していますが・・・ Form2側ではなく、Form1側でPublic宣言しておかないと・・・ #他にも、細かな指摘がいくつもありますが・・・省略。 [例] <Form1 側> Public Structure Mypoint Public Name As String Public ID As Integer Public Sex As Double End Structure Private mp As Mypoint Public Sub New(ByVal m_Mypoint As Mypoint) MyBase.New() InitializeComponent() mp = m_Mypoint End Sub <Form2 側> Private pt As Form1.Mypoint Private sub~~~ pt = New Form1.Mypoint pt.ID = IDTextBox.Text pt.Name = NameTextBox.Text pt.m_Sex = True End Sub Private sub~~~  Dim Form1 As New Form1(pt) End Sub こんな感じ?

kaisuke1
質問者

お礼

続きです。 連続投稿ありがとうございます! 細かい指摘、その部分の一つを見つけてしまいました。。(泣 処理するたびにNewファイルで開き合っていたら、当然エラーが出ますよね; 変なエラーはずっと出ていたのですが、さっきやっと解決しました。 あとすみません、質問攻めで申し訳ないのですが。 仮にテキストBoxに書き込む際に、配列を使わずに文字制限を設けることは可能でしょうか? 例えば5文字までしか打てないと設定します。 6文字以上打とうとすると、それ以上入力・反映がされないという形で作りたいのですが、よろしければご教授願えないでしょうか。 よろしくお願いします。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

何をやりたいのか、いまひとつわからないんですけど・・・ > 変数とは書き方が違うかも ひょっとして、構造体自体を誤解しているとか・・・ 構造体は、ユーザ(つまり貴方)が独自に作成(定義する)データ型です。 つまり、「Ineteger型」とか「String型」とかと、同じレベルで「Mypoint」と言う構造体(データ型)を使えるようにしているんです。 で、「Ineteger型」とか「String型」を実際に使う場合、貴方はどうしますか? > Dim i As Integer の様に、 > Dim 変数名 As データ型 として、変数を宣下しますよね? また、 > Public Sub New(m_Mypoint As String) の様に、 > ~ (変数名 As データ型) としますよね? 構造体も同じです。 構造体名が「Mypoint」なら、 > Dim 変数名 As Mypoint で、「構造体を格納する変数」を宣言し、 > Public Sub New(ByVal pt As Mypoint) で、構造体のデータ型を引数のデータ型として指定します。

kaisuke1
質問者

お礼

回答ありがとうございます。 私は仕事の合間を見て独学でやっているので、本当に助かります; まず構造体自体を勘違いとのことですが・・・全くその通りでした! 説明ものすごく分かりやすかったです。 モジュールで構造体を宣言し、Publicで宣言させて全フォームで反映させるようにする手もあったのですが、ふと今回のようにやるにはどうしたらよいのかなと思いまして・・ 今回やろうとしていたことは、質問の部分のみですが記述します。 form1にリストboxを作り、その中にフォーム2で入力したデータ(名前、ID、性別)を反映。 その際、表示させるのは名前のみという条件で作っていたので、構造体が最も適切かなと思い挑戦していました。

関連するQ&A

  • VB2005の構造体で配列を含む構造体へアクセスするプロパティの記述方法

    VB2005の構造体で、以下のように Dantaiという配列を含む構造体があり、 プロパティを記述する方法で困っています。 Structure Person Dim namae As String Dim toshi As Integer end Structure Structure Dantai Dim m_DantaiMei As String Dim m_Hito() As Person Public Sub New(mei As String) m_DantaiMe = mei Redim m_Hito(100) End Sub '団体名 Public Property Dantai_Mei() As String Get Return m_DantaiMei End Get Set(ByVal value As String) m_DantaiMei = value End Set End Property '人 Public Property ???  '???????????? どのようにプロパティを設定したらよいのでしょうか? '???? '???? 配列で、しかも構造体です。 '???? '???? End Property End Structure Dim dantai As New Dantai("A") MessageBox(dantai.Dantai_Mei) MessageBox(人100人を表示させたい) '?????????????????????????? あと、構造体のDimはデフォルトで、PublicでしょうかPrivateでしょうか? VB2005の構造体について、VB6との違い、クラスとの違いなど詳しく書かれている サイトなどご存じの方教えて下さい。

  • VB2008で構造体を引数とした時にエラー

    VB2008の勉強を始めて数週間の初心者です。 勉強用にいろいろとプログラムを作っているのですが、 構造体(Structure)を引数で渡して戻り値を取得する Functionを作成してみました。 同一クラス内のPrivate Function の場合は問題ないのですいが、 追加した別クラスに Function を作成したところ 「 型 'TEST_A.Form1.str_IN' の値を 'TEST_A.Class1.str_IN' に変換できません。」 のエラーが表示されてしまいます。 別クラスのFunctionを使用する時、引数には構造体は指定できないのでしょうか? なにか文法上の誤りがあるのでしょうか? 初心者なので変な質問してたらスイマセン。 詳しい方がいらっしゃいましたらよろしくお願いします。 ------------------------------------------------------ Public Class Form1  Public Structure str_IN   Public in_aaa As String  End Structure  Private Sub Button1_Click(ByVal sender As System.Object,  ByVal e As System.EventArgs) ~   Dim stin As New str_IN   '------------------------------------   stin.in_aaa = "aaa"   Label1.Text = Test_Sub(stin) '<------- これはok   '-------------------------------------   Dim cls = New Class1   stin.in_aaa = "aaa"   Label1.Text = cls.CFnk(stin) '<----- エラーになる  End Sub  Private Function Test_Sub(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class ------------------------------------------------------------ Public Class Class1 '新たに作成したクラス  Public Structure str_IN   Public in_aaa As String  End Structure  Public Function CFnk(ByVal prm_in As str_IN) As String   Dim stin As New str_IN   Dim sout As String   sout = "test_aaa"   Return sout  End Function End Class

  • VB.NETについての質問なんですが

    SubMainで「Form1」をshowで開き、その「Form1」の中で「Form2」をshowで開いた後、「Form1」だけをCloseで閉じたいのですが、「Form1」をで閉じてしまうとプログラムが終了してしまいます。 Public Class Form1 : :   Private Sub Button1_Click……   Dim frmForm2 as New Form2   frmForm2.Show   Me.Close Sub End End Class 良い方法があればアドバイスをお願いします

  • 構造体 多段階配列について

    Private Structure test Dim a As Integer Dim b As String Dim c as String End Structure Dim a() As test = New test(2) {} Dim b() As test = New test(2) {} Dim c()() As test c = New test()() {a, b} Dim temp() as integer cは多段階配列で、 例えば、c(0)のメンバaのデータをすべて取り出したい 時はどうすればよろしいのでしょうか? //気持ち的にはこのようにしたいのですが、 できません。 temp = c(0).a どなたか、わかるかた、教えてください。 よろしくお願いします。

  • VB.net2008 設定画面の作成

    VB.net2008 設定画面の作成 こんにちは、プログラミングの勉強を行っているのですが。 少し、躓いてしまったのでこちらで質問させてください。 Form1 と Form2 という二つのフォームを用意して。Form1で使用している設定値クラスをForm2にコピーして設定変更を行った後リターンで返すということを考えています。 ですが、どうしてもうまく書けないため、ご助言ください。 -----------------------以下ソース----------------- Public Class Form1 'XMLに設定保存 Private Sub SaveSetthing()  Dim wset as New Setting 'XMLserializerで書き込み ~~~~~~~~~~~~~~~~~~~ End sub   '設定読み込み Private Sub LordSetthing() 'XMLserializerで読み込み  Dim lset as New Setthing ~~~~~~~~~~~~~~~~~~~ End sub EndClass Public Class Setthing Public UserName as String Public Age as Integer ~~~~~~~~~~~~~~~ Public Function Clone() as Setthing Return DirectCast(MyBase.MemberwiseClone,Setthing) End Function End Class ---------------------------------------------- このときに、Form1のボタンを押したらForm2を開く動作で ------------------------------------------------- Private sub ボタンクリック(Bybal*************)  Dim f as Form2 = New Form2(Setthing.Clone) if f.ShowDialog = Windows.Forms.DialogResult.OK then me.Setthing = f.GetValue End if End sub ------------------------------------------------- ↑ここで返り値を受けたいと考えています。 ↓Form2構文 -------------------------------------------------- Public Class form2 Public sub New(ByVal Value as Setthing) InitializeComponent() Dim TempSetthing as Setthing = Value End sub  'ここで、渡された設定値の表示と設定画面で変更された設定の読み込み   Public Function GetValue() As Setthing Return TempSetthing End function End Class -------------------------------------------------- と、大雑把に書き込みましたがこのような感じの処理を行いたいです。 ですが、私の理解が足りない為Form2内でTempSetthing内のデータの読み書きが行えません(宣言できません) 独学で作ったものですので、ここまでの流れがおかしなものになっている可能性もありますが。 「このような処理が行いたい!」というのは伝えれるかとは思います。 Form2内でTempSetthingの値を変更できるようなTextBox等を作成して。代入する形にしたいのですが。 ご教授お願いします・・・

  • VB.NETのStructureの使い方を教えてください。

    Publicの宣言をしてStructureを使いたいのですが、 2重になっているStructureを使う正しい方法を教えて頂きたいです。 現在 Structure OYA Dim zzz As String Structure KO_1 Dim No1 As String Dim No2 As String Dim No3 As String End Structure End Structure Public TESTOYA As OYA Public TEST_1 As OYA.KO_1 Sub ABCDE() TEST_1.No1 = 1 TESTOYA.KO_1.No1 = 1 End Sub というようになっているのですが、 Sub ABCDE()内の TESTOYA.KO_1.No1 = 1 という使い方をしたいのですが、この状態だとエラーになってしまいます。 TEST_1.No1 = 1 とすれば大丈夫なのですが、これだと OYAを入力してメンバを出すことが出来ないので、2重にする意味がなくなってしまいます。 KO_1は実際はKO_50くらいまであって 実際は連番ではないので、OYA.と入力したら、KOのメンバが出て その後、No1などのメンバが出て欲しいです。 (入力しやすいように) この様な使い方があれば正しい記入方法をご教授願えないでしょうか。 それと、最初の変数zzzの宣言は要らないのですが、 これを省くとエラーになってしまいます。 この部分も正しい使い方ではないように思うのですが、 ご教授頂ければ幸いです。

  • Option Strictと構造体とArrayListの関係について(VB2005)

    下記はArrayListに構造体の値を格納し、表示させるプログラムです。 -------------------------------- Option Strict Off '構造体 Public Structure hoge   Dim a As String   Dim b As String   Dim c As String End Structure Private Sub test()   Dim aryhoge As New ArrayList   Dim foo As hoge   foo.a = "aa"   foo.b = "bb"   foo.c = "cc"   aryhoge.Add(foo)           MessageBox.Show(aryhoge(0).a)  'A) Option Strict Off だと"aa"と表示される End Sub -------------------------------- このプログラムはOption Strict Offだとメッセージボックスに"aa"と表示されます。 ですがOption Strict Onだと、(A)の箇所にて「遅延バインディングを使用できません」というエラーが発生し、実行ができません。 質問内容は、Option Strict Onで上記のプログラムを動かすには、(A)をどのように修正すればよいか、というものです。 どうぞよろしくお願い致します。

  • VBプログラムエラー

    Private number As Integer Private rows As Integer Private columns As Integer Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim form2 As New Form() ' Create a button to add to the new form. Dim button1 As New Button() ' Set text for the button. button1.Text = "Scrolled Button" ' Set the size of the button. button1.Size = New Size(1000, 800) ' Set the location of the button to be outside the form's client area. button1.Location = New Point(form2.Size.Width + 200, form2.Size.Height + 200) ' Add the button control to the new form. form2.Controls.Add(button1) ' Set the AutoScroll property to true to provide scrollbars. form2.AutoScroll = True ' Display the new form as a dialog box. form2.ShowDialog() If Not Integer.TryParse(TextBox1.Text, rows) OrElse _ Not Integer.TryParse(TextBox2.Text, columns) OrElse _ Not Integer.TryParse(TextBox3.Text, number) Then MessageBox.Show("数字で入力してください", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If Me.Bounds = New Rectangle(10, 10, 1300, 900) Dim cnt As Integer = 0 For k As Integer = 1 To number For i As Integer = 1 To rows For j As Integer = 1 To columns Dim tb As TextBox = New TextBox() cnt += 1 tb.Name = "tb" + cnt.ToString() Me.Controls.Add(tb) tb.Top = (i - 1) * 30 + 80 tb.Left = (j - 1) * 60 + 70 * (columns * (k - 1)) + 10 tb.Width = 50 Next Next Next End Sub スクロール画面を作成し、 そのスクロール画面上にボタンを1つ作り、 テキストボックスが出てくるようにしたいです。 どうすればできるのでしょうか 。 これはわかるところまで作成しています。

  • VB.net(.net framework 3.5 sp1)でフォーム

    VB.net(.net framework 3.5 sp1)でフォーム上に設置したコントロールのプロパティを一括で設定する方法はないでしょうか? 下記は実行しても反映されないのですが、処理のイメージとしてはこんな形です。 Public Class Form1 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim test As New Button test.Text = "TEST" test.Top = 0 Me.Button1 = test End Sub End Class

  • 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*******************************************************