Sunteți pe pagina 1din 14

C8 Colecii ArrayList de obiecte definite de utilizator

1) Ce este o colecie de obiecte? -o variabil de memorie ce conine o mulime (o list) de elemente de tip obiect stocate n memoria intern n zone neadiacente de memorie 2) Care sunt etapele necesare definirii, ncrcrii i utilizrii (valorificrii) unei colecii ArrayList de obiecte? a) se definesc clasele b) se definete colecia c) se ncarc obiectele n colecie -se instaniaz un obiect al unei clase -se preiau valorile proprietilor (uneori i ale atributelor neprotejate) ale obiectelor i se adaug n colecie d) se actualizeaz colecia -se terg anumite obiecte din colecie -se adaug noi obiecte n colecie -se modific valorile unor proprieti ale unui obiect din colecie e) se valorific (se utilizez) datele unei colecii -se parcurge colecia i se fac prelucrrile solicitate pe baza datelor din colecie

Exemplu: Considerm urmtoarea ierarhie de clase n VB.NET

Unde: -clasa Document este clas abstract iar clasa Cec este o clas concret. Clasa Cec este clasa secundar/derivat/copil avnd clasa Document clas de baz/superclasa/printe -atributele:m_FelDoc, m_NrDoc, m_EmitentDoc, m_TipOperatie, m_DenumireTert sunt de tip String; m_DataDoc este de tip Date i m_SumaCec este de tip Integer; -atributul m_TipOperatie poate lua doar valorile: I pentru cec de ncasat; P pentru cec de plat i S pentru cec depus spre scontare -pentru atributele Private: m_FelDoc, m_TipOperatie i m_Suma se vor defini proprietile similare: felDoc, tipOperatie, sumaCec Cerine: i) s se defineasc clasele

ii) s defineasc la nivelul clasei Form1 colecia Cecuri iii) la evenimentul click pe Button1 s se instanieze obiectul cec, s se preia cu InputBox valorile proprietilor felDoc, tipOperatie, sumaCec i s se adauge n colecie iv) la evenimentul click pe Button2 s se afieze coninutul coleciei element cu element v) la evenimentul click pe Button3 s se parcurg colecia Cecuri i s se afieze Suma de incasate este = , sum care se va obine prin nsumarea sumelor nscrie n cecurile din colecie care au tipOperatie egal cu I Vom avea: i) definirea claselor - definirea clasei document
Public MustInherit Class Document 'definirea atributelor Private m_FelDoc As String Private m_NrDoc As String Private m_DataDoc As Date Private m_EmitentDoc As String 'definirea proprietatilor Public Property felDoc() As String Get Return m_FelDoc End Get Set(ByVal value As String) m_FelDoc = value End Set End Property 'definirea metodelor End Class

-definirea clasei Cec


Public Class Cec 'definirea clasei parinte Inherits Document 'definirea atributelor Private m_TipOperatie As String Private m_SumaCec As Integer 'definirea proprietatilor Public Property tipOperatie() As String

Get

Return m_TipOperatie End Get Set(ByVal value As String) 'validarea datelor introduse If value = "I" Or value = "P" Or value = "S" Then m_TipOperatie = value Else m_TipOperatie = "" MsgBox("Tip operatie diferit de I,P sau S") End If End Set End Property Public Property sumaCec() As Integer Get Return m_SumaCec End Get Set(ByVal value As Integer) m_SumaCec = value End Set End Property 'definirea metodelor End Class

ii) definirea coleciei


Public Class Form1 'definirea colectiei Dim cecuri As New ArrayList End Class

iii) instanierea unui obiect i adaugarea n colecie


Public Class Form1 'definirea colectiei Dim cecuri As New ArrayList Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click 'Definesc un cec o instanta a clasei Cec Dim unCec As New Cec 'Incarc proprietatile unCec.felDoc = InputBox("Tastati fel document") unCec.tipOperatie = InputBox("Tastati tip operatie") unCec.sumaCec = InputBox("Tastati suma") 'Verific daca cecul este corect If unCec.tipOperatie = "" Then 'Distrug cecul - nu este corect MsgBox("Cec gresit") unCec = Nothing Else

'Incarc un cec in colectie - este corect cecuri.Add(unCec) MsgBox("Cec Ok") End If End Sub End Class

iv) listarea coninutului coleciei


Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click 'Listez datele din colectie For Each c As Cec In cecuri MsgBox(c.felDoc & " " & c.tipOperatie & " " & c.sumaCec) Next End Sub

v) se afieaz Suma de ncasat


Private Sub Button3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button3.Click 'definirea variabilei pentru suma cecurilor incarcate Dim sumaI As Integer 'initializare sumaI = 0 'Parcurg colectia For Each c As Cec In cecuri 'Daca este Cec de incasat adun sumaCec If c.tipOperatie = "I" Then sumaI = sumaI + c.sumaCec End If Next 'Afisez suma de incasat MsgBox("Suma de incasat este: " & sumaI) End Sub

3) Cum se mai pot prelua (ncrca) proprietile unui obiect n afar de InputBox? -cu ajutorul formularelor 4) Ce presupune utilizarea formularelor la ncrcarea proprietilor unui obiect? a) construirea interfeei (a formularului sau a machetei de preluare) b) definirea procedurii de ncrcare validare -se introduc noile valori n macheta de culegere a datelor

-se valideaz datele i dac sunt corecte (se instaniaz un nou obiect; se transfer datele din machet n proprieti; se adaug obiectul n colecie) Exemplu: Pentru preluarea proprietilor felDoc, tipOperatie, sumaCec vom construi urmtoarea interfa:

Unde: - n stnga machetei am utilizat etichete Fel Document, Tip Operatie i Suma Cec cu rol explicativ; iar - n partea dreapt am folosit TextBox-uri n care vom introduce noile valori ale proprietilor de ncrcat cu numele txtFelDoc, txtTipOperaie, txtSumaCec. Not: ceeace vom introduce noi n TextBox-uri va fi memorat i disponibil n proprietatea text a fiecrui control de tip TextBox Dorim ca la click pe Button4 (PreluareValidare) s verificm dac am introdus date corecte n TextBox-uri i dac sunt corecte s

instaniem un nou obiect s transferm valorile ncrcate n proprietile obiectului i s adugm obiectul n colecie. Dac datele nu sunt corecte, atunci afim un mesaj de avertizare. Not: Pentru validarea corectitudinii proprietii tipOperatie am definit procedura txtTipOp_Validating care practic nu mai permite prsirea controlului txtTipOperatie dac nu se introduce o valoare coerct:
Private Sub txtTipOp_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTipOp.Validating If txtTipOp.Text = "I" Or txtTipOp.Text = "P" Or txtTipOp.Text = "S" Then Else e.Cancel = True MsgBox("Tip operatie diferit de I,P sau S") txtTipOp.Text = "" End If End Sub

Procedura de PreluareValidare presupune:


Private Sub Button4_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button4.Click 'Verific daca am introdus ceva in tipOperatie deoarece aplicand(procedura) Validating daca introducem ceva acela nu poate fi decat corect If txtTipOp.Text = "" Then MsgBox("Tip operatie eronata") Else 'Definesc un nou obiect Dim unCec As New Cec 'Transfer datele din macheta in obiect unCec.felDoc = txtFelDoc.Text unCec.tipOperatie = txtTipOp.Text unCec.sumaCec = txtSumaCec.Text 'Adaug obiectul in colectie cecuri.Add(unCec) End If End Sub

5) Cum putem s rsfoim o colecie de obiecte? -cu ajutorul butoanelor de comand Astfel vom construi urmtoarele butoane cu urmtoarele sarcini:

Simbol

Nume btnPrima btnDreapta btnStanga btnUltima

Sarcin Se afieaz pe primul element din colecie (index zero) i afieaz coninutul acestuia Se deplaseaz pe urmtorul element din colecie i afieaz coninutul acestuia Se deplaseaz pe elementul precedent din colecie i afieaz coninutul acestuia Se deplaseaz pe ultimul element din colecie (index count) i afieaz coninutul acestuia

Private Sub btnPrima_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrima.Click 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0 'ma pozitionez pe primul element din colectie si afisez continutul cecCurent = cecuri.Item(0) txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec 'memorez indexul curent i = 0 End Sub Private Sub btnDreapta_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDreapta.Click 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0 'ma pozitionez pe urmatorul element din colectie (daca exista) si afisez continutul If i < cecuri.Count - 1 Then i = i + 1 End If cecCurent = cecuri.Item(i)

txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec End Sub Private Sub btnUltima_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnUltima.Click 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0 'ma pozitionez pe ultimul element din colectie si afisez continutul

cecCurent = cecuri.Item(cecuri.Count - 1) 'afisez continutul txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec 'preiau indexul i = cecuri.Count - 1 End Sub Private Sub btnStanga_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStanga.Click 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0 'ma pozitionez pe precedentu element din colectie (daca exista) si afisez continutul If i > 0 Then i = i - 1 End If MsgBox(i) cecCurent = cecuri.Item(i) txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec End Sub

6) Cum putem s actualizm o colecie de obiecte? -cu ajutorul butoanelor de comand Astfel vom construi urmtoarele butoane cu urmtoarele sarcini:

Simbol

Nume

Sarcin

btnCautDupaFelDoc Se introduce felul documentului cautat i dac va fi gsit se afieaz elementul respectv btnCautDupaIndex Se introduce indexul i dac este corect se afieaz elementul cu indexul respectiv Se terge obiectul curent al coleciei dac se confirm tergerea Adaug un nou obiect n colecie Se modific coninutul obiectului aflat n machet terge toate obiectele din colecie

brnSterg

btnAdaug btnModific brnCuratColectia

Private Sub btnCautFelDoc_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCautFelDoc.Click 'Definesc variabila de cautat Dim felDocCautat As String 'Preiau variabila de cautat felDocCautat = InputBox("Tastati fel document de cautat") 'caut cecCurent = Nothing For Each element As Cec In cecuri If element.felDoc = felDocCautat Then cecCurent = element Exit For End If Next If IsNothing(cecCurent) Then MsgBox("Documentul nu a fost gasit") 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0

Else 'afisez cecul gasit

txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec End If End Sub Private Sub btnCautIndex_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCautIndex.Click 'Definesc indexul de cautat Dim j As Integer 'Preiau indexul j = InputBox("Tastati indexul") 'caut cecCurent = Nothing If j > -1 And j < cecuri.Count Then cecCurent = cecuri.Item(j) End If If IsNothing(cecCurent) Then MsgBox("Indexul nu exista") 'curat macheta Call CuratMacheta() Else 'afisez cecul gasit txtFelDoc.Text = cecCurent.felDoc txtTipOp.Text = cecCurent.tipOperatie txtSumaCec.Text = cecCurent.sumaCec i = j End If End Sub Private Sub btnModific_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnModific.Click If IsNothing(cecCurent) Then MsgBox("Cecul nu poate fi modificat") Else cecCurent.felDoc = txtFelDoc.Text cecCurent.tipOperatie = txtTipOp.Text cecCurent.sumaCec = txtSumaCec.Text End If

End Sub Private Sub btnSterg_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSterg.Click Dim raspuns As Integer If IsNothing(cecCurent) Then MsgBox("Cecul nu poate fi sters") Else

raspuns = MsgBox("Doriti sa stergeti acest Cec ", MsgBoxStyle.Question + MsgBoxStyle.YesNo) If raspuns = vbYes Then cecuri.Remove(cecCurent) Call CuratMacheta() End If End If End Sub Private Sub btnAdaug_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAdaug.Click 'Verific daca am introdus ceva in tipOperatie deoarece ' aplicand(procedura) Validating daca introducem ceva acela nu poate fi decat corect If txtTipOp.Text = "" Then MsgBox("Tip operatie eronata") Else 'Definesc un nou obiect Dim unCec As New Cec 'Transfer datele din macheta in obiect unCec.felDoc = txtFelDoc.Text unCec.tipOperatie = txtTipOp.Text unCec.sumaCec = txtSumaCec.Text 'Adaug obiectul in colectie cecuri.Add(unCec) End If End Sub Private Sub btnCuratMacheta_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCuratMacheta.Click 'apelez procedura CuratMachete Call CuratMacheta() End Sub Private Sub btnCuratColectia_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnCuratColectia.Click cecuri.Clear() Call CuratMacheta() End Sub Private Sub CuratMacheta() 'curat macheta txtFelDoc.Text = "" txtTipOp.Text = "" txtSumaCec.Text = 0 End Sub End Class

Forma final a interfeei va fi:

S-ar putea să vă placă și