VB.NET: Kas nutiko, norint valdyti masyvus

click fraud protection

Valdymo masyvų praleidimas iš VB.NET yra iššūkis tiems, kurie moko apie masyvus.

  • Nebegalima tiesiog nukopijuoti valdiklio, pavyzdžiui, teksto laukelio, ir tada jį įklijuoti (vieną ar kelis kartus), kad būtų sukurtas valdymo masyvas.
  • VB.NET kodas, skirtas sukurti struktūrą, panašią į valdymo masyvą, visose VB.NET knygose, kurias esu nusipirkęs ir internete, buvo daug ilgesnis ir daug sudėtingesnis. Jam trūksta VB6 esančio valdymo masyvo kodavimo paprastumo.

Jei nurodote VB6 suderinamumo biblioteką, ten yra objektų, kurie veikia panašiai kaip valdymo masyvai. Norėdami pamatyti, ką turiu omenyje, tiesiog naudokite VB.NET atnaujinimo vedlį su programa, kurioje yra valdymo masyvas. Kodas vėl negražus, bet veikia. Bloga žinia yra ta, kad „Microsoft“ negarantuos, kad ir toliau bus palaikomi suderinamumo komponentai, ir jūs negalite jų naudoti.

„VB.NET“ kodas sukurti ir naudoti „valdymo masyvus“ yra daug ilgesnis ir daug sudėtingesnis.

Anot „Microsoft“, norint padaryti tai, kas net artima tai, ką galite padaryti VB 6, reikia sukurti „paprastą komponentą, kuris dubliuoja valdymo masyvo funkcijas“.

instagram viewer

Norėdami tai parodyti, turite ir naujos klasės, ir prieglobos formą. Klasė iš tikrųjų kuria ir naikina naujas etiketes. Visas klasės kodas yra toks:

„Public Class LabelArray“
Paveldėjimo sistema. Kolekcijos. „CollectionBase“
Privatus tik „HostForm As“ _
Sistema. „Windows“. Formos. Forma
Vieša funkcija „AddNewLabel“ () _
Kaip sistema. „Windows“. Formos. Etiketė
Sukurkite naują etiketės klasės egzempliorių.
Dim aLabel Kaip nauja sistema. „Windows“. Formos. Etiketė
„Pridėkite etiketę prie kolekcijos
'vidinis sąrašas.
Aš. Sąrašas. Pridėti („aLabel“)
„Pridėkite etiketę prie„ Controls “kolekcijos
formos, nurodytos „HostForm“ lauke.
„HostForm“. Valdikliai. Pridėti („aLabel“)
„Nustatykite objekto„ Label “pirmines savybes.
aLabel. Į viršų = Skaičius * 25
aLabel. Plotis = 50
aLabel. Kairė = 140
aLabel. Žyma = Aš. Grafas
aLabel. Tekstas = „Etiketė“ ir aš. Grafas. „ToString“
Grąžinti „aLabel“
Pabaigos funkcija
Nauja vieša dalis (_
„ByVal“ kompiuteris kaip sistema. „Windows“. Formos. Forma)
HostForm = pagrindinis kompiuteris
Aš. „AddNewLabel“ ()
Pabaigos poskyris
Numatytoji viešoji tik skaitymo nuosavybė _
Prekė („ByVal“ indeksas kaip sveikas skaičius) kaip _
Sistema. „Windows“. Formos. Etiketė
Gaukite
Grįžti CType (Me sąrašas. Prekė (rodyklė), _
Sistema. „Windows“. Formos. Etiketė)
Pabaiga gauti
Pabaigos nuosavybė
Viešas antrinis šalinimas ()
„Patikrinkite, ar nėra etiketės, kurią reikia pašalinti.
Jei aš. Count> 0 Tada
„Pašalinkite paskutinę etiketę, pridėtą prie masyvo
iš pagrindinės formos valdymo rinkinio.
'Atkreipkite dėmesį į numatytosios nuosavybės naudojimą
'prieiga prie masyvo.
„HostForm“. Valdikliai. Pašalinti (aš (Me. Count - 1))
Aš. Sąrašas. PašalintiAt (Me. Count - 1)
Pabaiga Jei
Pabaigos poskyris
Pabaigos klasė

Norėdami parodyti, kaip šis klasės kodas bus naudojamas, galite sukurti jį vadinančią formą. Turėtumėte naudoti žemiau pateiktą formą:

1 klasės klasė. Paveldėjimo sistema. „Windows“. Formos. Forma. #Regionas „Windows Form Designer sukurtas kodas“ Taip pat turite pridėti teiginį: 'MyControlArray = Naujas LabelArray (Me) po skambučio InitializeComponent (). 'paslėptas regiono kodas. 'Paskelbkite naują „ButtonArray“ objektą. „Dim MyControlArray“ kaip „LabelArray“. Privatus antrinis „btnLabelAdd_Click“ (_. „ByVal“ siuntėjas kaip sistema. Objektas, _. „ByVal e As“ sistema. EventArgs) _. Rankenos btnLabelAdd. Spustelėkite. Skambinkite „AddNewLabel“ metodu. „iš„ MyControlArray “. „MyControlArray“. „AddNewLabel“ () „Pakeiskite„ BackColor “ypatybę. 'mygtuko 0. „MyControlArray“ (0) .BackColor = _. Sistema. Piešimas. Spalva. Raudona. Pabaigos poskyris. Privatus antrinis btnLabelRemove_Click (_. „ByVal“ siuntėjas kaip sistema. Objektas, _. „ByVal e As“ sistema. EventArgs) _. Rankenos „btnLabelRemove“. Spustelėkite. Skambinkite „MyControlArray“ pašalinimo metodu. „MyControlArray“. Pašalinti () Pabaigos poskyris. Pabaigos klasė

Pirma, tai net neatlieka tokio darbo „Design Time“ metu, kaip mes tai darėme VB 6! Antra, jų nėra masyve, jie yra VB.NET kolekcijoje - daug kitoks nei masyvas.

Priežastis, dėl kurios VB.NET nepalaiko VB 6 „valdymo masyvo“, yra tai, kad nėra „valdymo“ „masyvo“ (atkreipkite dėmesį į kabutės pasikeitimą). „VB 6“ sukuria užkulisių kolekciją ir pateikia ją kūrėjui kaip masyvą. Bet tai nėra masyvas ir jūs galite jį mažai valdyti, naudodamiesi IDE funkcijomis.

VB.NET, atvirkščiai, vadina tai, kas tai yra: objektų kolekcija. Jie perduoda kūrėjui karalystės raktus, sukurdami visa tai atviroje vietoje.

Kaip pavyzdį, kokį pranašumą tai suteikia kūrėjui, „VB 6“ valdikliai turėjo būti to paties tipo, ir jie turėjo turėti tą patį pavadinimą. Kadangi tai tik VB.NET objektai, galite juos sudaryti skirtingus tipus ir suteikti skirtingus pavadinimus bei vis tiek juos valdyti toje pačioje objektų kolekcijoje.

Šiame pavyzdyje tas pats „Click“ įvykis tvarko du mygtukus ir žymimąjį laukelį ir rodo, kuris iš jų buvo spustelėtas. Atlikite tai vienoje kodo eilutėje su VB 6!

„Private Sub MixedControls_Click“ (_
„ByVal“ siuntėjas kaip sistema. Objektas, _
„ByVal e As“ sistema. „EventArgs“ _
Rankenėlės Mygtukas1.Spustelėkite, _
Mygtukas2.Spustelėkite, _
„CheckBox1.Click“
Žemiau pateiktas teiginys turi būti vienas ilgas teiginys!
„Čia yra keturios eilutės, kad būtų siauros
'pakankamai, kad tilptų tinklalapyje
Label2.Text =
„Microsoft“. Visual Basic. Teisė (siuntėjas. „GetType“. „ToString“,
Len (siuntėjas. „GetType“. „ToString“) -
(„InStr“ (siuntėjas. „GetType“. „ToString“, „Formos“) + 5))
Pabaigos poskyris

Substring skaičiavimas yra savotiškai sudėtingas, tačiau tai nėra tikrai tai, apie ką mes čia kalbame. „Click“ įvykyje jūs galite padaryti bet ką. Pavyzdžiui, galite naudoti „Control“ tipą teiginyje „If“, jei norite atlikti skirtingus veiksmus skirtingoms valdymo priemonėms.

Franko kompiuterių studijų grupės atsiliepimai apie masyvus

Franko studijų grupė pateikė pavyzdį su forma, kurioje yra 4 etiketės ir 2 mygtukai. 1 mygtukas išvalo etiketes, o 2 mygtukas jas užpildo. Gera mintis dar kartą perskaityti originalų Franko klausimą ir pastebėti, kad jo naudojamas pavyzdys buvo kilpa, kuri naudojama žymėjimo komponentų masyvo antraštėms pašalinti. Štai to VB 6 kodo atitikmuo VB.NET. Šis kodas daro tai, ko iš pradžių paprašė Frankas!

1 klasės klasė. Paveldėjimo sistema. „Windows“. Formos. Forma. #Regionas „Windows Form Designer sukurtas kodas“ „Dim LabelArray“ (4) kaip etiketė. deklaruoja etikečių rinkinį. Privatus antrinės formos1_krovimas (_. „ByVal“ siuntėjas kaip sistema. Objektas, _. „ByVal e As“ sistema. EventArgs) _. Tvarko „MyBase“. Apkrova. „SetControlArray“ () Pabaigos poskyris. „Sub SetControlArray“ () LabelArray (1) = Etiketė1. „LabelArray“ (2) = „Label2“. „LabelArray“ (3) = „Label3“. „LabelArray“ (4) = „Label4“. Pabaigos poskyris. Asmeninis antrinis mygtukas1_Spustelėkite (_. „ByVal“ siuntėjas kaip sistema. Objektas, _. „ByVal e As“ sistema. EventArgs) _. Rankenėlės Mygtukas1.Spustelėkite. '1 mygtukas Aiškus masyvas. Dim kaip sveikas skaičius. Jei a = nuo 1 iki 4. „LabelArray“ (a) .Text = "" Kitas. Pabaigos poskyris. „Private Sub Button2_Click“ (_. „ByVal“ siuntėjas kaip sistema. Objektas, _. „ByVal e As“ sistema. EventArgs) _. Rankenėlės mygtuką2.Spustelėkite. '2 mygtuko užpildymo masyvas. Dim kaip sveikas skaičius. Jei a = nuo 1 iki 4. „LabelArray“ (a) .Text = _. „Valdymo masyvas“ ir CStr (a) Kitas. Pabaigos poskyris. Pabaigos klasė

Jei eksperimentuosite su šiuo kodu, sužinosite, kad be etikečių ypatybių nustatymo, galite skambinti ir metodais. Taigi kodėl aš (ir „Microsoft“) ėmiausi visų bėdų, norėdamas sukurti „bjaurų“ kodą straipsnio I dalyje?

Turiu nesutikti, kad tai tikrai yra „valdymo masyvas“ klasikine VB prasme. „VB 6“ valdymo masyvas yra palaikoma „VB 6“ sintaksės dalis, o ne tik technika. Tiesą sakant, galbūt būdas apibūdinti šį pavyzdį yra tai, kad tai yra valdiklių masyvas, o ne valdymo masyvas.

I dalyje aš skundžiau, kad TIK „Microsoft“ pavyzdys veikė ne darbo metu, o projektavimo metu. Galite dinamiškai pridėti ir ištrinti valdiklius iš formos, tačiau visa tai turi būti įgyvendinta kodu. Negalite vilkti ir mesti valdiklių, kad sukurtumėte juos taip, kaip galite VB 6. Šis pavyzdys dažniausiai naudojamas projektavimo metu, o ne vykdymo metu. Paleidimo metu negalima dinamiškai pridėti ir ištrinti valdiklių. Tam tikra prasme tai visiškai priešinga I dalies pavyzdyje.

Klasikinis VB 6 valdymo masyvo pavyzdys yra tas pats, kuris įgyvendinamas VB .NET kode. Čia yra VB 6 kodas (tai paimta iš „Mezick & Hillier“, „Visual Basic 6“ sertifikavimo egzamino vadovas, p. 206 - šiek tiek pakeistas, nes knygos pavyzdyje pateikiami valdikliai, kurių nematyti):

Dim MyTextBox kaip VB.TextBox. Statinis intNumber kaip sveikasis skaičius. intNumber = intNumber + 1. Nustatykite „MyTextBox = _“. Aš. Valdikliai. Pridėti („VB.TextBox“, _. „Tekstas“ ir intNumber) „MyTextBox“. Tekstas = „MyTextBox“. Vardas. „MyTextBox“. Matoma = tiesa. „MyTextBox“. Kairė = _. („intNumber“ - 1) * 1200

Tačiau kaip „Microsoft“ (ir aš) sutinkame, „VB 6“ valdymo masyvai VB.NET neįmanomi. Taigi geriausia, ką galite padaryti, yra dubliuoti funkcionalumą. Mano straipsnis dubliavo Mezick & Hillier pavyzdyje rastą funkciją. Studijų grupės kodas dubliuoja galimybę nustatyti ypatybes ir skambinimo metodus.

Taigi esmė ta, kad tai tikrai priklauso nuo to, ką nori padaryti. Vis dėlto VB.NET nėra visa tai, kas išdėstyta kaip kalbos dalis, tačiau galiausiai ji yra daug lankstesnė.

Johno Fannono „Kontrolinių masyvų perėmimas“

Johnas rašė: Man reikėjo valdymo matricų, nes norėjau formoje pateikti paprastą skaičių lentelę vykdymo metu. Nenorėjau pykinti, kad juos visus pateikčiau atskirai, ir norėjau naudotis VB.NET. „Microsoft“ siūlo labai išsamų paprastos problemos sprendimą, tačiau labai mažas rutulys nulaužti yra labai didelis. Po tam tikrų eksperimentų galiausiai pataikiau į sprendimą. Štai kaip aš tai padariau.

Aukščiau pateiktame „Visual Basic“ pavyzdyje parodyta, kaip kurdami egzempliorių galite sukurti formos „TextBox“ objekto nustatymas, savybių nustatymas ir įtraukimas į „Controls“ kolekciją, kuri yra formos dalis objektas.

Sumažinti „txtDataShow As New TextBox“
„txtDataShow“. Aukštis = 19
„txtDataShow“. Plotis = 80
„txtDataShow“. Vieta = Naujas taškas (X, Y)
Aš. Valdikliai. Pridėti („txtDataShow“)
Nors „Microsoft“ sprendimas sukuria klasę, aš nusprendžiau, kad visa tai būtų įmanoma įvynioti į paprogramę. Kiekvieną kartą paskambinę į šią paprogramę, sukuriate naują formos teksto laukelio egzempliorių. Štai visas kodas:

1 klasės klasė
Paveldėjimo sistema. „Windows“. Formos. Forma

#Regionas „Windows Form Designer sukurtas kodas“

Privatus antrinis „BtnStart_Click“ (_
„ByVal“ siuntėjas kaip sistema. Objektas, _
„ByVal e As“ sistema. „EventArgs“ _
Rankenos btnStart. Spustelėkite

Dim aš kaip sveikas
Dim sData As String
I = nuo 1 iki 5
„sData“ = CStr (I)
Skambinti „AddDataShow“ („sData“, I)
Kitas
Pabaigos poskyris
Papildoma „AddDataShow“ (_
„ByVal sText As String“, _
„ByVal I“ kaip sveikasis skaičius)

Sumažinti „txtDataShow As New TextBox“
Dim UserLft, „UserTop As Integer“
Dim X, Y kaip sveikasis skaičius
„UserLft“ = 20
„UserTop“ = 20
„txtDataShow“. Aukštis = 19
„txtDataShow“. Plotis = 25
„txtDataShow“. „TextAlign“ = _
HorizontalAlection. Centras
„txtDataShow“. BorderStyle = _
„BorderStyle“. „FixedSingle“
„txtDataShow“. Tekstas = sText
X = „UserLft“
Y = „UserTop +“ (I – 1) * „txtDataShow“. Ūgis
„txtDataShow“. Vieta = Naujas taškas (X, Y)
Aš. Valdikliai. Pridėti („txtDataShow“)
Pabaigos poskyris
Pabaigos klasė
Labai gera mintis, Jonas. Tai tikrai daug paprasčiau nei „Microsoft“ kodas... Taigi man įdomu, kodėl jie reikalavo tai daryti taip?

Norėdami pradėti tyrimą, pabandykime pakeisti vieną iš kodo nuosavybės ypatybių. Keiskimės

„txtDataShow“. Aukštis = 19
į

„txtDataShow“. Aukštis = 100
tiesiog įsitikinti, kad yra pastebimas skirtumas.

Kai vėl paleidžiame kodą, mes gauname... Whaaaat??? ... Tas pats. Jokių pokyčių. Tiesą sakant, vertę galite parodyti tokiu teiginiu kaip „MsgBox“ (txtDataShow. Aukštis) ir vis tiek gausite 20 kaip turto vertę, nesvarbu, ką jai priskiriate. Kodėl taip nutinka?

Atsakymas yra tas, kad mes nesugalvojame savo klasės kurti objektų, mes tiesiog pridedame daiktus kitoje klasėje, todėl turime laikytis kitos klasės taisyklių. Ir tos taisyklės nurodo, kad jūs negalite pakeisti aukščio savybės. (Wellllll... tu gali. Jei pakeisite daugialypės linijos nuosavybę į Tiesą, tuomet galėsite pakeisti ir aukštį.)

Kodėl „VB.NET“ eina į priekį ir vykdo kodą net nesvajodamas, kad gali būti kažkas ne taip, kai iš tikrųjų visiškai neatsižvelgiama į jūsų teiginį, kad tai yra visas „nekalbėjimas“. Vis dėlto galėčiau pasiūlyti bent įspėjimą kompiliacijoje. (Užuomina! Užuomina! Užuomina! Ar „Microsoft“ klausosi?)

I dalies pavyzdys paveldi iš kitos klasės, ir tai daro savybes prieinamas paveldimoje klasėje esančiam kodui. Jei šiame pavyzdyje pakeisite nuosavybės aukštį iki 100, gausime laukiamų rezultatų. (Vėlgi... vienas atsisakymas: kai sukuriamas naujas didelio „Label“ komponento egzempliorius, jis apima senąjį. Norėdami iš tikrųjų pamatyti naujus „Label“ komponentus, turite pridėti metodo skambutį „aLabel“. Atnešti į priekį().)

Šis paprastas pavyzdys rodo, kad, nors mes galime tiesiog pridėti objektus į kitą klasę (ir kartais tai yra teisinga daryti), objektų programavimo valdymas reikalauja, kad mes jas išvestume į klasę ir organizuotiausiu būdu (drįstu sakyti, „.NET būdas“ ??) yra sukurti savybes ir metodus naujoje išvestinėje klasėje, kad būtų pakeista daiktai. Jonas iš pradžių liko neįtikintas. Jis sakė, kad naujasis požiūris atitinka jo tikslą, net jei yra „COO“ (orientuota į objektą) apribojimų. Tačiau visai neseniai Jonas rašė:

"... Parašęs 5 teksto dėžučių rinkinį vykdymo metu, norėjau atnaujinti duomenis kitoje programos dalyje - bet niekas nepasikeitė - pirminiai duomenys vis tiek buvo.

Radau, kad galėčiau išspręsti problemą parašydamas kodą, kad nuimčiau senas dėžes ir vėl padėčiau jas su naujais duomenimis. Geresnis būdas tai padaryti būtų naudoti Mane. Atnaujinkite. Tačiau ši problema atkreipė mano dėmesį į poreikį pateikti metodą, kaip atimti teksto dėžutes ir jas pridėti “.

Jono kodas naudojo globalų kintamąjį, kad būtų galima sekti, kiek kontrolinių formų buvo pridėta prie formos, taigi metodas ...

Privatus antrinės formos1_krovimas (_
„ByVal“ siuntėjas kaip sistema. Objektas, _
„ByVal e As“ sistema. „EventArgs“ _
Tvarko „MyBase“. Apkrova
CntlCnt0 = Aš. Valdikliai. Grafas
Pabaigos poskyris

Tada „paskutinį“ valdiklį būtų galima pašalinti ...

N = aš. Valdikliai. Skaičius - 1
Aš. Valdikliai. Pašalinti (N)
Johnas pažymėjo, kad „galbūt tai yra šiek tiek gremėzdiškas“.

Tai yra būdas, kuriuo „Microsoft“ seka objektus COM IR jų „negražiame“ pavyzdžio kodelyje aukščiau.

Dabar grįžau prie problemos, susijusios su dinaminiu formos valdymo formavimu vykdymo metu, ir dar kartą peržvelgiau straipsnius „Kas nutiko, kad valdiau masyvus“.

Aš sukūriau klases ir dabar galiu įtaisyti valdiklius į formą taip, kaip aš norėčiau.

Johnas pademonstravo, kaip kontroliuoti valdiklių išdėstymą grupės dėžutėje, naudojantis naujomis klasėmis, kurias jis pradėjo naudoti. Galbūt „Microsoft“ turėjo tai savo „negražiame“ sprendime!

instagram story viewer