VB.NET: Dizileri Kontrol Etmek İçin Neler Oldu

VB.NET'ten kontrol dizilerinin ihmal edilmesi, diziler hakkında eğitim verenler için bir zorluktur.

  • Artık metin kutusu gibi bir denetimi kopyalamak ve ardından bir kontrol dizisi oluşturmak için (bir veya birkaç kez) yapıştırmak mümkün değildir.
  • Bir kontrol dizisine benzer bir yapı oluşturmak için VB.NET kodu, VB.NET'te satın aldığım ve çevrimiçi olarak aldığım tüm kitaplarda, çok daha uzun ve çok daha karmaşıktı. VB6'da bulunan bir kontrol dizisini kodlamanın basitliğinden yoksundur.

VB6 uyumluluk kitaplığına başvurursanız, kontrol dizilerine çok benzeyen nesneler vardır. Ne demek istediğimi görmek için, VB.NET yükseltme sihirbazını bir kontrol dizisi içeren bir programla kullanın. Kod yine çirkin, ama çalışıyor. Kötü haber, Microsoft'un uyumluluk bileşenlerinin desteklenmeye devam edeceğini garanti etmeyeceği ve bunları kullanmamanız gerektiğidir.

"Kontrol dizileri" oluşturmak ve kullanmak için VB.NET kodu çok daha uzun ve çok daha karmaşıktır.

Microsoft'a göre, VB 6'da yapabileceklerinize yakın bir şey yapmak için "kontrol dizisi işlevini kopyalayan basit bir bileşen" oluşturulması gerekir.

instagram viewer

Bunu göstermek için hem yeni bir sınıfa hem de bir barındırma formuna ihtiyacınız var. Sınıf aslında yeni etiketler yaratır ve yok eder. Sınıf kodunun tamamı aşağıdaki gibidir:

Genel Sınıf LabelArray
Sistemi devralır. Koleksiyonlar. CollectionBase
Özel ReadOnly HostForm As _
Sistemi. Pencereler. Formlar. Form
Genel İşlev AddNewLabel () _
Sistem olarak. Pencereler. Formlar. Etiket
'Label sınıfının yeni bir örneğini oluşturun.
Dim aLabel Yeni Sistem Olarak. Pencereler. Formlar. Etiket
'Etiketi koleksiyona ekle
'dahili liste.
Ben mi. Liste. Ekle (aLabel)
'Etiketi Denetimler koleksiyonuna ekleme
HostForm alanı tarafından başvurulan Form '.
HostForm. Kontroller. Ekle (aLabel)
'Label nesnesi için intial özellikleri ayarlayın.
bir etiket. Üst = Sayı * 25
bir etiket. Genişlik = 50
bir etiket. Sol = 140
bir etiket. Etiket = Ben. Miktar
bir etiket. Metin = "Etiket" ve Ben. Miktar. ToString
Etiket dön
Bitiş Fonksiyonu
Herkese Açık Alt Yeni (_
ByVal host As Sistemi. Pencereler. Formlar. Form)
HostForm = ana bilgisayar
Ben mi. AddNewLabel ()
End Sub
Varsayılan Genel ReadOnly Özelliği _
Öğe (ByVal Dizini Tamsayı Olarak) _ Olarak
Sistemi. Pencereler. Formlar. Etiket
Almak
CType'a (Me. List. Öğe (Dizin), _
Sistemi. Pencereler. Formlar. Etiket)
Son Alın
Son Özellik
Genel Alt Kaldır ()
'Kaldırılacak bir Etiket olduğundan emin olun.
Eğer ben. Sayı> 0 Sonra
'Diziye eklenen son Etiketi kaldır
'ana bilgisayar formundan koleksiyonu kontrol eder.
'Varsayılan özelliğin
'diziye erişiyor.
HostForm. Kontroller. Kaldır (Me (Me. Sayım - 1))
Ben mi. Liste. RemoveAt (Me. Sayısı - 1)
End If
End Sub
Bitiş Sınıfı

Bu sınıf kodunun nasıl kullanılacağını göstermek için kodu çağıran bir Form oluşturabilirsiniz. Aşağıda gösterilen kodu formda kullanmanız gerekir:

Genel Sınıf Formu 1. Sistemi devralır. Pencereler. Formlar. Form. #Bölge "Windows Form Designer tarafından oluşturulan kod" 'Ayrıca şu ifadeyi de eklemelisiniz:' MyControlArray = Yeni LabelArray (Me) 'in InitializeComponent () çağrısından sonra. 'gizli Bölge kodu. 'Yeni bir ButtonArray nesnesi bildirin. MyControlArray Etiket Etiketi Dim. Özel Alt btnLabelAdd_Click (_. ByVal gönderici As System. Nesne, _. ByVal e As Sistemi. EventArgs) _. BtnLabelAdd öğelerini işler. Tıklayın. 'AddNewLabel yöntemini çağırın. 'MyControlArray. MyControlArray. AddNewLabel () 'BackColor özelliğini değiştirin. 0 tuşuna basın. MyControlArray (0) .BackColor = _. Sistemi. Çizim. Renk. Kırmızı. End Sub. Özel Alt btnLabelRemove_Click (_. ByVal gönderici As System. Nesne, _. ByVal e As Sistemi. EventArgs) _. BtnLabelRemove işlevini kullanır. Tıklayın. 'MyControlArray öğesinin Remove yöntemini çağırın. MyControlArray. Kaldırmak() End Sub. Bitiş Sınıfı

Birincisi, bu Tasarım Zamanında işi VB 6'da yaptığımız gibi bile yapmıyor! İkincisi, bir dizide değil, bir VB.NET Koleksiyonunda - bir diziden çok farklı bir şey.

VB.NET'in VB 6 "kontrol dizisini" desteklememesinin nedeni, "kontrol" "dizisi" diye bir şey olmamasıdır (tırnak işaretlerinin değişmesine dikkat edin). VB 6, sahne arkasında bir koleksiyon oluşturur ve geliştiriciye bir dizi olarak görünmesini sağlar. Ancak bu bir dizi değildir ve IDE aracılığıyla sağlanan işlevlerin ötesinde çok az kontrole sahipsiniz.

Öte yandan VB.NET ona ne olduğunu söyler: bir nesne koleksiyonu. Ve her şeyi açıkta yaratarak krallığın anahtarlarını geliştiriciye teslim ediyorlar.

Bunun geliştiriciye sağladığı avantajların bir örneği olarak, VB 6'da kontroller aynı tipte olmalı ve aynı isme sahip olmalıydı. Bunlar sadece VB.NET'teki nesneler olduğundan, onları farklı türler yapabilir ve farklı adlar verebilir ve yine de aynı nesne koleksiyonunda yönetebilirsiniz.

Bu örnekte, aynı Click olayı iki düğmeyi ve bir onay kutusunu işler ve hangisinin tıklandığını görüntüler. Bunu VB 6 ile bir kod satırında yapın!

Özel Alt MixedControls_Click (_
ByVal gönderici As System. Nesne, _
ByVal e As Sistemi. EventArgs) _
Kol Düğmesi 1. Tıkla, _
Düğme2. Tıklayın, _
CheckBox1.Click
'Aşağıdaki ifade uzun bir açıklama olmalı!
`` Dar tutmak için dört satır var
'bir web sayfasına sığacak kadar
Label2.Text =
Microsoft. Visual Basic. Doğru (gönderen. GetType. ToString
Len (gönderen. GetType. ToString) -
(InStr (gönderen. GetType. ToString, "Formlar") + 5))
End Sub

Alt dize hesaplaması biraz karmaşıktır, ancak burada gerçekten bahsettiğimiz şey değildir. Tıklama etkinliğinde herhangi bir şey yapabilirsiniz. Örneğin, farklı denetimler için farklı şeyler yapmak üzere bir If deyimindeki denetimin Türünü kullanabilirsiniz.

Frank'in Bilgi İşlem Çalışmaları Grubu Dizilerle İlgili Geri Bildirim

Frank'in Çalışma Grubu, 4 etiket ve 2 düğme içeren bir formla örnek verdi. Düğme 1 etiketleri temizler ve Düğme 2 bunları doldurur. Frank'in orijinal sorusunu tekrar okumak ve kullandığı örneğin bir dizi Label bileşeninin Caption özelliğini temizlemek için kullanılan bir döngü olduğunu fark etmek iyi bir fikirdir. İşte bu VB 6 kodunun VB.NET eşdeğeri. Bu kod Frank'in asıl istediği şeyi yapar!

Genel Sınıf Formu 1. Sistemi devralır. Pencereler. Formlar. Form. #Bölge "Windows Form Designer tarafından oluşturulan kod" Etiket Olarak Sönük LabelArray (4). bir etiket dizisi bildirir. Özel Alt Form1_Yol (_. ByVal gönderici As System. Nesne, _. ByVal e As Sistemi. EventArgs) _. MyBase'i işler. Yük. SetControlArray () End Sub. Alt SetControlArray () LabelArray (1) = Etiket1. LabelArray (2) = Etiket2. LabelArray (3) = Etiket3. LabelArray (4) = Etiket4. End Sub. Özel Alt Düğmesi1_ tıklayın (_. ByVal gönderici As System. Nesne, _. ByVal e As Sistemi. EventArgs) _. Düğme 1. 'Düğme 1 Diziyi Sil. Bir Tamsayı Dim. A = 1 ila 4 için. LabelArray (a) .Text = "" Sonraki. End Sub. Özel Alt Düğmesi2_ tıklayın (_. ByVal gönderici As System. Nesne, _. ByVal e As Sistemi. EventArgs) _. Düğme2. Kolları. 'Düğme 2 Doldurma Dizisi. Bir Tamsayı Dim. A = 1 ila 4 için. LabelArray (a) .Text = _. "Kontrol Dizisi" ve CStr (a) Sonraki. End Sub. Bitiş Sınıfı

Bu kodu denerseniz, Etiketlerin özelliklerini ayarlamaya ek olarak yöntemleri de çağırabileceğinizi keşfedeceksiniz. Peki neden (ve Microsoft) makalenin I. Bölümünde "Çirkin" kodunu oluşturmak için tüm sorunlara gittim?

Bunun klasik VB anlamında gerçekten bir "Kontrol Dizisi" olduğuna katılmam gerekiyor. VB 6 Kontrol Dizisi, VB 6 sözdiziminin desteklenen bir parçasıdır, sadece bir teknik değildir. Aslında, bu örneği tanımlamanın yolu, bir Kontrol Dizisi değil, bir kontrol dizisi olmasıdır.

Bölüm I'de Microsoft örneğinin SADECE tasarım zamanında değil, çalışma zamanında çalıştığından şikayet ettim. Bir forma dinamik olarak denetimler ekleyebilir ve silebilirsiniz, ancak her şeyin kod içinde uygulanması gerekir. VB 6'da olduğu gibi oluşturmak için kontrolleri sürükleyip bırakamazsınız. Bu örnek, çalışma zamanında değil, esas olarak tasarım zamanında çalışır. Çalışma zamanında denetimleri dinamik olarak ekleyemez ve silemezsiniz. Bir bakıma, Bölüm I örneğinin tam tersidir.

Klasik VB 6 kontrol dizisi örneği, VB .NET kodunda uygulananla aynıdır. Burada VB 6 kodunda (bu Mezick & Hillier'den alınmıştır, Visual Basic 6 Sertifika Sınavı Kılavuzu, p 206 - biraz değiştirildi, çünkü kitaptaki örnek görülemeyen kontrollerle sonuçlanıyor):

MyTextBox'ı VB.TextBox olarak azaltın. Tam sayı olarak statik intNumber. intNumber = intNumber + 1. MyTextBox = _ ayarını yapın. Ben mi. Kontroller. Ekle ("VB.TextBox", _. "Metin" ve intNumarası) MyTextBox. Metin = MyTextBox. Adı. MyTextBox. Görünür = Doğru. MyTextBox. Sol = _. (intNumarası - 1) * 1200

Ancak Microsoft'un (ve benim) kabul ettiği gibi VB.NET'te VB 6 denetim dizileri mümkün değildir. Yapabileceğiniz en iyi şey işlevselliği çoğaltmaktır. Makalem Mezick & Hillier örneğinde bulunan işlevselliği çoğalttı. Çalışma Grubu kodu, özellikleri ve çağrı yöntemlerini ayarlayabilme işlevini çoğaltır.

Sonuç olarak, gerçekten ne yapmak istediğinize bağlı. VB.NET, dilin bir parçası olarak her şeye sahip değil - Yine de - ama sonuçta çok daha esnek.

John Fannon'un Kontrol Dizilerini Devralması

John şöyle yazdı: Kontrol dizilerine ihtiyacım vardı çünkü bir formun çalışma zamanında basit bir sayı tablosu koymak istedim. Hepsini tek tek yerleştirme bulantısını istemedim ve VB.NET kullanmak istedim. Microsoft, basit bir soruna çok ayrıntılı bir çözüm sunuyor, ancak çok küçük bir somunu kırmak çok büyük bir balyoz. Bazı deneylerden sonra, sonunda bir çözüm buldum. İşte böyle yaptım.

Yukarıdaki Visual Basic hakkında örnek, bir örnek oluşturarak Form üzerinde bir TextBox nasıl oluşturabileceğinizi gösterir, özellikleri ayarlama ve Formun bir parçası olan Denetimler koleksiyonuna ekleme nesne.

Dim txtDataShow Yeni Metin Kutusu Olarak Göster
txtDataShow. Yükseklik = 19
txtDataShow. Genişlik = 80
txtDataShow. Konum = Yeni Nokta (X, Y)
Ben mi. Kontroller. Ekle (txtDataShow)
Microsoft çözümü bir Sınıf oluştursa da, bunun yerine tüm bunları bir alt programa sarmanın mümkün olacağını düşündüm. Bu altyordamı her çağırdığınızda, form üzerinde metin kutusunun yeni bir örneğini oluşturursunuz. İşte kodun tamamı:

Genel Sınıf Formu1
Sistemi devralır. Pencereler. Formlar. Form

#Bölge "Windows Form Designer tarafından oluşturulan kod"

Özel Alt BtnStart_Click (_
ByVal gönderici As System. Nesne, _
ByVal e As Sistemi. EventArgs) _
BtnStart ile çalışır. Tıklayın

Dim I As Tamsayı
Dim sData As String
I = 1'den 5'e
sData = CStr (I)
AddDataShow'u (sData, I) çağırın
Sonraki
End Sub
Alt AddDataShow (_
ByVal sText As String, _
ByVal I As Integer)

Dim txtDataShow Yeni Metin Kutusu Olarak Göster
Dim UserLft, UserTop As Tamsayı
Dim X, Y Tamsayı Olarak
UserLft = 20
UserTop = 20
txtDataShow. Yükseklik = 19
txtDataShow. Genişlik = 25
txtDataShow. TextAlign = _
Yatay hizalama. merkez
txtDataShow. BorderStyle = _
BorderStyle. FixedSingle
txtDataShow. Metin = sText
X = UserLft
Y = UserTop + (I - 1) * txtDataShow. Yükseklik
txtDataShow. Konum = Yeni Nokta (X, Y)
Ben mi. Kontroller. Ekle (txtDataShow)
End Sub
Bitiş Sınıfı
Çok iyi bir nokta John. Bu kesinlikle Microsoft kodundan çok daha basit... neden bu şekilde yapmakta ısrar ettiklerini merak ediyorum?

Araştırmamıza başlamak için, koddaki özellik atamalarından birini değiştirmeyi deneyelim. Hadi değiştirelim

txtDataShow. Yükseklik = 19
için

txtDataShow. Yükseklik = 100
sadece fark edilir bir fark olduğundan emin olmak için.

Kodu tekrar çalıştırdığımızda... Whaaaat??? ... aynı şey. Hiçbir değişiklik yok. Aslında, değeri MsgBox (txtDataShow gibi bir deyimle görüntüleyebilirsiniz. Yükseklik) alırsanız ve mülkün değeri ne olursa olsun mülkün değeri olarak 20 elde edersiniz. Bu neden oluyor?

Cevap, nesneleri yaratmak için kendi Sınıfımızı türetmiyoruz, sadece başka bir Sınıf'a bir şeyler ekliyoruz, bu yüzden diğer sınıfın kurallarına uymalıyız. Ve bu kurallar Height özelliğini değiştiremeyeceğinizi belirtir. (Wellllll... yapabilirsin. Çok Satır özelliğini True olarak değiştirirseniz, Yüksekliği değiştirebilirsiniz.)

Neden VB.NET devam ediyor ve aslında bir ifadenin bütün bir 'kavrama olduğunu tamamen göz ardı ettiğinde yanlış bir şey olabilir bir whimper olmadan kodu yürütür. Ancak derlemede en azından bir uyarı önerebilirim. (İpucu! İpucu! İpucu! Microsoft dinliyor mu?)

Kısım I'deki örnek başka bir Sınıftan miras alır ve bu özellik miras Sınıfındaki kod için kullanılabilir özellikler sağlar. Bu örnekte Height özelliğini 100 olarak değiştirmek, bize beklenen sonuçları verir. (Tekrar... bir sorumluluk reddi beyanı: Büyük bir Label bileşeninin yeni bir örneği oluşturulduğunda, eskisini kapsar. Yeni Label bileşenlerini görmek için aLabel çağrısı yöntemini eklemeniz gerekir. Öne getirmek().)

Bu basit örnek, başka bir Sınıfa basitçe nesneler ekleyebilmemize (ve bazen bu yapılması gereken doğru şey), nesneler üzerindeki kontrolü programlamanın onları bir Sınıfta türetmemizi gerektirir ve en düzenli şekilde (cesaret, ".NET yolu" ???) değiştirmek için yeni türetilmiş Sınıf özellikleri ve yöntemleri oluşturmak için bir şeyler. John ilk başta ikna olmamıştı. Yeni yaklaşımının "COO" olmama konusunda sınırlamalar olsa da amacına uygun olduğunu söyledi (Doğru Nesneye Dayalı). Ancak daha yakın zamanlarda John şöyle yazdı:

"... Çalışma zamanında 5 metin kutusu kümesi yazdıktan sonra, programın sonraki bir bölümünde verileri güncellemek istedim - ama hiçbir şey değişmedi - orijinal veriler hala oradaydı.

Eski kutuları çıkarmak için kod yazarak ve yeni verilerle tekrar koyarak sorunu çözebileceğimi buldum. Bunu yapmanın daha iyi bir yolu Beni kullanmak olacaktır. Yenileyin. Ancak bu sorun, metin kutularını çıkarmak ve eklemek için bir yöntem sağlama ihtiyacına dikkatimi çekti. "

John'un kodu, forma kaç kontrol eklendiğini takip etmek için küresel bir değişken kullandı, böylece bir yöntem ...

Özel Alt Form1_Load (_
ByVal gönderici As System. Nesne, _
ByVal e As Sistemi. EventArgs) _
MyBase'i işler. Yük
CntlCnt0 = Ben. Kontroller. Miktar
End Sub

Sonra "son" kontrol kaldırılabilir ...

N = Ben. Kontroller. Sayı - 1
Ben mi. Kontroller. KaldırAt (N)
John, "belki bu biraz sakar."

Microsoft, COM ve yukarıdaki "çirkin" örnek kodundaki nesneleri izlemenin yoludur.

Şimdi çalışma sırasında bir form üzerinde dinamik olarak denetimler oluşturma sorununa geri döndüm ve yine 'Denetim Dizilerine Ne Oldu' makalelerine bakıyorum.

Sınıfları oluşturdum ve artık formları olmasını istediğim şekilde forma yerleştirebiliyorum.

John, kullanmaya başladığı yeni sınıfları kullanarak bir grup kutusuna kontrollerin yerleşimini nasıl kontrol edeceğini gösterdi. Belki de Microsoft "çirkin" çözümlerinde haklıydı!

instagram story viewer