2009-08-09 4 views
0

私はこの作業を行うために必要なことを正確には分かりませんので、私の説明は最初は不足している可能性があります。本質的に私は負荷のたびに自分自身を再現するプログラムランチャーを書いています。タブやボタンに関するデータをSQLiteデータベースから取り出し、実行時に動的に構築します。タブ名をボタンを作成する関数に渡すと問題が発生します。データベースから適切なボタンセットを取得するために名前が必要ですが、作成時に右のタブにボタンを配置するためにその名前を使用しようとしましたが、正しくポイントしないため、デバッガはnull参照を呼び出します私がそれを指し示そうとしているタブページに(少なくともそれは私が推測しているものです)。この作業を正しく行う方法に関するアイデアはありますか?vb.netは以前に作成されたオブジェクトインスタンスとして文字列を使用します

Private Sub CreateTabs() 
    Dim SQLconnect As New SQLite.SQLiteConnection() 
    Dim SQLcommand As SQLiteCommand 
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;" 
    SQLconnect.Open() 
    SQLcommand = SQLconnect.CreateCommand 
    SQLcommand.CommandText = "SELECT title FROM tabs" 
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader() 
    Dim Tabs(25) As String 
    Dim c As Integer = 1 
    While SQLreader.Read() 
     Tabs(c) = SQLreader(0) 
     c = c + 1 
    End While 
    SQLcommand.Dispose() 
    SQLconnect.Close() 
    For i = 1 To UBound(Tabs) 
     If Tabs(i) <> "" Then 
      Launcher.TabPages.Add(Tabs(i)) 
      CreateButtons(Tabs(i)) 
     End If 
    Next 
End Sub 

Private Sub CreateButtons(ByVal tab) 
    Dim SQLconnect As New SQLite.SQLiteConnection() 
    Dim SQLcommand As SQLiteCommand 
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;" 
    SQLconnect.Open() 
    SQLcommand = SQLconnect.CreateCommand 
    SQLcommand.CommandText = "SELECT id,name,path FROM buttons WHERE tab = '" & tab & "'" 
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader() 
    While SQLreader.Read() 
     For i = 1 To 9 
      Dim NewButton(i) As Button 
      If Not SQLreader(2) Is System.DBNull.Value Then 
       Dim myIcon As System.Drawing.Icon = Icon.ExtractAssociatedIcon(SQLreader(2)) 
      End If 
      Dim toolTip1 As ToolTip = New System.Windows.Forms.ToolTip(Me.components) 
      Me.Controls(tab).tabpages.add(NewButton(i)) '<--this causes my problem 
      'NewButton(i).Width = 32 
      'NewButton(i).Height = 32 
      'NewButton(i).Text = i 
      'NewButton(i).Image = myIcon.ToBitmap 
      'If Not SQLreader(1) Is System.DBNull.Value Then 
      'toolTip1.SetToolTip(NewButton(i), SQLreader(1)) 
      'toolTip1.Active = True 
      'End If 
     Next 
    End While 
    SQLcommand.Dispose() 
    SQLconnect.Close() 
End Sub 

答えて

0

助けてくれてありがとうが、私は答えを見つけた。どうやら、私はちょうどようにタブのインデックスを参照する必要があった:

Private Sub CreateTabs() 
    Dim SQLconnect As New SQLite.SQLiteConnection() 
    Dim SQLcommand As SQLiteCommand 
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;" 
    SQLconnect.Open() 
    SQLcommand = SQLconnect.CreateCommand 
    SQLcommand.CommandText = "SELECT title FROM tabs" 
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader() 
    Dim Tabs(25) As String 
    Dim c As Integer = 1 
    While SQLreader.Read() 
     Tabs(c) = SQLreader(0) 
     c = c + 1 
    End While 
    SQLcommand.Dispose() 
    SQLconnect.Close() 
    For i = 1 To UBound(Tabs) 
     If Tabs(i) <> "" Then 
      Launcher.TabPages.Add(Tabs(i)) 
      CreateButtons(Tabs(i), i - 1) 
     End If 
    Next 
End Sub 

Private Sub CreateButtons(ByVal tab, ByVal TabIndex) 
    Dim SQLconnect As New SQLite.SQLiteConnection() 
    Dim SQLcommand As SQLiteCommand 
    SQLconnect.ConnectionString = "Data Source=" & sPath & "\dock.db;" 
    SQLconnect.Open() 
    SQLcommand = SQLconnect.CreateCommand 
    SQLcommand.CommandText = "SELECT id,name,path FROM buttons WHERE tab = '" & tab & "'" 
    Dim SQLreader As SQLiteDataReader = SQLcommand.ExecuteReader() 
    While SQLreader.Read() 
     For i = 1 To 9 
      Dim NewButton As New Button 
      Launcher.TabPages.Item(TabIndex).Controls.add(NewButton) 
      NewButton.Width = 32 
      NewButton.Height = 32 
      NewButton.Location = New Point(10 + (SQLreader(0) * 32) + 10, 10) 
      NewButton.Text = SQLreader(0) 
      If Not SQLreader(2) Is System.DBNull.Value Then 
       Dim toolTip1 As ToolTip = New System.Windows.Forms.ToolTip(Me.components) 
       Dim myIcon As System.Drawing.Icon = Icon.ExtractAssociatedIcon(SQLreader(2)) 
       NewButton.Image = myIcon.ToBitmap 
       toolTip1.SetToolTip(NewButton, SQLreader(1)) 
       toolTip1.Active = True 
      End If 
     Next 
    End While 
    SQLcommand.Dispose() 
    SQLconnect.Close() 
End Sub 
0

私はあなたがここに二つの問題を持っていると思う:

  • あなたはタブ名によってタブコントロールを見つけるためにしようとしています。代わりに、タブコントロール自体を見つけ出すか、それを渡して、内のタブの名前を見つけて、そのコントロールをとします。それ以外の場合は、特定のタブではなく、タブページのコレクションにボタンを追加しようとしています。

  • あなたは実際にはという新しいボタンを作成します。ループの繰り返しごとに配列のボタンを作成しますが、新しい実際のButtonオブジェクトは作成しません。確かにあなたがループとしてこれをしたい容疑者、それが原因のタブページにだと、あなたの疑いでジャイブが、それは確かに問題だしません...

私はtabControlが渡さTabControlです) :

While SQLreader.Read() 
    For i = 1 To 9 
     If Not SQLreader(2) Is System.DBNull.Value Then 
      Dim myIcon As Icon = Icon.ExtractAssociatedIcon(SQLreader(2)) 
     End If 
     Dim toolTip1 As ToolTip = New ToolTip(Me.components) 
     Dim NewButton As Button = New Button 
     NewButton.Width = 32 
     NewButton.Height = 32 
     NewButton.Text = i 
     NewButton.Image = myIcon.ToBitmap 
     tabControl.TabPages(tab).Controls.Add(NewButton) 
     If Not SQLreader(1) Is System.DBNull.Value Then 
      toolTip1.SetToolTip(NewButton, SQLreader(1)) 
      toolTip1.Active = True 
     End If 
    Next 
End While 

がうまくいけば、それはそうです - 私のVB.NETは素晴らしいではありません...

は、私はあなたの元のコードはしかしコンパイル驚いて - あなたは上Option Strictを持っているのですか?

コマンドおよび接続には、例外が発生しても処理されるように、Usingステートメントを使用する必要があります。

+0

それはコンパイルされていない、まだその変更ではありません。私はまだデバッグモードで同じエラーを取得 "オブジェクト変数またはWithブロック変数が設定されていません。同じ行を参照してください。 – MaQleod

+0

コンパイルされなかった場合、どのようにデバッガで何が表示されますか?実行せずにデバッグすることはできず、コンパイルせずに実行することはできません。私の変更で 'tabControl'として何を渡していますか? –

+0

私はちょうど、デバッグを開始し、コンパイルを試み、私にエラーを提供します。 私は今すぐ2つの引数を渡しています。tabcontrolはタブコントロール名です。タブはタブページのテキストなので、正しいボタンセットを選択するためにSQL文を正しく修飾できます。私はエラーが発生します: "オブジェクト変数またはWithブロック変数が設定されていません。" tabControl.tabpages(tab).add(NewButton) – MaQleod