mikrocontroller.net

Forum: PC-Programmierung VB: Ergebnis einer Funktion in ComboBox ausgeben


Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgende Funktion, das Ergebnis dieser Funktion möcht ich in so 
einem Drop Down Menü (ComboBox) ausgeben, nur wie bring ich den Inhalt 
da hinen, ich versteh die Funktion nicht ganz.

Die Funktion fragt ab welche seriellen Schnittstellen verfügbar sind!

Hier der Code:

Public Function CommPortsAvail(ByRef MSComm As MSComm, _
                      Optional ByVal FreePortsOnly As Boolean _
                               ) As Variant
  Dim lPorts() As Integer
  Dim lPort    As Integer
  Dim l        As Integer

  On Error Resume Next

  With MSComm
    For lPort = 1 To 16
      .CommPort = lPort
      .PortOpen = True

      If (Err.Number <> comPortInvalid) Then
        If Not (FreePortsOnly And _
                Err.Number = comPortAlreadyOpen) Then
          ReDim Preserve lPorts(l)
          lPorts(i) = lPort
          l = l + 1
        End If
      End If

      If (.PortOpen) Then
        .PortOpen = False
      End If

      Err.Clear
    Next
  End With

  CommPortsAvail = lPorts()
End Function

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Funktion liefert dir ein Array in dem die Nummern der
verfügbaren Com Ports drinnen stehen.

Wenn also in dem Array die Nummern 1, 3 und 7 drinnen sind,
dann sind die Com Ports COM1, COM3 und COM7 verfügbar.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

danke für die Antwort, und welches Array ist das (Name)?

mfg
Christoph

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

das Integerarray lPorts() wird beim Durchlaufen der Ports dynamisch 
erweitert
und beinhaltet dann die Nummern der verfügbaren Schnittstellen.

Der Rückgabewert dieser Function ist dann das Integerarray.

ich würde es so machen:


Dim ports() As Integer
Dim cnt As Integer


ports() = CommPortsAvail(Mscomm1, True)

For cnt = 1 To UBound(ports())
Combo1.AddItem CStr(ports(cnt))
Next cnt


cu
thomas

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Hallo,
>
> danke für die Antwort, und welches Array ist das (Name)?

Bist du sicher, dass du VB kennst?
lports

Aber du wirst doch die Auswertung in die Combobox hoffentlich
nicht in dieser Funktion machen.
Die Funktion liefert das Array als Ergebnis zurück.
Du brauchst nur eine entsprechende Variable dafür um dort
das Ergebnis aufzufangen und gut ists.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nein ich hab das im Form_Load in die ComboBox geladen so wie es thomas 
beschrieben hat, allerdings erhalte ich in der ComboBox nur einen 0er!

Irgendwas stimmt da glaub ich nicht!

mfg
Christoph

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Hallo,
>
> nein ich hab das im Form_Load in die ComboBox geladen so wie es thomas
> beschrieben hat, allerdings erhalte ich in der ComboBox nur einen 0er!
>
> Irgendwas stimmt da glaub ich nicht!

Dann nimm dir den Debugger in VB und steppe mal die
Funktion durch, bzw. den Code der das Array auswertet.
Ist in VB nun wirklich keine grosse Hexerei.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wenn man sich gut auskennt ist es sicher kein Problem aber ich kenn mich 
nit so gut aus!

mfg
Christoph

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, 2 Fehler:


   If Not (FreePortsOnly And _
                Err.Number = comPortAlreadyOpen) Then
          ReDim Preserve lPorts(l)
         ' das ist falsch   lPorts(i) = lPort
         ' so richtig
          lPorts(l) = lPort

          l = l + 1
        End If



und hier so:



For cnt = 0 To UBound(ports())
Combo1.AddItem CStr(ports(cnt))
Next cnt




sollte jetzt gehen
also insgesamt so:






Option Explicit

Private Sub Form_Load()
Dim ports() As Integer
Dim cnt As Integer

ports() = CommPortsAvail(MSComm1, True)
For cnt = 0 To UBound(ports())
    Combo.AddItem CStr(ports(cnt))
Next cnt

End Sub

Public Function CommPortsAvail(ByRef MSComm As MSComm, _
                      Optional ByVal FreePortsOnly As Boolean _
                               ) As Variant
  Dim lPorts() As Integer
  Dim lPort    As Integer
  Dim l        As Integer

  On Error Resume Next

  With MSComm1
    For lPort = 1 To 16
      .CommPort = lPort
      .PortOpen = True

      If (Err.Number <> comPortInvalid) Then
        If Not (FreePortsOnly And _
                Err.Number = comPortAlreadyOpen) Then
          ReDim Preserve lPorts(l)
          lPorts(l) = lPort
          l = l + 1
        End If
      End If

      If (.PortOpen) Then
        .PortOpen = False
      End If

      Err.Clear
    Next
  End With

  CommPortsAvail = lPorts()
End Function

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Könnte mir vielleicht wer helfen was ich da falsch mache?

mfg
Christoph

Autor: GLT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie weit funktioniert's den bis jetzt?

Setz doch mal Haltepunkte beim Funktionseinsprung und dann per 
Einzelschrittmodus mal prüfen, was richtig läuft und was noch nicht.

Autor: Christoph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Thomas

Danke!! Es funktioniert jetzt!

mfg
Christoph

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph wrote:
> Hallo,
>
> wenn man sich gut auskennt ist es sicher kein Problem aber ich kenn mich
> nit so gut aus!

mit F9 setzt man einen Haltepunkt
mit F8 macht man einen Einzelschritt
mit F5 lässt man sein Programm laufen

Variablen anschauen kann man, wenn das Programm im Debugger
steht (also zb nach einem Haltepunkt) indem man mit der
Maus auf den Variablennamen zeigt.

Findet sich alles im Debug Menü wieder.

Und die Funktion funktioniert nun wirklich sehr einfach.
Sie probiert einfach alle Com Ports von 1 bis 16 durch
und versucht sie zu öffnen. Wenn das gelingt, dann kommt
die betreffende Zahl ins Array, wenn nicht, dann wird mit
der nächsten Zahl weitergemacht.

Autor: thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kleiner tip:

du solltest in vb immer "Option Explicit" verwenden.

wenn du das nicht tust, dann braust du auch keine Variablen zu 
declarieren.

bei einem Schreibfehler wie bei deinem Code (l <> i ) wird einfach die 
Variable i neu declariert und schon hast du einen fehler und man sucht 
sich dumm und dähmlich

cu

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.