Minulla on formilla kymmenen kuvalaatikkoa (picturebox), joihin viittaan numerolla 1-10 ja lataan kuvan tiettyyn kuvalaatikkoon sen perusteella. VB6-kielellä tämä olisi toiminut nimeämällä tiedostot yksinkertaisesti picElement(1), picElement(2), picElement(3) jne. mutta VB.Netissä tällainen ei ole mahdollista. Olen yrittänyt käyttää seuraavaa Public Class frmMain -kohdan alapuolella saadakseni efektin aikaan, mutta se ei ole toiminut:
Dim picElements() As PictureBox = {picElement1, picElement 2, picElement 3, picElement 4, picElement 5, picElement 6, picElement 7, picElement 8, picElement 9, picElement 10}
En siis halua luoda uusia kuvalaatikoita ohjelman suorituksen aikana, vaan käyttää jo olemassa olevia kymmentä kuvalaatikkoa. Tässä koodi, jota tarvitsee kuvalaatikoita:
Private Sub NewElement(ByVal UseElement As Integer, ByVal ElementPath As String) picElements(UseElement).Image = New Bitmap(ElementPath) picElements(UseElement).Visible = True End Sub
Ohjelma käy ensimmäisen rivin kohdalla (jossa määritetään kuva), mutta ei suorita sitä eikä jatka siitä toiselle riville.
En ole kovin hyvä koodari, joten kaipaisin mielellään mahdollisimman yksinkertaista helppoa vastausta (kuten mukaan liittämäni koodi osoittaa). Olen yrittänyt etsiä vastausta täältä (ja useista muistakin paikoista), mutta tuloksetta. Useimmat muut esimerkit näyttävät haluavan tehdä jotain muuta kuin vain viitata objektiin numerolla.
Kaikenlaisesta avusta ollaan kiitollisia.
Moikka Qualdan!
kokeile alla olevan esimerkin lähestymistapaa...
'viittaukset... Imports System Imports System.Drawing Imports System.Windows.Forms Imports Microsoft.VisualBasic Public Class MainForm '.... 'märitellään olio/jäsenet... Public Structure PicElements Public box As PictureBox Public right As Long Public bottom As Long Public pic() As String Public index As Integer 'Public jäsen As Tyyppi '... jne. End Structure 'tehdään oliosta taulukko... Public Shared PicElement() As PicElements '.... [k]valmiiksi generoitua paskaa[/k]... '.... Private Sub MainFormLoad( _ sender As System.Object, e As System.EventArgs) Dim i As Integer = 0, j As Integer = 0 Dim picbox As PictureBox 'aluksi on poimittava pictureBox count 'muuttujaan (i), koska For - Each looppi 'palauttaa boxit viimeisestä ensimmäiseen... For Each picbox In Me.Controls i += 1 '*** 'kasvatetaan olio-taulukon 'ulottuvuutta laskurin mukaan... ReDim Preserve PicElement(i) Next 'huomaa, että oliotaulukon alimman indeksin (PicElement(0)) 'jäsenet jäävät kokonaan käyttämättä syystä, että taulukon 'alaraja on .NET Framework ympäristössa aina 0 eli alarajaa 'ei voida dynaamisesti/staattisesti säädellä... 'Mikään ei kuitenkaan estä käyttämästä taulukon alimman 'indeksin alkion jäseniä tiedon varastoimiseen... 'Tilaa voidaan käyttää hyödyksi esim. sijoittamalla 'myös indeksin (0) alikion jäsenen .box kuvaksi jokin 'kuva, asettaa kontrolli ei-näkyväsi ja tarvittaessa '"swapata" boxin kuvatietoa toisten kontrollien kanssa... 'Myös kaikkiin muihin alkion jäseniin mahdollisesti 'varastoitu data on luonnollisesti käytettävissä... For Each picbox In Me.Controls With PicElement(i) 'lähtö on järjestyksessä 'viimeinen pictureBox -... '*** .box = picbox For j = 0 To 2 '* esim. 'kasvatetaan oliotaulukon(i) .pic jäsenen 'ulottuvuutta yhdellä per kierros... ReDim Preserve .pic(j) 'annetaan kullekin alkiolla arvoksi 'bittikarttatiedoston tiedostopolku... .pic(j) = "c:\bitmaps\picture" + _ CStr(i) + "_" + CStr(j + 1) + ".bmp" 'tässä on nyt oletuksena, että C: -asemassa on kansio 'nimeltä bitmaps, jossa tiedostot on nimetty tyyliin: 'picture1_1, picture2_1,...picture10_3... jne. 'sisällyttämällä tiedostnimeen esim. yhden ohjausmerkin 'lisää voidaan laskuria/jäsenen taulukko-ulottuvuutta 'säädellää dynaamisesti lukemalla latauksen alussa kansion 'tiedostonimet esim. kokoelman jäseniksi ja käyttämällä 'Split-funktiota, kokoelman dataa ja ohjausmerkkiä hyväksi... Next 'asetetaan oliotaulukon(i) jäsenen '.righ-ominaisuuden arvo... '(voi olla käyttökelpoinen idea...) .right = .box.Left + .box.Width 'asetetaan oliotaulukon(i) jäsenen '.bottom-ominaisuuden arvo... .bottom = .box.Top + .box.Height 'asetetaan oliotaulukon(i) jäsenen '.index-ominaisuuden arvo... .index = 0 End With 'pudotetaan laskurin arvoa alaspäin i -= 1 '*** Next 'koko rakennelmasta voidaan yhtä hyvin tehdä luokka, 'kapseloida viritelmä objektiksi ja hoitaa asetukset 'elegantisti property-aliohjemilla... End Sub Public Sub SetPicture(name As String) 'poimitaan parametrinä lähetetystä kontrollin nimestä 'ko. kontrollin "indeksi" poistamalla parametrin merkkijonosta 'Replace-funktion avulla nimiosa (esim "pictureBox") ja 'käytetään tätä Val-funktion avulla luvuksi muutettua arvoa 'oliotaulukon indeksinä, jolloin voidaan Iif funktion avulla 'säädellä oliotaulukon(indeksi) jäsenen .index arvoa... PicElement(Val(Replace(name,"pictureBox",""))).index = _ Iif (PicElement(Val(Replace(name,"pictureBox",""))).index < 2, _ PicElement(Val(Replace(name,"pictureBox",""))).index + 1, 0) 'Näin saadaan haluttuun kontrolliin ladattua haluttu kuva... PicElement(Val(Replace(name,"pictureBox",""))).box.image = _ New Bitmap(PicElement(CInt(Replace(name,"pictureBox",""))).pic( _ PicElement(Val(Replace(name,"pictureBox",""))).index)) End Sub Private Sub PictureBox1Click( _ sender As System.Object, e As System.EventArgs) 'lähetetään aliohjelmalle parametrinä kontrollin nimi... SetPicture(sender.name) '(esim. jokaisen pictureBoxin 'Click_Tapahtumasta) End Sub '... '... End Class
Kiitoksia, tuo auttoi ymmärtää asiaa vähän paremmin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.