VisualBasic Name Einer Variable übergeben

NitroTurboRatte

Lieutenant
Dabei seit
Juli 2007
Beiträge
577
Sehr geerter Forum,
ich, noch immer ein VB-Anfänger, bin auf der Suche nach einer Antwort:
Wie kann ich den Namen einer Variable übergeben?
Hier ein Codebeispiel:
SUB MAIN
Dim a1 as byte
Dim a2 as byte
Dim d1 as byte
Dim d2 as byte
Funktion(1; a1)
END SUB

PUBLIC SUB Funktion(nummer as byte; ??)
?? = nummer
END SUB
Danke im Voraus für einen Vorschlag.
 
H

Housechen

Gast
Code:
PUBLIC SUB Funktion(ByVal nummer as byte, ByRef Variable As Byte)
Variable = nummer
END SUB
Also...
ByVal erzeugt eine Kopie des angegebenen Objektes, ByRef verlinkt zu dem angegebenen Objekt.
Kann auch sein, dass es andersrum ist, einfach ausprobieren.
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Und wenn es der name eines Steuerelement wie z.B einen Knopf ist?

Gibt es nicht irgendwie eine Syntax die dies erlaubt ?
 

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
ByRev ist ein Zeiger (Verweis), ByVal eine Kopie des Wertes. Der (Unterschied macht sich nur bemerkbar, wenn während des Ablaufs der Funktion der Wert durch eine andre Funktion geändert wird. Dann rechnet die Funktion bei Byval mit dem alten Wert weiter, bei ByRev mit dem Neuen.

Bei ByRev kann man auch eine Zuweisung auf das Argument tätigen. das geht bei ByVal nicht. Den Namen einer Variable kannst du nicht übergeben, da Variablen in eine kompilierten Programm keine Namen mehr haben. im kompilierten Code haben sie nur noch Adressen, auf die du aber unter VB keinen direkten Zugriff hast.
Dieser Code Ändert den Wert einer übergebenen Variable:

Code:
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim a As Integer
        a = 1
        ad(a, 2)
        MsgBox(a)
    End Sub

    Private Sub ad(ByRef var, ByVal val)
        var = val
    End Sub
Namen kann man nicht übergeben, weil sie nur im Codeeditor existieren.
mfg Verata


€: Der Name eines Controls (also einer Instanz einer Klasse, die von Controle erbt) lässt sich über die readonly Eigenschaft Name des Controls auslesen.
 
Zuletzt bearbeitet:

InkognitoGER

Lt. Commander
Dabei seit
Nov. 2007
Beiträge
1.079
Hi,

wenn du den Namen eines Steuerlements übergeben willst musst du desen Eigenschaft abfragen. In diesem Fall die Eigenschaft Name.


Sub Bearbeite (ButtonName as string)
....
End Sub

Aufruf:
bearbeite(cmdButon.Name)


Wie schon erwähnt geht das bei Variablen nicht. (strVariable.Name) geht nicht.

EDIT: Hmm wer lesen kann.... Verata hat das ja schon alles beschrieben.

Gruß
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Ok, ich sehe dass ich mein Problem nicht verständlich erklären kann.

Hier mein eigentlicher Code:
Public Class TTT
Dim a1_btnV As Byte
Dim a2_btnV As Byte
...
Dim c3_btnV As Byte

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles a1_btn.Click
btnSet(2, a1_btn, True)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
REM Voreinstellung
Modus.SelectedIndex = My.Settings.Modus_Set
If My.Settings.EndeRunde = False Then
SetStart()
End If

End Sub

Private Sub Modus_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Modus.SelectedIndexChanged
REM Stellt Zustand der ComboBox Member wie vor dem schließen her
REM Modus Unbesiegbar = 0
REM Master = 1
REM Trottel = 2
My.Settings.Modus_Set = Modus.SelectedIndex
End Sub

Public Sub SetStart()
REM Stellt die Felder beim starten der Einwendung ein
btnSet(My.Settings.a1_btn, a1_btn, False)
btnSet(My.Settings.a2_btn, a2_btn, False)
...
btnSet(My.Settings.c3_btn, c3_btn, False)
End Sub

Public Sub btnSet(ByVal ZustandU As Byte, ByRef btnU As System.Object, ByVal WeiterverU As Boolean)
REM Stellt die Knöpfe ein.
REM Knopf Zustand 1 = o, Computer
REM 0 = Nichts
REM 2 = User
REM SPEICHER ist der SpeicherOrt My.Setting
REM Weiterver legt fest, ob das Ereigniss an die Engine weitergel. wird
Dim Zustand As Byte = ZustandU
Dim btn As System.Object = btnU
Dim Speicher As System.Object = "My.Setting." & btn
Dim Weiterver As Boolean = WeiterverU
Dim lokVar As System.Object = btnU & "V"

If Zustand = 0 Then
btn.text = Nothing
Speicher = 0
lokVar = 0
ElseIf Zustand = 1 Then
btn.text = "O"
Speicher = 1
lokVar = 1
If Weiterver = True Then

End If
ElseIf Zustand = 2 Then
btn.text = "X"
Speicher = 2
lokVar = 1
If Weiterver = True Then

End If
End If
End Sub

Private Sub Restart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Restart.Click
REM Setzt alle Felder auf null
btnSet(0, a1_btn, False)
btnSet(0, a2_btn, False)
...
btnSet(0, c3_btn, False)
End Sub

Public Function Engine()

End Function

Private Sub a2_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles a2_btn.Click
btnSet(2, a2_btn, True)
End Sub

...
Private Sub c3_btn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles c3_btn.Click
btnSet(2, c3_btn, True)
End Sub
End Class
Seht ihr die Zeile
Dim Speicher As System.Object = "My.Setting." & btn
?

Es scheint irgendwie nicht zu klappen, den er will & nicht annehmen.
Wie kann ich denn den Inhalt von Speicher zusammenschneiden?
Ist der Datentyp überhaupt richtig?
 
Zuletzt bearbeitet:

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
Hi,
Zunächsteinmal währe an dieser Stelle interessant, welches VB du benutzt. Vorweg kann ich dir schon einmal sagen, das Deklarationen außerhalb von Funktionen nicht mit Dim sondern mit Private (nur für diese Klasse) oder mit public (für das gesamte Projekt) getätigt werden.
Also bitte so:
Code:
Private a1_btnV As Byte
Private a2_btnV As Byte

Private c3_btnV As Byte
Nun zu deiner Problemzeile:
Da My.Settings in Anführungszeichen steht wird es als String und nicht als Objekt erkannt. Wenn das gewollt ist rate ich dir dringend aus Speicher String zu machen (statt Objekt). Grundsätzlich nutzt du für fast alles den Dateityp Objekt. Der ist leider fast so schlimm wie Variant, da VB nicht mehr genau weiß, was du meinst. Bitte gib allen Variablen explizite Dateitypen.
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
? Wenn ich jetzt die jeweilligen Variablen mit dem Datentyp String versehe, kann ich denn den
Zusammengewürfelten Text als bsp. Variablenname oder Steuerelementname einsetzen?
BSP:
Dim Knopf as string = "a1" & "_btn"
Knopf.Text = OK
Also bei mir erscheint eine Fehlermeldung....
Gibt es den nicht einen bestimmten Datentyp für eine solche zusammensetzung?
 
Zuletzt bearbeitet:

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
Ja, das geht so. in diesem Fall müsste Knopf = "a1_btn" sein. Ich weiß nicht, ob das gewollt ist, aber wenn du Variablen mit diesen Namen meinst, musst du sie ohne "" schreiben. Wenn OK keine Variable ist müssen hier auch "" hin.
mfg Verata
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Das ist eben gerade mein Problem:
in der zweiten Zeile will ich nicht knopf als Variable ansprechen sondern den Inhalt von Knopf als eigenständige Variable oder Steuerelement,
in diesem Fall a1_btn, was der Entwurfname eines Knopfes ist.
Ich weiß eben nicht wie das gehen soll (spezielle Syntax oder Datentyp?)

(ich gebe zu dass ich mein Problem schlecht ausgedrückt habe... ;))
 
Zuletzt bearbeitet:

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Nein, bei deinem Beispiel übergebe ich ja den Textinhalt des Knopfes der Variable a.

Ich versuche es mit einem neuen Beispiel:
Code:
[COLOR="Lime"]REM Wir wollen einen Knopf mit dem Entwurfsnamen 15_btn den Text OK übergeben[/COLOR]
Dim nummerdesknopfes as byte = 15

[COLOR="lime"]REM Jetzt soll der Inhalt von nummerdesknopfes dazu dienen, den Entwurfsnamen des Knopfes zusammenzustellen 
REM um dem Knopf den Text zu übergeben
REM es soll zudem _btn angefügt werden[/COLOR]
 
Zuletzt bearbeitet:

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
AH! Jetzt weiß ich, was du willst. Das geht bedingt. Du kannst den Namen des anzusprechenden Elements nicht per Stringfunktionen zusammenbasteln, aber jedes Steuerelement hat die Eigenschaft Index. Du musst mehrere Steuerelemente mit gleichem Namen und unterschiedlichen Indexen erstellen. Der Index kann im Quellcode durch eine Variable ersetzt werden.
mfg Verata
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
@Vereta
nicht per Stringfunktionen zusammenbasteln
Ich suche eben gerade nach einem passendem Datentyp (und Syntax)...
Mit Steuerelement meine ich nicht nur DIE Steuerelemente, sondern auch z.B. Knöpfe ;)
Ich glaube du hast mein Problem falsch verstanden, bin aber dankbar, dass du mir hilfst :)

Ich erläutere mein Problem noch einmal, diesmal klarer:

Ich soll dem Knopf mit Entwurfsnamen a1_btn soll den Text "OK" erhalten.
Eine Function wird erstellt, die als Parameter die Position des Knopfes erhält, der den Text "OK" erhalten soll, in diesem Fall (BSP.)
Code:
Public Function zusammensteller (ByVal positionAbisC as Sting, ByVal position1bis3 as byte)
...
End Function
Wie lautet denn der Code in der Function, um dem Knopf a1_btn den text "OK" zu übergeben????
(nicht vergessen dass er, um den Entwurfsnamen des Knopfes zu ermitteln, den Buchstaben aus positionAbisC, die Nummer aus position1bis9 erhällt und _btn hinzufügen soll)
 
Zuletzt bearbeitet:

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
Gut, hast du Skype? Wenn ja schicke mir mal ne PN mit deinem Skypenamen und dann können wir das so klären.
mfg Verata
 

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
? Ich habe keinen Skype...
Ist auch nicht nötig,
setze das fehlende CodeStück von Beitrag 14 ein, ich werd es schon verstehen... ;)
 

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
Was meinst du denn mit Position? Eine Position in Koordinaten? Wenn ja die Eck-koordinate oder eine in der Fläche des Buttons enthaltene Koordinate?
Für den Fall, das es der exakte Punkt sein soll lautet die Funktion
Code:
    Private Sub set_OK(ByVal pos As Point)
        For Each Button In Me.Controls
            If Button.location = pos Then Button.text = "OK"
        Next
    End Sub
mfg Verata
 
Zuletzt bearbeitet:

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Nein, es ist nur eine von mir gegebene Position, die teils des Entwurfsnamen ist.
(Es befinden sich 9 Knöpfe in der Anwendung, 3 in jeder Zeile.)

Die Function zusammensteller soll dem Knopf a1_btn den Text "OK" übergeben,
Um den zuständigen Entwurfsnamen (a1_btn) zusammenzustellen erhält die Function den Buchstaben
"a" aus positionAbisC und 1 aus position1bis3.
Wie lautet den nun dieser Code?
 
Zuletzt bearbeitet:

Verata

Lieutenant
Dabei seit
Apr. 2009
Beiträge
747
Gut, ich glaube mir ist klar was du haben möchtest. Hier währe das Ergebnis:
Code:
Private Sub zusammenstellen(ByVal positionAbisC As String, ByVal position1bis3 As Byte)
        Dim bntname As String
        bntname = positionAbisC & CStr(position1bis3) & "_btn" [COLOR="Lime"]'Zusammenstellen des Namens[/COLOR]
        For Each Button In Me.Controls [COLOR="Lime"]'Diese Schleife geht alle auf den Formular plazieren Butten durch[/COLOR]
            If Button.name = bntname Then Button.text = "OK" [COLOR="Lime"]'und überprüft ob sie den richtigen Namen haben.[/COLOR]
        Next
    End Sub
Ich hoffe es hilft dir und entschuldige, das ich dich nicht sofort verstanden habe.
mfg Verata
 
Zuletzt bearbeitet:

NitroTurboRatte

Lieutenant
Ersteller dieses Themas
Dabei seit
Juli 2007
Beiträge
577
Danke, das ist fast was ich gesucht habe.
Kann man denn den Knopf a1_btn nicht direkt mithilfe des inhaltes von btnname ansprechen?
Muss man eine Schleifenkonstruktion aufbauen?
Gibt es nicht so etwas wie (bitte nicht erschrecken, sicher falsch):

{btnname.inhalt}.text = "OK"

Gibt es nicht einen besonderen Datentypen den man in unserem Fall für bntname gebrauchen könnten,
so dass der Compiler sofort versteht, dass es sich beim Inhalt um eine Variable oder einem Knopf handeln könnte?
Ergänzung ()

In diesem Fall würde eine Schleifekonstruktion nicht extrem viel performance kosten,
aber nehmen wir mal an, in einer Anwendung seien 100 Einstellungen gespeichert
(My.Settings), dann müsste die Anwendung für jeden Zugriff auf die Einstellungen
im Schlimmsten Fall alle Einträge durchklappern, was sicher viel Einfluss auf die Performance
hätte.
 
Zuletzt bearbeitet:
Top