Krugove i linije koje spajaju te krugove, treba posmatrati kao objekte koji imaju neke svoje atribute. Recimo, krug treba da ima X i Y koordinatu (koje predstavljaju centar kružnice), zatim radijus, boju i naravno druge atribute koje u konkretnom slučaju taj element treba da ima. E sad, ja predlažem da se tu napravi UDF (user defined type) koji će predstavljati taj element, u tvom slučaju krug. Dakle, ovako
Code:
Private Type e_Circle
X As Integer
Y As Integer
Radius As Integer
Color As Long
End Type
a možemo napraviti i tip za relacije (koji će sadržati podatak o tome, koji krug treba da bude povezan sa kojim)
Code:
Private Type e_Relations
Master As Integer
Slave As Integer
End Type
E sad, kad smo to definisali možemo da deklarišemo matricu tih objekata.
Code:
Dim objCircles() As e_Circle
Dim objRelations() As e_Relations
U Load eventu forme redimujemo te objekte na nulu (iako će kec biti prvi element u nizu), kako bismo kasnije mogli da koristimo redim preserve
Code:
Private Sub Form_Load()
ReDim objCircles(0) As e_Circle
ReDim objRelations(0) As e_Relations
End Sub
E sad nam trebaju prcedure za dodavanje novog kruga i nove relacije. To bi moglo da izgleda nekako ovako
Code:
Private Sub AddCircle(iX As Integer, iY As Integer, iRadius As Integer, lColor As Long)
ReDim Preserve objCircles(UBound(objCircles) + 1) As e_Circle
objCircles(UBound(objCircles)).X = iX
objCircles(UBound(objCircles)).Y = iY
objCircles(UBound(objCircles)).Radius = iRadius
objCircles(UBound(objCircles)).Color = lColor
End Sub
Private Sub AddRelation(iMaster As Integer, iSlave As Integer)
ReDim Preserve objRelations(UBound(objRelations) + 1) As e_Relations
objRelations(UBound(objRelations)).Master = iMaster
objRelations(UBound(objRelations)).Slave = iSlave
End Sub
I naravno, da bi sve to imalo smisla, treba to i grafički predstaviti u koju svrhu ćemo napraviti proceduru DrawScheme koja će sve to da iscrta u jednom picturebox-u koji smo nazvali picMain
Code:
Private Sub DrawScheme()
Dim I As Integer
For I = 1 To UBound(objRelations)
picMain.Line (objCircles(objRelations(I).Master).X, objCircles(objRelations(I).Master).Y) _
-(objCircles(objRelations(I).Slave).X, objCircles(objRelations(I).Slave).Y), 0
Next I
picMain.FillStyle = FillStyleConstants.vbFSSolid
For I = 1 To UBound(objCircles)
picMain.FillColor = picMain.BackColor
picMain.Circle (objCircles(I).X, objCircles(I).Y), objCircles(I).Radius, objCircles(I).Color
Next I
End Sub
Malo pojašnjenje. Dakle, prvo iscrtamo linije koje predstavljaju relacije između krugova i to tako što se te linije iscrtavaju od centra jedne kružnice do centra druge kružnice. U sledećoj petlji, crtamo kreirane krugove, i to tako što će im okvir biti određene boje koju smo odredili prilikom dodavanja kruga, a ti isti krugovi će biti filovani bojom pozadine. Zašto filovanje kruga ? Da bi se sakrio "višak" od linija, odnosno da bi se stekao utisak da linije idu od ivice kruga do ivice kruga, a ne od centra do centra. Zašto bojom pozadine ? No reason. Čisto da bi se stekao utisak da je krug providan, ali može se obojiti bilo kojom bojom ukoliko za tim ima potrebe. Samo treba promeniti liniju picMain.FillColor = picMain.BackColor u picMain.FillColor = objCircles(I).Color i krug 'e biti filovan bojom koju smo mu dodelili prilikom dodavanja.
Primer kako bi mogli da dodajemo krugove i relacije na klik dugmeta bi izgledao nekako ovako. Za dodavanje kruga
Code:
Private Sub cmdAddCircle_Click()
Dim sX As String
Dim sY As String
Dim sRadius As String
sX = InputBox("Unesite X koordinatu kruga", "Novi krug", "100")
If sX = "" Then Exit Sub
sY = InputBox("Unesite Y koordinatu kruga", "Novi krug", "100")
If sY = "" Then Exit Sub
sRadius = InputBox("Unesite radijus kruga", "Novi krug", "25")
If sRadius = "" Then Exit Sub
Call AddCircle(Val(sX), Val(sY), Val(sRadius), RGB(200, 0, 0))
Call DrawScheme
End Sub
za dodavanje relacija
Code:
Private Sub cmdAddRelation_Click()
Dim sMaster As String
Dim sSlave As String
sMaster = InputBox("Unesite redni broj master kruga", "Nova relacija", "1")
If sMaster = "" Then Exit Sub
If Val(sMaster) < 1 Or Val(sMaster) > UBound(objCircles) Then
MsgBox "Ovaj krug ne postoji", vbCritical, "Greška"
Exit Sub
End If
sSlave = InputBox("Unesite redni broj slave kruga", "Nova relacija", "2")
If sSlave = "" Then Exit Sub
If Val(sSlave) < 1 Or Val(sSlave) > UBound(objCircles) Then
MsgBox "Ovaj krug ne postoji", vbCritical, "Greška"
Exit Sub
End If
If Val(sMaster) = Val(sSlave) Then
MsgBox "Ne možete povezati krug sa samim sobom", vbCritical, "Greška"
Exit Sub
End If
Call AddRelation(Val(sMaster), Val(sSlave))
Call DrawScheme
End Sub
I eto otprilike bi to bilo to. Klikom na prvo dugme program će te pitati za X, Y koordinate kruga i radijus. Boju sam stavio fiksnu, ali lako može da se doda izbornik boja (nisam hteo sad da se zamlaćujem sa tim, a i nije bitno za primer). Klikom na drugo, program će pitati koji krug povezuješ sa kojim tako što trebaš da uneseš broj master kruga, a zatim i slave kruga.
Ovaj primer možeš isprobati tako što ćeš na formu dodati jedan picturebox i nazvati ga picMain i setovati ScaleMode na 3 - Pixel. Pozadinu (BackColor) možeš da staviš belu kako bi lepše izgledalo, ali i ne moraš. Može bilo koja boja. Zatim, dodaj dva command buttona, cmdAddCircle i cmdAddRelation. Onda startuj aplikaciju, dodaj nekoliko krugova, a zatim definiši relacije, pa pogledaj rezultat. To ti je čisto sa tehničke strane kako možeš da izvedeš crtanje. A kojom logikom će se krugopvi povezivati, to ti znaš, pa implementiraj. Kompletan kod sledi ispod.
E sad, ovo je samo primer na brzaka, kako bi to što tražiš moglo da se izvede, ne znači da je to i najbolje rešenje.
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti