VB.NET: Mis juhtus massiivide juhtimisel

Juhtmassiivide väljajätmine VB.NET-ist on väljakutse neile, kes õpetavad massiive.

  • Enam pole võimalik juhtelementi, näiteks tekstikasti, lihtsalt kopeerida ja seejärel kleepida (üks või mitu korda) juhtmassiivi loomiseks.
  • Kontrollmassiiviga sarnase struktuuri loomiseks mõeldud VB.NET-kood on kõigis VB.NET-i raamatutes, mida ma olen ostnud ja Internetis, olnud palju pikemad ja palju keerukamad. Sellel puudub VB6-s leiduva juhtmassiivi kodeerimise lihtsus.

Kui viitate VB6 ühilduvuskogule, on seal objekte, mis toimivad üsna sarnaselt juhtmassiividega. Mida ma mõtlen, kasutage lihtsalt VB.NET-i värskendusviisardit programmiga, mis sisaldab juhtmassiivi. Kood on jälle kole, kuid töötab. Halb uudis on see, et Microsoft ei taga ühilduvuskomponentide jätkuvat toetamist ja te ei peaks neid kasutama.

VB.NET-kood "juhtmassiivide" loomiseks ja kasutamiseks on palju pikem ja palju keerulisem.

Microsofti sõnul nõuab VB 6-s toimuva jaoks isegi lähedase loomine "lihtsa komponendi, mis dubleerib juhtimismooduli funktsioone" loomist.

instagram viewer

Selle illustreerimiseks vajate nii uut klassi kui ka hostimisvormi. Klass loob ja hävitab tegelikult uued sildid. Klassi täielik kood on järgmine:

Avalik klass LabelArray
Pärib süsteemi. Kogud. CollectionBase
Privaatne ainult lugemisvorm kui _
Süsteem. Windows. Vormid. Vorm
Avalik funktsioon AddNewLabel () _
Süsteemina. Windows. Vormid. Silt
'Looge klass Label uus eksemplar.
Dim aLabel uue süsteemina. Windows. Vormid. Silt
'Lisage kollektsiooni silt
'sisemine nimekiri.
Mina. Loend. Lisa (aLabel)
'Lisage märgistus juhtseadmete kollektsiooni
väljale HostForm viidatud vormi ".
HostForm. Juhtelemendid. Lisa (aLabel)
'Objekti Label algsete omaduste määramine.
aLabel. Ülemine = krahv * 25
aLabel. Laius = 50
aLabel. Vasakpoolne = 140
aLabel. Silt = mina. Krahv
aLabel. Tekst = "Silt" ja mina. Krahv. ToString
Naaske aLabel
Lõppfunktsioon
Avalik alam uus (_
ByVal host kui süsteem. Windows. Vormid. Vorm)
HostForm = host
Mina. AddNewLabel ()
Lõpu alam
Vaikimisi avalik ainult lugemise vara _
Üksus (ByVal indeks täisarvuna) nagu _
Süsteem. Windows. Vormid. Silt
Saage
Tagasi CType (Me. Nimekiri. Üksus (register), _
Süsteem. Windows. Vormid. Silt)
Lõpp saada
Lõppomand
Avalik alam eemalda ()
'Kontrollige, kas eemaldatav silt on olemas.
Kui mina. Krahv> 0 Siis
'Eemaldage viimane massiivile lisatud silt
'hostvormi juhtelementide kogumist.
'Pange tähele vaikeomandi kasutamist kaustas
'massiivi juurde pääsemine.
HostForm. Juhtelemendid. Eemalda (mina (mina. Krahv - 1))
Mina. Loend. EemaldaAt (minu arv. 1)
Lõpeta If
Lõpu alam
Lõpuklass

Selle klassikoodi kasutamise illustreerimiseks võite luua vormi, mis seda kutsub. Peaksite kasutama allpool näidatud koodi kujul:

Avaliku klassi vorm1. Pärib süsteemi. Windows. Vormid. Vorm. #Region "Windowsi vormidisainerite loodud kood" 'Samuti peate lisama avalduse:' MyControlArray = New LabelArray (Me) "pärast kõnes Initialize Component () kutset. 'peidetud piirkonna kood. 'Kuulutage uus ButtonArray objekt. Dim MyControlArray kui LabelArray. Privaatne alam btnLabelAdd_Click (_. ByVal saatja kui süsteem. Objekt, _. ByVal e As süsteem. EventArgs) _. Käepidemed btnLabelAdd. Klõpsake nuppu. 'Helistage meetodile AddNewLabel. 'MyControlArray. MyControlArray. AddNewLabel () 'Muutke BackColori omadust. nupu 0. MyControlArray (0) .BackColor = _. Süsteem. Joonistamine. Värv. Punane. Lõpu alam. Privaatne alam btnLabelRemove_Click (_. ByVal saatja kui süsteem. Objekt, _. ByVal e As süsteem. EventArgs) _. Käepidemed btnLabelRemove. Klõpsake nuppu. 'Helistage MyControlArray meetodile Eemalda. MyControlArray. Eemalda () Lõpu alam. Lõpuklass

Esiteks ei tee see disaini ajal isegi seda tööd, nagu me tegime seda VB 6-s! Ja teiseks, nad ei asu massiivis, vaid VB.NET-i kollektsioonis - palju teistsugune asi kui massiiv.

Põhjus, miks VB.NET ei toeta VB 6 "juhtmassiivi", on see, et "juhtimismassiivi" pole olemas (pange tähele jutumärkide muutumist). VB 6 loob stseenide taga kollektsiooni ja paneb selle arendajana massiivina ilmuma. Kuid see pole massiiv ja teil on IDE kaudu pakutavatest funktsioonidest vähe kontrolli all.

VB.NET seevastu nimetab seda, mis see on: objektide kogumit. Ja nad annavad arendajale kuningriigi võtmed, luues kogu asja õues.

Näitena eelistest, mida see arendajale annab, pidid VB 6 juhtimisseadmed olema sama tüüpi ja neil pidi olema sama nimi. Kuna need on vaid VB.NET-i objektid, saate neid erinevat tüüpi muuta ja neile erinevaid nimesid anda ning hallata neid samas objektide kogumis.

Selles näites tegeleb sama klikisündmus kahe nupuga ja märkeruuduga ning kuvab, millisel neist klõpsati. Tehke seda koodireal VB 6-ga!

Privaatne alam MixedControls_Click (_
ByVal saatja kui süsteem. Objekt, _
ByVal e As süsteem. EventArgs) _
Käepidemed Button1.Click, _
Nupp2.Kliki, _
CheckBox1.Click
Allpool esitatud väide peab olema üks pikk lause!
"See on siin neljal real, et kitsana hoida
"piisavalt, et mahtuda veebilehele
Label2.Text =
Microsoft. VisualBasic. Õige (saatja. GetType. ToString,
Len (saatja. GetType. String) -
(InStr (saatja. GetType. ToString, "Vormid") + 5))
Lõpu alam

Alamvahemiku arvutamine on omamoodi keeruline, kuid tegelikult ei ole see see, millest me siin räägime. Klikiüritusel võiksite teha ükskõik mida. Võite näiteks kasutada käsku Tüüp juhtnupus If, et teha erinevaid juhtnööre eri asjades.

Franki arvutusuuringute grupi tagasiside massiivide kohta

Franki õpperühm tõi näite vormil, millel on 4 silti ja 2 nuppu. Nupp 1 tühjendab sildid ja nupp 2 täidab need. Hea mõte on uuesti lugeda Franki algset küsimust ja märgata, et tema kasutatud näit oli silmus, mida kasutatakse siltide komponentide massiivi pealdise tühjendamiseks. Siin on selle VB 6 koodi VB.NET ekvivalent. See kood teeb seda, mida Frank algselt nõudis!

Avaliku klassi vorm1. Pärib süsteemi. Windows. Vormid. Vorm. #Region "Windowsi vormidisainerite loodud kood" Dim LabelArray (4) sildina. "kuulutab hulga etikette. Privaatne alavorm1_koormus (_. ByVal saatja kui süsteem. Objekt, _. ByVal e As süsteem. EventArgs) _. Käsitseb MyBase'i. Koormus. SetControlArray () Lõpu alam. Alam SetControlArray () LabelArray (1) = silt1. LabelArray (2) = Label2. LabelArray (3) = silt3. LabelArray (4) = silt4. Lõpu alam. Privaatne alamnupp1_Kliki (_. ByVal saatja kui süsteem. Objekt, _. ByVal e As süsteem. EventArgs) _. Käepidemed Button1.Click. 'Nupp 1 selge massiiv. Pimendus täisarvuna. Kui a = 1 kuni 4. LabelArray (a) .Text = "" Järgmine. Lõpu alam. Privaatne alamnupp2_Kliki (_. ByVal saatja kui süsteem. Objekt, _. ByVal e As süsteem. EventArgs) _. Käepidemed nuppu2.Klõpsake. 'Nupp 2 täitke massiiv. Pimendus täisarvuna. Kui a = 1 kuni 4. LabelArray (a) .Tekst = _. "Juhtmassiiv" ja CStr (a) Järgmine. Lõpu alam. Lõpuklass

Selle koodiga katsetades saate teada, et lisaks siltide omaduste määramisele saate helistada ka meetoditele. Miks läks mul (ja Microsoftil) kõik probleemid, et ehitada artikli I ossa kood "inetu"?

Ma ei pea nõustuma, et see on klassikalises VB mõttes tõesti "kontrollmassiiv". VB 6 juhtmassiiv on VB 6 süntaksi toetatud osa, mitte ainult tehnika. Tegelikult on selle näite kirjeldamise viis see, et see on juhtelementide massiiv, mitte juhtseadmete massiiv.

I osas kaebasin, et Microsofti näide töötas AINULT tööaega ja mitte kavandamise aega. Saate vorme juhtelemente lisada ja kustutada dünaamiliselt, kuid kogu asi tuleb koodis rakendada. Juhtelemente ei saa lohistada, et neid luua nagu VB 6-s. See näide töötab peamiselt projekteerimise ajal ja mitte käitamise ajal. Käitusajal ei saa juhtelemente dünaamiliselt lisada ega kustutada. Mõnes mõttes on see I osa näite täielik vastand.

Klassikaline VB 6 juhtimismassiivi näide on sama, mis on rakendatud VB .NET-koodis. Siin VB 6 kood (see on võetud Mezick & Hillierist, Visual Basic 6 sertifitseerimise eksami juhend, lk 206 - pisut muudetud, kuna raamatus toodud näide annab juhtelemente, mida pole näha):

Dim MyTextBox kui VB.TextBox. Staatiline intNumber täisarvuna. intNumber = intNumber + 1. Seadke MyTextBox = _. Mina. Juhtelemendid. Lisage ("VB.TextBox", _. "Tekst" ja intNumber) MyTextBox. Tekst = MyTextBox. Nimi. MyTextBox. Nähtav = tõsi. MyTextBox. Vasak = _. (intNumber - 1) * 1200

Kuid nagu Microsoft (ja mina) nõustume, pole VB 6 juhtimismassiivid VB.NET-is võimalikud. Parim, mida saate teha, on funktsioonide kopeerimine. Minu artikkel dubleeris Mezicki ja Hillieri näites leiduvat funktsionaalsust. Uurimisrühma kood dubleerib omaduste ja helistamismeetodite seadmise funktsionaalsust.

Nii et kokkuvõtlikult võib öelda, et see sõltub tõesti sellest, mida soovite teha. VB.NET-il pole küll kogu asja keele osana mähitud - veel -, kuid lõppkokkuvõttes on see palju paindlikum.

John Fannoni juhtimismassiivid

John kirjutas: Ma vajasin kontrollmassiive, kuna soovisin vormi panna jooksval ajal lihtsat numbritabelit. Ma ei tahtnud, et neid kõiki eraldi paigutataks, ja tahtsin kasutada VB.NET-i. Microsoft pakub lihtsale probleemile väga detailset lahendust, kuid väga väikese mutri purustamiseks on see väga suur kelguhaamer. Pärast mõningast katsetamist tabasin lõpuks lahenduse. Siit saate teada, kuidas ma seda tegin.

Ülaltoodud näites About Visual Basic on näidatud, kuidas saate eksemplari luues vormil tekstiboksi luua objekti lisamine, omaduste määramine ja selle lisamine vormi kuuluvasse juhtseadmete kogusse objekt.

Tuhmista txtDataShow uue tekstina
txtDataShow. Kõrgus = 19
txtDataShow. Laius = 80
txtDataShow. Asukoht = uus punkt (X, Y)
Mina. Juhtelemendid. Lisa (txtDataShow)
Ehkki Microsofti lahendus loob klassi, mõtlesin ma, et selle kõik oleks võimalik mässida hoopis alamprogrammi. Iga kord, kui sellele alamprogrammile helistate, loote vormile uue tekstikasti eksemplari. Siin on täielik kood:

Avaliku klassi vorm1
Pärib süsteemi. Windows. Vormid. Vorm

#Region "Windowsi vormidisainerite loodud kood"

Privaatne alam BtnStart_Click (_
ByVal saatja kui süsteem. Objekt, _
ByVal e As süsteem. EventArgs) _
Käsitseb btnStart. Klõpsake nuppu

Dim I kui täisarv
Dim sData keelpillina
I jaoks = 1 kuni 5
sData = CStr (I)
Kutsuge AddDataShow (sData, I)
Järgmine
Lõpu alam
Alam AddDataShow (_
ByVal sText kui string, _
ByVal I kui täisarv)

Tuhmista txtDataShow uue tekstina
Dim UserLft, UserTop kui täisarv
Dim X, Y kui täisarv
UserLft = 20
UserTop = 20
txtDataShow. Kõrgus = 19
txtDataShow. Laius = 25
txtDataShow. TextAlign = _
Horisontaalne joondamine. Keskus
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Tekst = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Kõrgus
txtDataShow. Asukoht = uus punkt (X, Y)
Mina. Juhtelemendid. Lisa (txtDataShow)
Lõpu alam
Lõpuklass
Väga hea mõte, John. See on kindlasti palju lihtsam kui Microsofti kood... nii et ma ei tea, miks nad seda nõudsid?

Uurimise alustamiseks proovime muuta ühte koodide omandiõiguse määramist. Muutame

txtDataShow. Kõrgus = 19
kuni

txtDataShow. Kõrgus = 100
lihtsalt selleks, et veenduda märgatava erinevuse olemasolus.

Koodi uuesti käivitamisel saame... Whaaaat??? sama asi. Ei mingeid muutusi. Tegelikult saate väärtust kuvada avaldusega nagu MsgBox (txtDataShow. Kõrgus) ja saate vara väärtusena ikkagi 20, olenemata sellest, mille te sellele määrate. Miks see juhtub?

Vastus on, et me ei tule objektide loomiseks oma klassi, vaid lisame asju lihtsalt teise klassi, nii et peame järgima teise klassi reegleid. Ja need reeglid ütlevad, et kõrguse omadust muuta ei saa. (Wellllll... sa saad. Kui muudate mitmerealise atribuudi väärtuseks Tõene, saate muuta ka kõrgust.)

Miks VB.NET edasi läheb ja käivitab koodi, isegi sosistamata, et seal võib olla midagi valesti, kui see tegelikult eirab teie väidet, siis on tegemist täiesti tühise käraga. Ma soovitaksin siiski vähemalt hoiatust kompileerimisel. (Vihje! Vihje! Vihje! Kas Microsoft kuulab?)

I osas toodud näide pärib teisest klassist ja see muudab atribuudid päritavas klassis oleva koodi jaoks kättesaadavaks. Selle näite kõrguse atribuudi kõrguse muutmine 100-ks annab meile oodatud tulemused. (Jälle... üks lahtiütlemine: kui luuakse suure Labeli komponendi uus eksemplar, katab see vana. Uute Labeli komponentide nägemiseks peate lisama meetodikõne aLabel. Too ette().)

See lihtne näide näitab, et kuigi VÕIME lihtsalt objekte teise klassi lisada (ja mõnikord on see õige asi), on programmide juhtimine objektide üle nõuab, et tuletaksime need klassist ja kõige korraldatum viis (julgen öelda, et .NET viis "??) on uues tuletatud klassis omaduste ja meetodite loomine muutmiseks asju. John jäi alguses veendumata. Ta ütles, et tema uus lähenemisviis sobib tema eesmärgiga, isegi kui sellele, et see ei ole "COO" (õigesti objektile orienteeritud), on piiranguid. Hiljuti kirjutas John siiski:

"... Pärast 5 tekstikastist komplekti kirjutamist käitustööl tahtsin andmeid värskendada programmi järgmises osas - kuid midagi ei muutunud - algandmed olid endiselt alles.

Leidsin, et saan probleemist mööda, kirjutades vanade kastide eemaldamiseks koodi ja pannes need uuesti uute andmetega koodi. Parem viis selleks oleks Minu kasutamine. Värskenda. Kuid see probleem on juhtinud minu tähelepanu vajadusele pakkuda välja tekstikastide lahutamise ja lisamise meetod. "

Johni kood kasutas globaalset muutujat, et jälgida, kui palju juhtelemente oli vormile lisatud, nii et meetod ...

Privaatne alavorm1_koormus (_
ByVal saatja kui süsteem. Objekt, _
ByVal e As süsteem. EventArgs) _
Käsitseb MyBase'i. Koormus
CntlCnt0 = mina. Juhtelemendid. Krahv
Lõpu alam

Siis saaks "viimase" juhtelemendi eemaldada ...

N = mina. Juhtelemendid. Krahv - 1
Mina. Juhtelemendid. Eemalda (N)
John märkis, et "võib-olla on see natuke kohmakas".

See on viis, kuidas Microsoft jälgib objekte COM-is ja ülaltoodud "koledas" näidiskoodis.

Olen nüüd pöördunud tagasi vormi juhtseadiste dünaamilise loomise probleemini jooksval ajal ja olen uuesti vaadanud artikleid "Mis juhtus massiivide kontrollimiseks".

Olen klassid loonud ja saan nüüd juhtseadised vormile paigutada nii, nagu ma neid tahan.

John näitas, kuidas juhtida juhtnuppude paigutamist rühma kasti, kasutades uusi klasse, mida ta on hakanud kasutama. Võib-olla oli Microsoftil lõppude lõpuks nende "koledas" lahenduses see õige!

instagram story viewer