Dynamiczne tworzenie komponentów (kontrolek)
na przykładzie aplikacji: zegar
Jednym z podstawowych elementów każdej aplikacji jest kontrolka, którą zazwyczaj dodaje się do formularza w widoku projektu. Dynamiczne tworzenie komponentów to dodawanie ich w trakcie działania naszej aplikacji. Poniżej zamieszczam fragment kodu odpowiedzialnego za dynamiczne dodawanie komponentu panel. Zmienne globalne utworzone na początku programu to m.in. tablice obiektów. Dzięki takiemu podejściu w łatwy sposób można odnaleźć utworzony wcześniej element.
Co jeszcze warto wiedzieć? Każdej nowo utworzonej kontrolce można ustawić nie tylko jej właściwość, ale też zdarzenie. Przykładowo komponent Button może mieć zdarzenia: Click, Keydown, Mousedown i wiele innych. Zdarzenia takie dodajemy w następujący sposób:
AddHandler Przycisk.Click, AddressOf kliknij_mnie
Gdzie Przycisk to nazwa kontrolki a kliknij_mnie procedura obsługująca zdarzenie kliknięcia. Analogicznie możemy usunąć uchwyt zdarzenia:
RemoveHandler Przycisk.Click, AddressOf kliknij_mnie
Załóżmy, że utworzyliśmy kolekcję 30 kontrolek typu Button zapisaną w tablicy o nazwie: but(30) As button. Fragment procedury tworzącej kontrolki mógłby wyglądać tak:
For i = 0 To 29
'Tworzymy nowy Button
but(i) = New Button
'W bloku With … End With ustalamy poszczególne właściwości komponentu
With but(i)
’Nazwa – but + wartości od 1 do 30. Format „D2 sprawia”, że dodane
‘jest zero wiodące, a więc nazwy będą wyglądały następująco:
‘but_01, but_02, … but_09, … but_30
.Name = „but” + (i + 1).ToString(“D2”)
. . .
‘Kolejne polecenia
. . .
End With
’Dodajemy adres obsługi zdarzenia Click
AddHandler but(i).Click, AddressOf klik
Next
Chcąc odczytać, w który przycisk kliknął użytkownik możemy posłużyć się np. poniższym przykładem.
Private Sub klik(sender As System.Object, e As System.EventArgs)
Dim nr As Integer = Int(Mid(sender.name, 3, 2)) – 1
End Sub
Nazwa przycisku zawsze będzie zawierała 6 znaków, przy czym dwa ostatnie to kolejny numer. Funkcja Mid odczytuje właśnie te dwa ostatnie znaki, które zostają zamienione przez funkcję Int na typ Integer. Indeksy tablicy zaczynają się od 0, a numery naszych przycisków od 1, stąd -1 na końcu. Zmienna nr będzie zawierała zatem numer kolejnego indeksu tablicy dla przycisku, który został kliknięty.
Listing kodu tworzącego kontrolki typu Panel z rozmieszczeniem ich co 6 stopni na obwodzie okręgu o promieniu 250.
’TWORZENIE OBIEKTOW PANEL, KTORE POSLUZA JAKO „DIODY”
’Zmienna kat wyznacza kąt od jakiego zaczniemy wyliczać położenia punktów X i Y
kat = 270
’Pętla For: tworząca 60 nowy komponentów typu Panel
For i = 0 To 59
’Tworzymy nowy Panel
dioda(i) = New Panel
’W petli With ustalamy poszczególne właściwości komponentu
With dioda(i)
’Nazwa
.Name = „dioda” + (i + 1).ToString(„D2”)
’Rozmiar
.Size = New Size(15, 15)
’Tu obliczamy współrzędne dla kolejnych punktów położonych na okręgu o promieniu 250
x = 285 + (Cos(kat * (PI / 180)) * 250)
y = 275 + (Sin(kat * (PI / 180)) * 250)
’Położenie
.Location = New Point(x, y)
’Kolor
.BackColor = Color.Red
End With
’Dodajemy nowo utworzony komponent do kolekcji kontrolek naszej Formy
Me.Controls.Add(dioda(i))
’Zwiększamy licznik o 6 (360 stopni / 60 paneli, czyli każdy panel co 6 stopni)
kat += 6
If kat > 360 Then kat = 6
Next
Cały listing programu można pobrać pod tym adresem
Program w postaci pliku Exe można pobrać tutaj: