Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
matrice(0) = "Tizio"
matrice(1) = "Caio"
matrice(2) = "Sempronio"
aggiungiElementiAlMenu()
AggiungiSottomenu()
End Sub
Sub aggiungiElementiAlMenu()
For n = 0 To matrice.Length - 1
Dim mn As New ToolStripMenuItem With {.Text = matrice(n)}
Menu.Items.Add(mn)
Next
End Sub
Sub AggiungiSottomenu()
For Each elemento In Menu.Items
If elemento.Text = "Sempronio" Then
For n = 0 To matrice.Length - 1
Dim submenu As New ToolStripMenuItem With {.Text = matrice(n)}
elemento.DropDownItems.Add(submenu)
Next
End If
Next
End Sub
Ho isolato le varie funzioni per avere un programma più maneggevole. E' meglio fare sempre così.
Miei appunti liberi, senza pretesa di dire necessariamente sempre cose giuste o sensate, durante l'apprendimento e la pratica della programmazione
JavascriptProva
sabato 18 gennaio 2014
Aggiunta di diversi sottomenu a runtime.
Ecco costruito un altro pezzetto: l'aggiunta di menu e sottomenu a runtime.
venerdì 17 gennaio 2014
Un sottomenu a runtime...
Come si aggiunge un sottomenu a runtime a un contextmenu?
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
matrice(0) = "Tizio"
matrice(1) = "Caio"
matrice(2) = "Sempronio"
For n = 0 To matrice.Length - 1
Dim mn As New ToolStripMenuItem
mn.Text = matrice(n)
Menu.Items.Add(mn)
Next
For Each elemento In Menu.Items
If elemento.Text = "Sempronio" Then
Dim submenu As New ToolStripMenuItem With {.Text = "ciccio"}
elemento.DropDownItems.Add(submenu)
End If
Next
End Sub
domenica 12 gennaio 2014
Appunti personali: il codice finora costruito
Riassumo qui l'ultimo codice:
Public Class Form1
Dim WithEvents mGrid As Griglia(Of Pannello)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
mGrid = New Griglia(Of Pannello)(Me, True, 30, 5, 10, 10)
For Each elemento As Pannello In mGrid
AddHandler elemento.MouseDown, AddressOf Aggiungi
Next
End Sub
Sub Aggiungi(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim child As New miaLabel
AddHandler child.MouseDown, AddressOf ClickContenuto
sender.controls.add(child)
Ridistribuisci(sender)
End If
End Sub
Sub ClickContenuto(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Aggiungi(sender.parent, e)
Else
Rimuovimi(sender)
End If
End Sub
Private Sub Ridistribuisci(contenitore As Object)
Dim base = 0
For Each C In contenitore.Controls
C.width = contenitore.Width / contenitore.Controls.Count
C.location = New Point(base * contenitore.Width / contenitore.Controls.Count, 0)
base += 1
C.bringtofront()
Next
End Sub
Sub Rimuovimi(contenuto As Object)
Dim temp As Object = contenuto.parent
contenuto.parent.controls.remove(contenuto)
Ridistribuisci(temp)
temp = Nothing
End Sub
End Class
Class Pannello
Inherits Panel
Sub New()
Width = 100
Height = 20
BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End Sub
End Class
...casomai dovessi dimenticarlo così lo prendo e lo riattacco pari pari...
Aggiunta ed eliminazione di contenuti in un contenitore Panel.
Questo è il codice, con qualche modifica dovuta al fatto che sto studiando la rimozione degli elementi:
Cominciamo a isolare una parte del codice che è quella che ridistribuisce lo spazio del contenitore fra i contenuti.
Ho trovato la soluzione:
Public Class Form1
Dim WithEvents mGrid As Griglia(Of Pannello)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
mGrid = New Griglia(Of Pannello)(Me, True, 30, 5, 10, 10)
For Each elemento As Pannello In mGrid
AddHandler elemento.MouseDown, AddressOf aggiungi
Next
End Sub
Sub aggiungi(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim child As New miaLabel
AddHandler child.MouseDown, AddressOf genitore
sender.controls.add(child)
Dim base = 0
For Each C In sender.controls
C.width = sender.width / sender.controls.count
C.location = New Point(base * sender.width / sender.controls.count, 0)
base += 1
C.bringtofront()
Next
Else
End If
End Sub
Sub genitore(sender As Object, e As MouseEventArgs)
aggiungi(sender.parent, e)
End Sub
End Class
Class Pannello
Inherits Panel
Sub New()
Width = 100
Height = 20
BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End Sub
End Class
Il problema è che quando clicco sul contenitore o su uno dei contenuti con il sinistro il risultato deve essere l'aggiunta di un contenuto al contenitore, mentre quando clicco sul contenitore con il destro non deve succedere niente, mentre se clicco su un contenuto con il destro, questo deve essere rimosso.Cominciamo a isolare una parte del codice che è quella che ridistribuisce lo spazio del contenitore fra i contenuti.
Sub aggiungi(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim child As New miaLabel
AddHandler child.MouseDown, AddressOf genitore
sender.controls.add(child)
Ridistribuisci(sender)
Else
End If
End Sub
.........
Private Sub Ridistribuisci(contenitore As Object)
Dim base = 0
For Each C In contenitore.controls
C.width = contenitore.width / contenitore.controls.count
C.location = New Point(base * contenitore.width / contenitore.controls.count, 0)
base += 1
C.bringtofront()
Next
End Sub
...Ho trovato la soluzione:
Public Class Form1
Dim WithEvents mGrid As Griglia(Of Pannello)
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
mGrid = New Griglia(Of Pannello)(Me, True, 30, 5, 10, 10)
For Each elemento As Pannello In mGrid
AddHandler elemento.MouseDown, AddressOf aggiungi
Next
End Sub
Sub aggiungi(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
Dim child As New miaLabel
AddHandler child.MouseDown, AddressOf ClickContenuto
sender.controls.add(child)
Ridistribuisci(sender)
End If
End Sub
Sub ClickContenuto(sender As Object, e As MouseEventArgs)
If e.Button = Windows.Forms.MouseButtons.Left Then
aggiungi(sender.parent, e)
Else
Dim temp As Object = sender.parent
sender.parent.controls.remove(sender)
Ridistribuisci(temp)
temp = Nothing
End If
End Sub
Private Sub Ridistribuisci(contenitore As Object)
Dim base = 0
For Each C In contenitore.Controls
C.width = contenitore.Width / contenitore.Controls.Count
C.location = New Point(base * contenitore.Width / contenitore.Controls.Count, 0)
base += 1
C.bringtofront()
Next
End Sub
End Class
Class Pannello
Inherits Panel
Sub New()
Width = 100
Height = 20
BorderStyle = Windows.Forms.BorderStyle.FixedSingle
End Sub
End Class
Ecco il risultato (bella idea, nei filmati che non commento a voce, quella di inserire brani musicali):giovedì 9 gennaio 2014
Devo capire bene i criteri con i quali vengono fatti i turni...
Purtroppo non posso annotare qui i nomi reali delle persone di cui ho il prospetto dei turni, per cui devo sostituirli con degli pseudonimi, e per lo stesso motivo non posso mettere qui il prospetto che ho realizzato con la mia applicazione.
Partiamo dalla dottoressa Mannoni...
Presenta un totale di 138 ore di turni effettivi.
Più tre turni di legge 104.
138+ 6 x 3 = 138 + 18 = 156.
Adesso il dottor Lungoni:
90 ore di turni effettivi.
10 turni di ferie
2 turni di aggiornamento.
90 + 60 + 12= 162
Adesso il dottor Fregnetti:
126 ore di turni effettivi.
3 turni di ferie.
126 + 6 x 3 = 126 + 18 = 144
Il dottor Morselli:
126 ore di turni effettivi.
6 turni di ferie.
126 + 36 = 162.
La dottoressa Cagnacci:
138 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
La dottoressa Arboretti:
156 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
Il dottor Dolcetti:
156 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
Il dottor Grandi:
132 ore di turni effettivi.
1 turno di aggiornamento.
132 + 6 = 138.
Dunque il totale viene così:
Perchè questa disparità?
Purtroppo non posso annotare qui i nomi reali delle persone di cui ho il prospetto dei turni, per cui devo sostituirli con degli pseudonimi, e per lo stesso motivo non posso mettere qui il prospetto che ho realizzato con la mia applicazione.
Partiamo dalla dottoressa Mannoni...
Presenta un totale di 138 ore di turni effettivi.
Più tre turni di legge 104.
138+ 6 x 3 = 138 + 18 = 156.
Adesso il dottor Lungoni:
90 ore di turni effettivi.
10 turni di ferie
2 turni di aggiornamento.
90 + 60 + 12= 162
Adesso il dottor Fregnetti:
126 ore di turni effettivi.
3 turni di ferie.
126 + 6 x 3 = 126 + 18 = 144
Il dottor Morselli:
126 ore di turni effettivi.
6 turni di ferie.
126 + 36 = 162.
La dottoressa Cagnacci:
138 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
La dottoressa Arboretti:
156 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
Il dottor Dolcetti:
156 ore di turni effettivi.
Nessun turno di ferie o aggiornamento.
Il dottor Grandi:
132 ore di turni effettivi.
1 turno di aggiornamento.
132 + 6 = 138.
Dunque il totale viene così:
| Mannoni | 156 |
| Lungoni | 162 |
| Fregnetti | 144 |
| Morselli | 162 |
| Cagnacci | 138 |
| Arboretti | 156 |
| Dolcetti | 156 |
| Grandi | 138 |
Perchè questa disparità?
sabato 4 gennaio 2014
Esame del programma di attribuzione dei turni.
Dunque le variabili di cui devo tener conto sono:
Creazione della matrice "di lavoro":
Rimescolamento e ordinamento della matrice principale:
Caricamento degli elementi nella matrice di lavoro (inizia il ciclo):
Calcolo del totale delle preferenze totPref:
Esecuzione del calcolo con calcolo dei turni attribuiti e del resto, da numTurni e attribuiti:
Mostra la matrice di partenza con i turni attribuiti
Azzera totPref e attribuiti, che vanno ricalcolati al ciclo successivo; cancella la matrice di lavoro; attribuisce a numTurni il valore di resto e avanza startNum per caricare nuovamente nella matrice di lavoro con esclusione dei valori di preferenza più bassi; ricomincia il ciclo:
- totPref, che parte da zero e viene calcolato con un ciclo for-next
- numTurni, che è il numero totale dei turni a disposizione, il quale parte con un preciso valore
- attribuiti, che è il numero dei turni attribuiti, calcolato nel ciclo for-next che calcola i turni
- resto, che viene calcolato alla fine di ogni ciclo Loop, ottenuto sottraendo attribuiti da numTurni.
mario.nome = "Mario"
giuseppe.nome = "Giuseppe"
luigi.nome = "Luigi"
mario.preferenza = 0
giuseppe.preferenza = 20
luigi.preferenza = 20
matrice = New ArrayList
matrice.Add(mario)
matrice.Add(giuseppe)
matrice.Add(luigi)
Creazione della matrice "di lavoro":
Dim matrice2 As New ArrayList
Rimescolamento e ordinamento della matrice principale:
'Rimescolamento casuale della matrice di partenza
Dim r As New Random
Dim x As Integer
Dim temp As persona
For n = 0 To matrice.Count - 1
x = r.Next(matrice.Count - n) + n
temp = matrice(n)
matrice(n) = matrice(x)
matrice(x) = temp
Next
'ordinamento della matrice
matrice.Sort()
Caricamento degli elementi nella matrice di lavoro (inizia il ciclo):
Do
For n = startnum To matrice.Count - 1
matrice2.Add(matrice(n))
Next
Calcolo del totale delle preferenze totPref:
'si calcola il totale delle preferenze
totPref = 0
For n = 0 To matrice2.Count - 1
totPref += matrice2(n).preferenza
Next
Esecuzione del calcolo con calcolo dei turni attribuiti e del resto, da numTurni e attribuiti:
'quindi si fa il calcolo
For n = 0 To matrice2.Count - 1
matrice2(n).turni += Math.Floor(numTurni / totPref * matrice2(n).preferenza)
attribuiti += Math.Floor(numTurni / totPref * matrice2(n).preferenza)
resto = numTurni - attribuiti
Next
Mostra la matrice di partenza con i turni attribuiti
'mette a video la matrice di partenza
mostra(matrice)
Debug.Print("resto " & resto)
Debug.Print("-----")
Azzera totPref e attribuiti, che vanno ricalcolati al ciclo successivo; cancella la matrice di lavoro; attribuisce a numTurni il valore di resto e avanza startNum per caricare nuovamente nella matrice di lavoro con esclusione dei valori di preferenza più bassi; ricomincia il ciclo:
totPref = 0
attribuiti = 0
matrice2.Clear()
numTurni = resto
startnum += 1
Loop While resto <> 0
Iscriviti a:
Commenti (Atom)