Springen naar inhoud


- - - - -
VS 2015

Variabele Declareren Tijdens Runtime

VS2015

  • Log in a.u.b. om te beantwoorden
Er zijn 11 reacties in dit onderwerp

#1 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 02 juli 2018 - 22:26

Hallo,

Is het mogelijk om tijdens runtime nieuwe variabelen te gaan declareren? Ik geef een voorbeeld:

Ik heb 1 textbox en 1 commandbutton

Wanneer ik op de commandbutton klik moet er een nieuwe variabele aangemaakt worden, en die variabele moet de naam krijgen die in de textbox ingevuld staat

Is dit mogelijk?

Thanks!

#2 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1072 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 03 juli 2018 - 17:54

Bericht bekijkenON3WVS, op 02 juli 2018 - 22:26, zei:

Is het mogelijk om tijdens runtime nieuwe variabelen te gaan declareren? Ik geef een voorbeeld:
Ik heb 1 textbox en 1 commandbutton
Wanneer ik op de commandbutton klik moet er een nieuwe variabele aangemaakt worden, en die variabele moet de naam krijgen die in de textbox ingevuld staat
Is dit mogelijk?
Ja dat kan. Met een ExpandoObject.
In VB.NET betekent dat wel dat je Option Strict moet opgeven, vermits geen dynamic keyword zoals in C#.
Je kan zelfs "methods" bijmaken d.m.v. delegates.
Bijvoorbeeld:
Visual Basic Code:

	Private Sub TestExpando()
		Dim obj As Object = New ExpandoObject
		' voeg een property naam toe, met de waarde "Expandor"
		obj.Naam = "Expandor"

		' voeg een property toe waarvan de naam pas gekend is @runtime
		Dim dict = DirectCast(obj, IDictionary(Of String, Object))
		' voeg een property met de naam Pi toe en de waarde Math.PI (die "Pi" komt dan uit je TextBox)
		dict("Pi") = Math.PI

		' toon obj.Pi en obj.Naam
		MessageBox.Show(obj.Pi.ToString,obj.Naam)

		' voeg een method toe
		dict("Verdubbel") = Function(x) x * 2

		' toon resultaat van method Verdubbel met 24 => 48
		MessageBox.Show(obj.Verdubbel.Invoke(24).ToString, obj.Naam)
	End Sub


Je kan nog een stap (of 10) verder gaan en d.m.v. de TypeBuilder runtime, van scratch, een volledige klasse maken met met fields, properties, constructoren, ...

Dus het is mogelijk. Maar ik vrees dat je een probleem probeert op te lossen dat je niet echt hebt.

Waarom denk je dat je dit nodig hebt?

#3 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 03 juli 2018 - 21:36

Hallo nogmaals Dirk,

Eerst en vooral hartelijk dank voor je aanhoudende hulp! Youtube, Google en de MSDN website zijn mijn eerste hulplijnen maar als ik er echt niet uitkom of als ik mijn probleem niet in een zoekopdracht kan verwoorden ben ik blij dat ik hier terecht kan.

Het zou idd kunnen dat er een andere oplossing bestaat voor mijn vraagstuk, maar uw oplossing klinkt als een oplossing

Ik denk echter dat mijn kennis niet ver genoeg reikt om deze code te kunnen implementeren dus ben ik op een andere manier gevallen die ik ga proberen (lukt het niet, dan zal ik alsnog eens verder zoeken op jouw methode)

Het is de bedoeling dat de gebruiker op een "Setup" pagina in mijn programma, bepaalde objecten kan toevoegen. Die objecten moet ik dan natuurlijk kunnen aanspreken vanuit het programma.
Dus had ik nu zo gedacht dat ik alle objecten die de gebruiker aanmaakt, eerst ga opslaan in een listbox. ALS de gebruiker dan nieuwe objecten aangemaakt heeft, dan kan ik naar deze listbox verwijzen ipv naar variabelen te verwijzen.

Enfin, het is misschien niet best omschreven maar het is ook niet eenvoudig wat ik probeer te doen, aldus voor mijn programmeerkennis toch :-)

Ik hou je op de hoogte!

Wouter

#4 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1072 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 04 juli 2018 - 01:39

Bericht bekijkenON3WVS, op 03 juli 2018 - 21:36, zei:

Het zou idd kunnen dat er een andere oplossing bestaat voor mijn vraagstuk, maar uw oplossing klinkt als een oplossing

Ik denk echter dat mijn kennis niet ver genoeg reikt om deze code te kunnen implementeren dus ben ik op een andere manier gevallen die ik ga proberen (lukt het niet, dan zal ik alsnog eens verder zoeken op jouw methode)

Het is de bedoeling dat de gebruiker op een "Setup" pagina in mijn programma, bepaalde objecten kan toevoegen. Die objecten moet ik dan natuurlijk kunnen aanspreken vanuit het programma.
Dus had ik nu zo gedacht dat ik alle objecten die de gebruiker aanmaakt, eerst ga opslaan in een listbox. ALS de gebruiker dan nieuwe objecten aangemaakt heeft, dan kan ik naar deze listbox verwijzen ipv naar variabelen te verwijzen.

Enfin, het is misschien niet best omschreven maar het is ook niet eenvoudig wat ik probeer te doen, aldus voor mijn programmeerkennis toch :smile:

Wat voor objecten zijn dat dan? Zijn die allemaal van hetzelfde type?
Wat is er mis met een eenvoudige dictionary?
1. Voor verschillende types:
Visual Basic Code:

	Private Sub DictionaryObject()
		' maken en opvullen
		Dim dictionary As New Dictionary(Of String, Object)
		dictionary("Vandaag") = DateTime.Today
		dictionary("Naam") = "Dirk"
		dictionary("Kleur") = Color.Red
		' gebruiken
		MessageBox.Show("Kleur =" + dictionary("Kleur").ToString, dictionary("Naam").ToString)
	End Sub
 


2. Voor hetzelfde type, of een hiërarchie (hier Control)
Visual Basic Code:
	Private Sub DictionaryControl()
		' maken en opvullen
		Dim dictionary As New Dictionary(Of String, Control)
		dictionary("Knop") = New Button
		dictionary("Lijst") = New ListBox
		dictionary("TextBox") = New TextBox
		' gebruiken
		dictionary("Knop").BackColor = Color.GreenYellow
		dictionary("TextBox").Text = "Ik ben een tekstbox"
	End Sub

 



#5 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 06 juli 2018 - 22:24

Dag Dirk,

Dictionaries zijn de oplossing voor mijn probleem! Ik zoek nu momenteel nog naar een manier om de inhoud van mijn dictionary uit te gieten als volgt

cmbCombo.items.add(mijndictionary)

maar dit blijkt niet zo gemakkelijk te lukken, ik krijg een foutmelding. Wanneer ik .toString gebruik dan staat er in mijn combobox de tekst [verzameling] ingevuld.... :-)

Ik zoek nog even verder maar moest je dit zo uit het hoofd weten dan hoor ik het graag!

Wouter

#6 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 06 juli 2018 - 22:28

Gevonden, ik had wat geblunderd (met één oog naar de voetbal kijken en met ander oog programmeren)

cmbCombo.DataSource = New BindingSource(mijndictionary, Nothing)   dit is de oplossing gebleken.

Nogmaals bedankt voor je idee mbt de dictionaries, had ik nog nooit van gehoord.

Wouter

#7 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 10 juli 2018 - 22:09

Hallo,

Ik wil graag de inhoud van mijn Dictionary in een listbox gieten, dat is mij reeds gelukt met bovenstaande (en onderstaande :-))code:


Dim MijnDictionary As New Dictionary(Of String, String)

Private Sub frmSetup_Load(sender As Object, e As EventArgs) Handles Me.Load
        MijnDictionary.Add("String", "1234")
        lstBox.DataSource = New BindingSource(MijnDictionary, Nothing)

Tot hier alles goed, maar het vervelende is dat de waarde die in mijn listbox getoond wordt, telkens tussen vierkante brackets staat, bijvoorbeeld:   [String1234]
Hoe kan ik hiervan af raken?

Bedankt

#8 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1072 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 21 juli 2018 - 18:36

 ON3WVS, on 10 juli 2018 - 22:09, said:


Tot hier alles goed, maar het vervelende is dat de waarde die in mijn listbox getoond wordt, telkens tussen vierkante brackets staat, bijvoorbeeld:   [String1234]
Hoe kan ik hiervan af raken?
Gebruik i.p.v. BindingList als datasource je eigen selectie. Wat is/zijn de type(s) van de values in de dictionary?

#9 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 22 juli 2018 - 12:12

Hi Dirk,

Beide types zijn string. Ik heb inmiddels een andere manier gevonden, ik heb uiteindelijk mijn listbox gesplitst in twee listboxen en in de éne kolom de key geladen en in de andere kolom de value.

Grtz W

#10 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1072 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 22 juli 2018 - 21:05

Bericht bekijkenON3WVS, op 22 juli 2018 - 12:12, zei:

Beide types zijn string.de value.
Dan was een Dictionary(Of String, String) beter dan Dictionary(Of String, Object)
Visual Basic Code:

	Dim dictionary = New Dictionary(Of String, String)
	dictionary("Naam") = "Dirk Andries"
	dictionary("Straat") = "Koekoekstraat 70"
	dictionary("Locatie") = "9090 Melle"




Bericht bekijkenON3WVS, op 22 juli 2018 - 12:12, zei:

Ik heb inmiddels een andere manier gevonden, ik heb uiteindelijk mijn listbox gesplitst in twee listboxen en in de éne kolom de key geladen en in de andere kolom de value.
Dat is misschien ook een oplossing.
Had ook gekund: Een ListView (al dan niet in Virtual Mode) met twee kolommen (voor de key en de value).
Of een DataGridView

Of dus met een ListBox en een eigen select:
Visual Basic Code:
	listBoxWaarden.DataSource = dictionary.Select(Function(item) $"{item.Key} = {item.Value}").ToList



#11 ON3WVS

ON3WVS

    Starting Developer

  • Leden
  • 21 berichten
    Laatst bezocht 13 aug 2018 21:49

Geplaatst op 22 juli 2018 - 21:53

Ah ok bedankt Dirk. Mijn dictionary is er eentje van het type string, string maar ik heb daar inderdaad een "workaround" moeten zoeken want in één en dezelfde listblox lukte het enerzijds wel, ware het niet dat die vervelende [ ] er telkens bij kwamen. Ik zal later nog meer data-functies nodig hebben dus deze info komt zeker van pas.

Nog maar eens dank :-)

#12 Dirk Andries

Dirk Andries

    Guru Developer

  • Leden
  • PipPipPipPipPipPip
  • 1072 berichten
    Laatst bezocht
  • LocatieGent

Geplaatst op 23 juli 2018 - 12:22

Bericht bekijkenON3WVS, op 22 juli 2018 - 21:53, zei:

Nog maar eens dank
Dat is niet nodig. Je kan je appreciatie voor een bepaalde post overigens ook uitdrukken via de "vind ik leuk" -knop:

Bijlage  VindIkLeuk.png   8,37K   1 downloads





Ook met taq VS 2015, VS2015 voorzien

0 gebruiker(s) lezen dit onderwerp

0 lid(leden), 0 bezoeker(s), 0 anonieme gebruikers

Inloggen


[VS 2015] Untitled 1

Met dank aan Jürgen voor de jarenlange inzet van visualbasic.be (anno dec 2000)
Met dank aan Mike en Ronneke voor de jarenlange inzet van vbib.be (anno dec 2010)
Met dank aan PascalBianca voor de jarenlange inzet van vbib.be (anno dec 2016)