A vezérlő tömbök elhagyása a VB.NET-ből kihívást jelent azok számára, akik a tömbökről tanítanak.
- Többé nem lehetséges egy vezérlőegység, például egy szövegdoboz lemásolása, majd beillesztése (egyszer vagy többször) egy vezérlőtömb létrehozásához.
- A VB.NET kód a vezérlő tömbhöz hasonló struktúra létrehozásához az összes VB.NET-en található könyvben, amelyet megvásároltam és online, sokkal hosszabb és sokkal összetettebb. Hiányzik a VB6-ban található vezérlő tömb kódolásának egyszerűsége.
Ha a VB6 kompatibilitási könyvtárra hivatkozik, ott vannak olyan objektumok, amelyek nagyjából úgy működnek, mint a vezérlő tömbök. Ha látni szeretném, egyszerűen használja a VB.NET frissítővarázslót egy vezérlőtömböt tartalmazó programmal. A kód ismét csúnya, de működik. A rossz hír az, hogy a Microsoft nem garantálja, hogy a kompatibilitási komponensek továbbra is támogatottak lesznek, és nem szabad, hogy ezeket használja.
A "vezérlő tömbök" létrehozására és használatára szolgáló VB.NET kód sokkal hosszabb és sokkal összetettebb.
A Microsoft szerint ahhoz, hogy valamit a VB 6-hoz hasonlóan elvégezzen, létre kell hoznia egy "egyszerű összetevőt, amely megismétli a vezérlő tömb funkcióit".
Ehhez egy új osztályra és egy fogadó űrlapra is szükség van. Az osztály új címkéket hoz létre és elpusztít. A teljes osztály kódja a következő:
Public Class LabelArray
Örököli a rendszert. Gyűjtemények. CollectionBase
Privát readOnly HostForm As _
Rendszer. Ablakok. Formákat. Forma
AddNewLabel () nyilvános funkció
Mint rendszer. Ablakok. Formákat. Címke
Hozzon létre egy új példányt a Címke osztályból.
Dim aLabel mint új rendszer. Ablakok. Formákat. Címke
"Adja hozzá a címkét a kollekcióhoz
belső lista.
Nekem. Lista. Hozzáadás (aLabel)
'Adja hozzá a címkét a Vezérlők gyűjteményhez
a HostForm mezőben hivatkozott űrlap "pontja.
HostForm. Controls. Hozzáadás (aLabel)
'Beállíthatja a Címke objektum belső tulajdonságait.
aLabel. Felső = gróf * 25
aLabel. Szélesség = 50
aLabel. Balra = 140
aLabel. Tag = Me. Számol
aLabel. Szöveg = "Címke" és én. Számol. toString
Vissza aLabel
Vége funkció
Nyilvános al új (_
ByVal host As System. Ablakok. Formákat. Forma)
HostForm = host
Nekem. AddNewLabel ()
Befejezés Sub
Alapértelmezett nyilvános readOnly tulajdon _
Elem (ByVal index egész számként) mint _
Rendszer. Ablakok. Formákat. Címke
Kap
Vissza CType (Me. Lista. Tétel (index), _
Rendszer. Ablakok. Formákat. Címke)
End Get
Végtulajdon
Nyilvános al eltávolítása ()
'Ellenőrizze, hogy van-e címke, amelyet eltávolíthat.
Ha én. Count> 0 Akkor
'Távolítsa el a tömbbe hozzáadott utolsó címkét
'a gazdagép-vezérlők gyűjteményéből.
'Vegye figyelembe az alapértelmezett tulajdonság használatát a
'a tömb elérése.
HostForm. Controls. Eltávolítás (Me (Me. Gróf - 1))
Nekem. Lista. RemoveAt (Me. Gróf - 1)
Vége If
Befejezés Sub
Végkategória
Annak szemléltetése érdekében, hogy ezt az osztálykódot hogyan használják, létrehozhat egy űrlapot, amely azt hívja. Az alább látható kódot kell használnia az űrlapon:
Nyilvános osztály1. Örököli a rendszert. Ablakok. Formákat. Forma. #Region "Windows Form Designer által generált kód" 'Szintén hozzá kell adnia a következő nyilatkozatot:' MyControlArray = New LabelArray (Me) "az InitializeComponent () hívás után a. 'rejtett régiókód. 'Nyisson meg egy új ButtonArray objektumot. Dim MyControlArray mint LabelArray. Privát sub btnLabelAdd_Click (_. A ByVal feladó mint rendszer. Tárgy, _. ByVal e As rendszer. EventArgs) _. A btnLabelAdd kezeli. Kattintson. Hívja az AddNewLabel módszert. 'MyControlArray. MyControlArray. AddNewLabel () 'Módosítsa a BackColor tulajdonságot. 'gombra. MyControlArray (0) .BackColor = _. Rendszer. Rajz. Szín. Piros. Befejezés Sub. Privát Sub btnLabelRemove_Click (_. A ByVal feladó mint rendszer. Tárgy, _. ByVal e As rendszer. EventArgs) _. A btnLabelRemove kezeli. Kattintson. 'Hívja a MyControlArray eltávolítási módszerét. MyControlArray. Távolítsuk el () Befejezés Sub. Végkategória
Először is, ez még azt a feladatot sem látja el a Design Time-n, mint ahogy a VB 6-ban használtuk! Másodszor, nem tömbben vannak, hanem egy VB.NET gyűjteményben vannak - sokkal más dolog, mint tömb.
A VB.NET nem támogatja a VB 6 "vezérlő tömbjét", mert nincs olyan, mint egy "vezérlő" "tömb" (jegyezze meg az idézőjelek változását). A VB 6 gyűjteményt készít a színfalak mögött, és tömbként jeleníti meg a fejlesztő számára. De ez nem tömb, és az IDE-n keresztül biztosított funkciókon túl kevés ellenőrzést gyakorol felette.
A VB.NET viszont azt nevezi, ami az: tárgyak gyűjteménye. És átadják a királyság kulcsait a fejlesztõnek azáltal, hogy az egészet szabadban elkészítik.
Például az előnyök fajtájára, amelyet ez ad a fejlesztőnek, a VB 6-ban a vezérlőknek azonos típusúaknak és azonos nevűnek kellett lenniük. Mivel ezek csak a VB.NET objektumai, különféle típusokat készíthet, különféle neveket adhat nekik, és ugyanabban az objektumgyűjteményben kezelheti őket.
Ebben a példában ugyanaz a kattintási esemény kezeli a két gombot és a jelölőnégyzetet, és megjeleníti, hogy melyikre kattintottak. Csináld ezt egy kódsorban a VB 6-tal!
Privát Sub MixedControls_Click (_
A ByVal feladó mint rendszer. Tárgy, _
ByVal e As rendszer. EventArgs) _
Fogantyúk Button1.Click, _
But2.2.Click, _
CheckBox1.Click
Az alábbi állításnak egy hosszú állításnak kell lennie!
- Itt négy vonalon van, hogy szűk maradjon
"elég ahhoz, hogy elférjen egy weboldalon
Label2.Text =
Microsoft. VisualBasic. Jobb (feladó. GetType. toString,
Len (feladó. GetType. ToString) -
(InStr (feladó. GetType. ToString, "Forms") + 5))
Befejezés Sub
Az alszál számítása valamilyen bonyolult, de nem igazán erről beszélünk. Bármit megtehetsz a Click eseményen. Használhatja például a vezérlés típusát egy If utasításban, hogy különféle dolgokat hajtson végre a különféle vezérlőkhöz.
Frank számítástechnikai tanulmányozó csoportjának visszajelzése a tömbökről
Frank tanulmányozó csoportja példát adott egy négy címkével és 2 gombbal ellátott űrlapra. Az 1. gomb törli a címkéket, és a 2. gomb kitölti azokat. Jó ötlet újra elolvasni Frank eredeti kérdését, és észrevenni, hogy az általa alkalmazott példa egy olyan hurok volt, amelyet egy címkeelemek tömbének Caption tulajdonságának törlésére használnak. Itt található a VB 6 kód VB.NET megfelelője. Ez a kód azt teszi, amit Frank eredetileg kért!
Nyilvános osztály1. Örököli a rendszert. Ablakok. Formákat. Forma. #Region "Windows Form Designer által generált kód" Dim LabelArray (4) Címkeként. "deklarál egy sor címkét. Privát alform1_terhelés (_. A ByVal feladó mint rendszer. Tárgy, _. ByVal e As rendszer. EventArgs) _. A MyBase kezelője. Betöltés. SetControlArray () Befejezés Sub. Sub SetControlArray () LabelArray (1) = 1. címke. LabelArray (2) = Label2. LabelArray (3) = Label3. LabelArray (4) = Label4. Befejezés Sub. Privát algomb1_Kattintás (_. A ByVal feladó mint rendszer. Tárgy, _. ByVal e As rendszer. EventArgs) _. Fogantyúk Button1.Click. '1. gomb tiszta tömb. Dim a egész szám. A = 1-től 4-ig. LabelArray (a) .Text = "" Következő. Befejezés Sub. Privát algomb2_Click (_. A ByVal feladó mint rendszer. Tárgy, _. ByVal e As rendszer. EventArgs) _. Fogantyúk But2.2.Click. '2. gomb kitöltése tömb. Dim a egész szám. A = 1-től 4-ig. LabelArray (a) .Text = _. "Vezérlő tömb" és CStr (a) Következő. Befejezés Sub. Végkategória
Ha kísérletezik ezzel a kóddal, rájön, hogy a címkék tulajdonságainak beállításán kívül módszereket is hívhat. Tehát miért (és a Microsoft) mindazokkal a bajokkal küzdtem, amelyek a cikk I. részében felépítették a "Csúnya" kódot?
Nem értek egyet azzal, hogy ez valóban "vezérlő tömb" a klasszikus VB értelemben. A VB 6 vezérlő tömb a VB 6 szintaxisának támogatott része, nem csupán egy technika. Valójában a példa leírására talán az a mód, hogy a vezérlőelemek tömbje, nem pedig a vezérlő tömb.
Az I. részben azt kifogásoltam, hogy a Microsoft példája CSAK futási és nem tervezési időben működött. Dinamikusan hozzáadhat és törölhet vezérlőket egy űrlapból, de az egészet kódban kell végrehajtani. A vezérlők nem húzhatók úgy, hogy úgy hozzák létre őket, mint a VB 6-ban. Ez a példa elsősorban a tervezési és nem futási időben működik. A vezérlőelemeket dinamikusan nem adhatja hozzá és nem törölheti futás közben. Bizonyos értelemben ez az I. rész példájának teljes ellentéte.
A klasszikus VB 6 vezérlő tömb példája ugyanaz, mint a VB .NET kódban. Itt a VB 6 kódban (ez Mezick & Hillier-ből származik, Visual Basic 6 tanúsítási vizsga útmutató, 206. o. - kissé módosítva, mivel a könyvben szereplő példa olyan kontrollokat eredményez, amelyek nem láthatók):
Dim MyTextBox mint VB.TextBox. Statikus intNumber egész számként. intNumber = intNumber + 1. Állítsa be a MyTextBox = _ értéket. Nekem. Controls. Add ("VB.TextBox", _. "Szöveg" és intNumber) MyTextBox. Szöveg = MyTextBox. Név. MyTextBox. Látható = igaz. MyTextBox. Bal = _. (intNumber - 1) * 1200
De amint a Microsoft (és én) egyetértek, a VB 6 vezérlő tömbjei nem használhatók a VB.NET-ben. Tehát a lehető legjobban megismételheti a funkcionalitást. A cikk megismételte a Mezick és Hillier példában található funkciókat. A Study Group kód megismétli a tulajdonságok és a hívási módszerek beállításának funkcionalitását.
A lényeg tehát az, hogy valóban attól függ, mit akarsz tenni. A VB.NET nem egésze a nyelv részévé - mégis -, de végül sokkal rugalmasabb.
John Fannon átveszi az irányító tömböket
John azt írta: Vezérlő tömbökre volt szükség, mert egyszerű számjegyeket akartam tenni egy űrlapra futás közben. Nem akartam, hogy hányinger legyen az, hogy mindet külön-külön helyezzem el, és a VB.NET-et akartam használni. A Microsoft nagyon részletes megoldást kínál egy egyszerű probléma megoldására, de egy nagyon nagy kalapács az egy nagyon apró anya megtöréséhez. Néhány kísérlet után végül megoldást találtam. Így csináltam.
A fenti Visual Basic példa bemutatja, hogyan hozhat létre TextBox-ot egy űrlapon egy példány létrehozásával az objektum, a tulajdonságok beállítása és hozzáadása a Vezérlőelemek gyűjteményéhez, amely az űrlap része tárgy.
A txtDataShow mint új szövegdoboz tompítása
txtDataShow. Magasság = 19
txtDataShow. Szélesség = 80
txtDataShow. Hely = Új pont (X, Y)
Nekem. Controls. Hozzáadás (txtDataShow)
Bár a Microsoft megoldása osztályt hoz létre, azzal indokoltam, hogy mindezt helyette szubrutinba lehet csomagolni. Minden alkalommal, amikor meghívja ezt az alprogramot, létrehoz egy új példányt a szövegdobozban az űrlapon. Itt van a teljes kód:
Nyilvános osztály1
Örököli a rendszert. Ablakok. Formákat. Forma
#Region "Windows Form Designer által generált kód"
Privát Sub BtnStart_Click (_
A ByVal feladó mint rendszer. Tárgy, _
ByVal e As rendszer. EventArgs) _
A btnStart kezeli. kettyenés
Dim I mint egész
Dim sData mint karakterlánc
I = 1-től 5-ig
sData = CStr (I)
Hívja az AddDataShow (sData, I)
Következő
Befejezés Sub
Sub AddDataShow (_
ByVal sText mint karakterlánc, _
ByVal I egész szám)
A txtDataShow mint új szövegdoboz tompítása
Dim UserLft, UserTop As Integer
Dim X, Y egész szám
UserLft = 20
UserTop = 20
txtDataShow. Magasság = 19
txtDataShow. Szélesség = 25
txtDataShow. TextAlign = _
Vízszintes igazítás. Központ
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Szöveg = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Magasság
txtDataShow. Hely = Új pont (X, Y)
Nekem. Controls. Hozzáadás (txtDataShow)
Befejezés Sub
Végkategória
Nagyon jó pont, John. Ez minden bizonnyal sokkal egyszerűbb, mint a Microsoft-kód... tehát kíváncsi vagyok, miért ragaszkodtak ehhez?
A vizsgálat megkezdéséhez próbáljuk megváltoztatni a kód egyik tulajdonság-hozzárendelését. Változtassunk
txtDataShow. Magasság = 19
nak nek
txtDataShow. Magasság = 100
csak annak érdekében, hogy megbizonyosodjon arról, hogy van-e észrevehető különbség.
Amikor újra futtatjuk a kódot, megkapjuk... Whaaaat??? ... ugyanaz a dolog. Egyáltalán nincs változás. Valójában megjelenítheti az értéket egy olyan nyilatkozattal, mint a MsgBox (txtDataShow. Magasság), és továbbra is 20 lesz az ingatlan értéke, függetlenül attól, hogy mit rendel hozzá. Miért történik ez?
A válasz az, hogy nem a saját osztályunkból származunk, hogy megteremtsük az objektumokat, hanem csak hozzáadunk dolgokat egy másik osztályhoz, tehát be kell tartanunk a másik osztály szabályait. És ezek a szabályok kimondják, hogy a Magasság tulajdonságot nem lehet megváltoztatni. (Wellllll... tudsz. Ha a Többvonalas tulajdonságot True értékre változtatja, akkor megváltoztathatja a magasságot is.)
Miért halad előre a VB.NET és futtatja a kódot, anélkül, hogy még azt is ordítaná, hogy lehet, hogy valami nincs rendben, ha valójában teljesen figyelmen kívül hagyja, hogy az állításod egy egész „megrontó megjegyzés”. Ugyanakkor javasolhatnék legalább egy figyelmeztetést a fordításban. (Célzás! Célzás! Célzás! Figyeli a Microsoft?)
Az I. részből származó példa egy másik osztálytól örököl, és ez a tulajdonságokat az öröklő osztályban lévő kód számára elérhetővé teszi. Ha a Height tulajdonságot 100-ra változtatjuk ebben a példában, akkor megkapjuk a várt eredményeket. (Újra... egy nyilatkozat: Ha egy nagy címkekomponens új példányát hozza létre, akkor lefedi a régi. Az új Label összetevők valódi megtekintéséhez hozzá kell adnia az aLabel metódushívást. Előre hoz().)
Ez az egyszerű példa azt mutatja, hogy bár objektumokat egyszerűen hozzáadhatunk egy másik osztályhoz (és néha ez a helyes lépés), az objektumok feletti programozási irányítás megköveteli, hogy egy osztályból származtassuk őket, és a legszerveztebb módon (merem mondani, hogy ".NET módszer" ??) tulajdonságok és módszerek létrehozása az új származtatott osztályban a megváltoztatáshoz dolgokat. John eleinte nem volt meggyőződve. Azt mondta, hogy új megközelítése megfelel a céljainak, annak ellenére, hogy vannak korlátozások attól, hogy nem "COO" (helyesen irányított objektum) legyen. A közelmúltban azonban John írta:
"... Miután 5 futtatott időn belül 5 szövegdobozt írtam, frissíteni akartam az adatokat a program következő részében - de semmi sem változott - az eredeti adatok továbbra is megmaradtak.
Megállapítottam, hogy megkerülhetem a problémát azáltal, hogy kódot írok a régi dobozok levételéhez és új adatokkal való visszahelyezéséhez. Ennek jobb módja az, ha Me-et használunk. Frissítés. Ez a probléma felhívta a figyelmemet arra, hogy módszert kell biztosítani a szövegdobozok kivonására és hozzáadására. "
John kódja egy globális változót használt annak nyomon követésére, hogy hány vezérlőt adtak az űrlaphoz, tehát egy módszer ...
Privát alform1_terhelés (_
A ByVal feladó mint rendszer. Tárgy, _
ByVal e As rendszer. EventArgs) _
A MyBase kezelője. Betöltés
CntlCnt0 = Me. Controls. Számol
Befejezés Sub
Akkor az "utolsó" vezérlő eltávolítható ...
N = én. Controls. Gróf - 1
Nekem. Controls. RemoveAt (N)
John megjegyezte, hogy "talán ez kissé ügyetlen".
A Microsoft így követi nyomon az objektumokat a COM ÉS a fenti "csúnya" példakódban.
Most visszatértem a űrlapon futás közbeni dinamikus létrehozás problémájához, és újra megvizsgáltam a "Mi történt a tömbök vezérlése" cikkeket.
Készítettem az osztályokat, és most a vezérlőket rátehetem az űrlapra úgy, ahogy szeretném.
John bemutatta, hogyan lehet ellenőrizni a vezérlőelemek elhelyezését egy csoportdobozban az új osztályok segítségével, amelyeket már elkezdett használni. Lehet, hogy végül is a Microsoftnak volt igaza a "csúnya" megoldásukban!