Vadības masīvu izlaišana no VB.NET ir izaicinājums tiem, kas māca par masīviem.
- Vairs nav iespējams vienkārši nokopēt vadīklu, piemēram, tekstlodziņu, un pēc tam to ielīmēt (vienu vai vairākas reizes), lai izveidotu vadības masīvu.
- VB.NET kods, kas paredzēts vadības masīvam līdzīgas struktūras izveidošanai, visās VB.NET grāmatās, kuras esmu iegādājies un tiešsaistē, ir bijis daudz ilgāks un daudz sarežģītāks. Tam trūkst vadības masīva, kas atrodams VB6, kodēšanas.
Ja jūs atsaucas uz VB6 saderības bibliotēku, tur ir objekti, kas darbojas diezgan līdzīgi vadības blokiem. Lai redzētu, ko es domāju, vienkārši izmantojiet VB.NET jaunināšanas vedni ar programmu, kurā ir kontroles masīvs. Kods atkal ir neglīts, bet darbojas. Sliktā ziņa ir tā, ka Microsoft negarantēs, ka saderības komponenti tiks atbalstīti arī turpmāk, un jūs tos nevarat izmantot.
VB.NET kods, lai izveidotu un izmantotu "vadības blokus", ir daudz ilgāks un daudz sarežģītāks.
Pēc Microsoft domām, lai izdarītu kaut ko pat tuvu tam, ko varat darīt VB 6, ir jāizveido "vienkāršs komponents, kas dublē vadības masīva funkcionalitāti".
Lai to ilustrētu, ir nepieciešama gan jauna klase, gan mitināšanas veidlapa. Klase faktiski rada un iznīcina jaunas etiķetes. Pilns klases kods ir šāds:
Sabiedriskās klases LabelArray
Mantojumu sistēma. Kolekcijas. KolekcijaBase
Privāti lasāms tikai HostForm As _
Sistēma. Windows. Veidlapas. Forma
Publiskā funkcija AddNewLabel () _
Kā sistēma. Windows. Veidlapas. Etiķete
Izveidojiet jaunu klases etiķetes gadījumu.
Dim aLabel kā jauna sistēma. Windows. Veidlapas. Etiķete
“Pievienojiet etiķeti kolekcijai
'iekšējais saraksts.
Es. Saraksts. Pievienot (aLabel)
Pievienojiet marķējumu kolekcijai Controls
'uz veidlapas, uz kuru atsaucas HostForm.
HostForm. Kontroles. Pievienot (aLabel)
'Iestatīt objekta Label sākotnējās īpašības.
aLabel. Augšā = Skaits * 25
aLabel. Platums = 50
aLabel. Kreisais = 140
aLabel. Tag = Me. Grāfs
aLabel. Teksts = "Iezīme" un es. Grāfs. ToString
Atgrieziet aLabel
Beigu funkcija
Publisks apakšjauns (_
ByVal resursdators kā sistēma. Windows. Veidlapas. Forma)
HostForm = resursdators
Es. AddNewLabel ()
Beigas apakš
Noklusējuma publiskais tikai lasīšanas īpašums _
Vienums (ByVal indekss kā vesels skaitlis) kā _
Sistēma. Windows. Veidlapas. Etiķete
gūt
Atgriezt CType (Me. Saraksts. Vienība (indekss), _
Sistēma. Windows. Veidlapas. Etiķete)
Beigt saņemt
Beigu īpašums
Publiskā apakšnodaļas noņemšana ()
Pārbaudiet, vai ir etiķete, kuru noņemt.
Ja Es. Skaits> 0 Tad
'Noņemiet pēdējo masīvam pievienoto etiķeti
no resursdatora veidlapas vadības kolekcijas.
'Ievērojiet noklusējuma rekvizīta izmantošanu
'piekļuvi masīvam.
HostForm. Kontroles. Noņemt (Me (Me. Count - 1))
Es. Saraksts. NoņemtAt (Me. Count - 1)
Beigt ja
Beigas apakš
Beigu klase
Lai ilustrētu, kā tiks izmantots šis klases kods, varat izveidot veidlapu, kas to izsauc. Jums būs jāizmanto kods, kas parādīts zemāk veidlapā:
Sabiedriskās klases forma1. Mantojumu sistēma. Windows. Veidlapas. Forma. #Regions "Windows Form Designer ģenerēts kods" 'Jums jāpievieno arī paziņojums:' MyControlArray = New LabelArray (Me) pēc zvana InitializeComponent (). 'slēptais reģiona kods. 'Paziņojiet par jaunu ButtonArray objektu. Dim MyControlArray kā LabelArray. Privāts sub btnLabelAdd_Click (_. ByVal sūtītājs kā sistēma. Objekts, _. ByVal e As System. EventArgs) _. Rokturi btnLabelAdd. Klikšķis. Zvaniet uz AddNewLabel metodi. 'MyControlArray. MyControlArray. AddNewLabel () 'Mainīt BackColor īpašumu. 'no 0 pogas. MyControlArray (0) .BackColor = _. Sistēma. Zīmējums. Krāsa. Sarkans. Beigas apakš. Privāts sub btnLabelRemove_Click (_. ByVal sūtītājs kā sistēma. Objekts, _. ByVal e As System. EventArgs) _. Rokturi btnLabelRemove. Klikšķis. 'Izsauciet MyControlArray noņemšanas metodi. MyControlArray. Noņemt () Beigas apakš. Beigu klase
Pirmkārt, tas pat nedara darbu Dizaina laikā, kā mēs to darījām VB 6! Un, otrkārt, tie neatrodas masīvā, tie ir VB.NET kolekcijā - daudz atšķirīga lieta nekā masīvs.
Iemesls, kāpēc VB.NET neatbalsta VB 6 "vadības masīvu", ir tāds, ka nepastāv tāda kā "vadības" "masīvs" (ņemiet vērā pēdiņu maiņu). VB 6 izveido aizkulišu kolekciju un liek tai parādīties kā masīva izstrādātājam. Bet tas nav masīvs, un jums ir maz kontroles par to, kas pārsniedz funkcijas, kuras nodrošina IDE.
Savukārt VB.NET to sauc par to, kas tas ir: objektu kolekcija. Un viņi nodod izstrādātājam valstības atslēgas, izveidojot visu lietu brīvā dabā.
Kā piemēru tam, kāda veida priekšrocības tas dod izstrādātājam, VB 6 kontrolierīcēm bija jābūt viena veida un tām bija jābūt ar vienādu nosaukumu. Tā kā šie ir tikai objekti VB.NET, varat tos padarīt atšķirīgus un piešķirt tiem atšķirīgus nosaukumus, kā arī tos pārvaldīt vienā un tajā pašā objektu kolekcijā.
Šajā piemērā tas pats Klikšķa notikums apstrādā divas pogas un izvēles rūtiņu un parāda, uz kuru ir noklikšķināts. Dariet to vienā koda rindā ar VB 6!
Private Sub MixedControls_Click (_
ByVal sūtītājs kā sistēma. Objekts, _
ByVal e As System. EventArgs) _
Rokturi Button1.Click, _
Poga2.Noklikšķiniet, _
CheckBox1.Click
Turpmāk sniegtajam apgalvojumam jābūt vienam garam paziņojumam!
“Šeit tas atrodas četrās līnijās, lai saglabātu šauru
"pietiekami, lai ietilptu tīmekļa lapā
Label2.Text =
Microsoft. Visual Basic. Pa labi (sūtītājs. GetType. ToString,
Len (sūtītājs. GetType. ToString) -
(InStr (sūtītājs. GetType. ToString, "Veidlapas") + 5))
Beigas apakš
Apakšstīgas aprēķins ir sava veida sarežģīts, taču tas nav īsti tas, par ko mēs šeit runājam. Click notikumā jūs varat darīt jebko. Jūs, piemēram, varētu izmantot vadības tipu paziņojumā If, lai veiktu dažādas darbības dažādām vadīklām.
Frenka skaitļošanas studiju grupas atsauksmes par masīviem
Franka pētījumu grupa sniedza piemēru veidlapai, kurai ir 4 etiķetes un 2 pogas. 1. poga notīra etiķetes, un 2. poga tos aizpilda. Ir laba ideja vēlreiz izlasīt Franka sākotnējo jautājumu un pamanīt, ka viņa izmantotais piemērs bija cilpa, kuru izmanto, lai notīrītu iezīmju komponentu masīva Parakstu rekvizītus. Šeit ir šī VB 6 koda VB.NET ekvivalents. Šis kods dara to, ko Frenks sākotnēji prasīja!
Sabiedriskās klases forma1. Mantojumu sistēma. Windows. Veidlapas. Forma. #Regions "Windows Form Designer ģenerēts kods" Dim LabelArray (4) kā iezīme. deklarēt etiķešu masīvu. Privāta apakšforma1_lodze (_. ByVal sūtītājs kā sistēma. Objekts, _. ByVal e As System. EventArgs) _. Rokturi MyBase. Slodze. SetControlArray () Beigas apakš. Sub SetControlArray () LabelArray (1) = 1. etiķete. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. Beigas apakš. Privāta apakšpoga1_klikšķis (_. ByVal sūtītājs kā sistēma. Objekts, _. ByVal e As System. EventArgs) _. Rokturi Button1.Click. '1. poga Skaidrs masīvs. Dim kā vesels skaitlis. Ja a = 1 līdz 4. LabelArray (a) .Text = "" Nākamais. Beigas apakš. Privāta apakšpoga2_klikšķis (_. ByVal sūtītājs kā sistēma. Objekts, _. ByVal e As System. EventArgs) _. Rokturi Poga2.Noklikšķiniet. 2. poga Aizpildiet masīvu. Dim kā vesels skaitlis. Ja a = 1 līdz 4. LabelArray (a) .Teksts = _. "Kontroles masīvs" un CStr (a) Nākamais. Beigas apakš. Beigu klase
Eksperimentējot ar šo kodu, jūs atklāsit, ka papildus etiķešu rekvizītu iestatīšanai jūs varat arī izsaukt metodes. Tātad, kāpēc man (un Microsoft) bija visas nepatikšanas, lai raksta I daļā izveidotu “neglīto” kodu?
Man nepiekrīt, ka tas tiešām ir “vadības bloks” klasiskajā VB izpratnē. Vadības bloks VB 6 ir VB 6 sintakses atbalstīta daļa, nevis tikai tehnika. Faktiski varbūt veids, kā aprakstīt šo piemēru, ir tas, ka tas ir vadības bloks, nevis vadības masīvs.
I daļā es sūdzējos, ka Microsoft piemērs TIKAI darbojās izpildes laikā, nevis projektēšanas laikā. Varat dinamiski pievienot un izdzēst vadīklas no veidlapas, taču visa lieta ir jāievieš kodā. Nevar vilkt un nomest vadīklas, lai tās izveidotu tāpat kā VB 6. Šis piemērs darbojas galvenokārt projektēšanas laikā, nevis izpildes laikā. Darbības laikā nevar dinamiski pievienot un izdzēst vadīklas. Savā ziņā tas ir pilnīgi pretstats I daļas piemēram.
Klasiskais VB 6 vadības masīva piemērs ir tas pats, kas tiek ieviests VB .NET kodā. Šeit ir VB 6 kods (tas ir ņemts no Mezick & Hillier, Visual Basic 6 sertifikācijas eksāmena rokasgrāmata, 206. lpp. - nedaudz modificēts, jo grāmatas piemērs rada vadības ierīces, kuras nevar redzēt):
Dim MyTextBox kā VB.TextBox. Statisks intNumber kā vesels skaitlis. intNumber = intNumber + 1. Iestatīt MyTextBox = _. Es. Kontroles. Pievienot ("VB.TextBox", _. "Teksts" un intNumber) MyTextBox. Teksts = MyTextBox. Vārds. MyTextBox. Redzams = patiess. MyTextBox. Kreisais = _. (intNumber - 1) * 1200
Bet, kā piekrīt Microsoft (un es), VB.NET nav iespējami VB 6 vadības bloki. Tātad labākais, ko varat darīt, ir dublēt funkcionalitāti. Mans raksts dublēja Mezick & Hillier piemērā atrodamo funkcionalitāti. Pētījuma grupas kods atkārto rekvizītus un izsaukšanas metodes.
Tātad vissvarīgākais ir tas, ka tas tiešām ir atkarīgs no tā, ko vēlaties darīt. VB.NET nav visa lieta iesaiņota kā valodas daļa - vēl -, bet galu galā tā ir daudz elastīgāka.
Džona Fannon filma “Pārņem kontroles masīvus”
Džons rakstīja: Man vajadzēja vadības blokus, jo es gribēju izpildes laikā veidlapā ievietot vienkāršu skaitļu tabulu. Es negribēju nelabumu, ievietojot tos visus individuāli, un es gribēju izmantot VB.NET. Microsoft piedāvā ļoti detalizētu vienkāršas problēmas risinājumu, taču tas ir ļoti liels kaulais, lai uzlauztu ļoti mazu uzgriezni. Pēc dažiem eksperimentiem es beidzot nonācu pie risinājuma. Lūk, kā es to izdarīju.
Iepriekš parādītais piemērs Par Visual Basic parāda, kā veidlapas tekstu var izveidot, izveidojot instanci objekta iestatīšana, rekvizītu iestatīšana un pievienošana kontroļu kolekcijai, kas ir veidlapas daļa objekts.
Blāvi txtDataShow As New TextBox
txtDataShow. Augstums = 19
txtDataShow. Platums = 80
txtDataShow. Atrašanās vieta = Jauns punkts (X, Y)
Es. Kontroles. Pievienot (txtDataShow)
Lai arī Microsoft risinājums rada klasi, es argumentēju, ka to visu būs iespējams ietīt apakšprogrammā. Katru reizi, kad izsaucat šo apakšprogrammu, veidlapā izveidojat jaunu tekstlodziņa eksemplāru. Šeit ir pilns kods:
Sabiedriskās klases forma1
Mantojumu sistēma. Windows. Veidlapas. Forma
#Regions "Windows Form Designer ģenerēts kods"
Privāts sub BtnStart_Click (_
ByVal sūtītājs kā sistēma. Objekts, _
ByVal e As System. EventArgs) _
Rokturi btnStart. Klikšķis
Dim I kā vesels skaitlis
Dim sData As String
I = 1 līdz 5
sData = CStr (I)
Zvanīt AddDataShow (sData, I)
Nākamais
Beigas apakš
Sub AddDataShow (_
ByVal sText As String, _
ByVal I kā vesels skaitlis)
Blāvi txtDataShow As New TextBox
Dim UserLft, UserTop as Integer
Dim X, Y kā vesels skaitlis
UserLft = 20
UserTop = 20
txtDataShow. Augstums = 19
txtDataShow. Platums = 25
txtDataShow. TextAlign = _
Horizontālais izkārtojums. Centrs
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Teksts = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Augstums
txtDataShow. Atrašanās vieta = Jauns punkts (X, Y)
Es. Kontroles. Pievienot (txtDataShow)
Beigas apakš
Beigu klase
Ļoti labs punkts, Džon. Tas noteikti ir daudz vienkāršāk nekā Microsoft kods... tāpēc es domāju, kāpēc viņi uzstāja, lai to izdarītu šādi?
Lai sāktu izmeklēšanu, mēģināsim mainīt vienu no īpašuma piešķīrumiem kodā. Mainīsimies
txtDataShow. Augstums = 19
uz
txtDataShow. Augstums = 100
tikai, lai pārliecinātos, ka pastāv ievērojama atšķirība.
Atkal palaižot kodu, mēs saņemam... Whaaaat??? tas pats. Nekādas izmaiņas. Faktiski vērtību var parādīt ar paziņojumu, piemēram, MsgBox (txtDataShow. Augstums), un jūs joprojām saņemat 20 kā īpašuma vērtību neatkarīgi no tā, ko jūs tam piešķirat. Kāpēc tas notiek?
Atbilde ir tāda, ka mēs nedomājam par savu klasi, lai izveidotu objektus, bet mēs vienkārši pievienojam lietas citai klasei, tāpēc mums jāievēro otras klases noteikumi. Šie noteikumi nosaka, ka jūs nevarat mainīt rekvizītu Augstums. (Wellllll... jūs varat. Ja maināt daudzrindu rekvizītu uz True, tad varat mainīt Height.)
Kāpēc VB.NET iet uz priekšu un izpilda kodu, pat nekautrējoties, ka varētu būt kaut kas nepareizs, ja patiesībā tas pilnīgi ignorē jūsu paziņojumu, ka tas ir vesels sašutums. Es tomēr varētu ieteikt vismaz brīdinājumu kompilācijā. (Mājiens! Mājiens! Mājiens! Vai Microsoft klausās?)
I daļas piemērs tiek mantots no citas klases, un tas padara īpašumus pieejamus mantotājas klases kodam. Šajā piemērā mainot rekvizītu Augstums uz 100, mēs iegūstam gaidītos rezultātus. (Atkal... viena atruna: izveidojot jaunu liela etiķetes komponenta gadījumu, tas sedz veco. Lai faktiski redzētu jaunos Label komponentus, jums jāpievieno metodes izsaukums aLabel. Novietot priekšā().)
Šis vienkāršais piemērs rāda, ka, kaut arī VARAM objektus vienkārši pievienot citai klasei (un dažreiz tas ir pareizi jādara), objektu vadības programmēšana pieprasa, lai mēs tos atvasinātu klasē, un visorganizētākā veidā (uzdrošinos teikt: .NET veids "?) jaunajā atvasinātajā klasē ir jāveido rekvizīti un metodes, lai mainītos lietas. Džons sākumā palika nepārliecināts. Viņš sacīja, ka jaunā pieeja ir piemērota viņa mērķim, kaut arī pastāv ierobežojumi, lai tā nebūtu “COO” (pareizi orientēta uz objektu). Tomēr nesen Jānis rakstīja:
"... pēc 5 tekstlodziņu kopas ierakstīšanas izpildlaikā es vēlējos atjaunināt datus nākamajā programmas daļā - bet nekas nemainījās - sākotnējie dati joprojām bija.
Es atklāju, ka es varētu novērst šo problēmu, uzrakstot kodu, lai noņemtu vecās kastes un atkal ievietotu tos ar jauniem datiem. Labāks veids, kā to izdarīt, būtu izmantot Mani. Atjaunot. Bet šī problēma ir pievērsusi manu uzmanību nepieciešamībai nodrošināt metodi, lai atņemtu tekstlodziņus, kā arī tos pievienotu. "
Jāņa kods izmantoja globālo mainīgo, lai izsekotu, cik daudz kontrolei tika pievienoti veidlapa, tātad metode ...
Privāta apakšforma1_lodze (_
ByVal sūtītājs kā sistēma. Objekts, _
ByVal e As System. EventArgs) _
Rokturi MyBase. Slodze
CntlCnt0 = Es. Kontroles. Grāfs
Beigas apakš
Tad "pēdējo" vadību varētu noņemt ...
N = Es. Kontroles. Skaits - 1
Es. Kontroles. NoņemtAt (N)
Jānis atzīmēja, ka "varbūt tas ir mazliet neveikli".
Tas ir veids, kā Microsoft seko objektiem COM UN viņu “neglītā” piemēra kodā iepriekš.
Tagad esmu atgriezies pie problēmas, kas saistītas ar dinamisku veidlapas vadības izveidošanu izpildes laikā, un es atkal esmu apskatījis rakstus “Kas notika, lai kontrolētu masīvu”.
Esmu izveidojis klases un tagad varu kontrolierīces novietot formā tā, kā es vēlos, lai tās būtu.
Jānis demonstrēja, kā kontrolēt vadības ierīču izvietošanu grupas kastē, izmantojot jaunās klases, kuras viņš ir sācis lietot. Varbūt galu galā Microsoft bija pareizi viņu "neglītajā" risinājumā!