In questi giorni durante le mie vicissitudini ho potuto lavorare un poco, ma su un pc non collegato in rete,
e non avendo letto le vostre mail ho proseguito seguendo la mia strada.
Ora ho letto, ma ho dovuto constatare che, conoscendo solo genericamente il mio progetto voi avete giustamente
proposto le vostre idee e di questo ringrazio immensamente.
Ma mi sono chiesto se sia giusto farvi perdere del tempo prezioso per cercare di risolvere i miei problemi proponendo
soluzioni che potrebbero anche non essere utili ai miei scopi.
Premettendo che sono sempre curioso di vedere come altri vedono e risolvono lo stesso problema, ho pensato
di preparare un pezzo di codice per darvi modo di vedere ( se lo volete ) come ho impostato la mia Form principale.
Questo codice sarebbe da mettere nella Sub Form Load e dimensiona un Form vuoto:
Me.Width = 1549 '---------------- Larghezza Form 1 ------------------
Me.Height = 876 '----------------- Altezza Form 1 ------------------
Me.Left = (Screen.PrimaryScreen.Bounds.Width - Me.Width) / 2 '---------------- Centratura x Form 1 ---
Me.Top = (Screen.PrimaryScreen.Bounds.Height - Me.Height) / 2 Form 1 ------ Centratura y Form 1 ---
Dim Txtbx As New TextBox '------------ Text Box --------------
Txtbx.Multiline = True
Txtbx.Size = New Size(624, 30)
Txtbx.Location = New Point(12, 443)
Txtbx.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Controls.Add(Txtbx)
Dim PictureBox0 As New PictureBox '--------- finestra PictureBox ---------
PictureBox0.Size = New Size(624, 416)
PictureBox0.Location = New Point(12, 12)
PictureBox0.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Controls.Add(PictureBox0)
Dim Panel1 As New Panel '--------- finestra Panel ---------
Panel1.Size = New Size(879, 765)
Panel1.Location = New Point(642, 12)
Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Controls.Add(Panel1)
Dim Button1 As New Button '--------- Button 1 - Chiudi ---------
Button1.Size = New Size(100, 30)
Button1.Location = New Point(1421, 791)
Button1.Text = "Chiudi"
Button1.BackColor = Color.FromArgb(200, 110, 200)
Button1.Font = New Font("Microsoft Sans Serif", 12)
Button1.ForeColor = Color.Navy
Button1.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Button1)
Dim Label2 As New Label '---------------- Label 2 - comando Selezione cartella --------------
Label2.Size = New Size(130, 30)
Label2.Location = New Point(33, 791)
Label2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label2.Text = "Selezione cartella"
Label2.BackColor = Color.PaleGreen
Label2.Font = New Font("Microsoft Sans Serif", 10)
Label2.ForeColor = Color.Black
Label2.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label2)
Dim Label3 As New Label '---------------- Label 3 - comando Numerazione --------------
Label3.Size = New Size(130, 30)
Label3.Location = New Point(178, 791)
Label3.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label3.Text = "Numerazione"
Label3.BackColor = Color.PaleGoldenrod
Label3.Font = New Font("Microsoft Sans Serif", 10)
Label3.ForeColor = Color.Black
Label3.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label3)
Dim Label4 As New Label '---------------- Label 4 - comando Caalogazione --------------
Label4.Size = New Size(130, 30)
Label4.Location = New Point(319, 791)
Label4.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label4.Text = "Catalogazione"
Label4.BackColor = Color.Khaki
Label4.Font = New Font("Microsoft Sans Serif", 10)
Label4.ForeColor = Color.Black
Label4.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label4)
Dim Label5 As New Label '---------------- Label 5 - comando Cancella tutto --------------
Label5.Size = New Size(130, 30)
Label5.Location = New Point(642, 791)
Label5.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label5.Text = "Cancella tutto"
Label5.BackColor = Color.LightCoral
Label5.Font = New Font("Microsoft Sans Serif", 10)
Label5.ForeColor = Color.Black
Label5.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label5)
Dim Label6 As New Label '---------------- Label 6 - comando Cancella selezione --------------
Label6.Size = New Size(130, 30)
Label6.Location = New Point(789, 791)
Label6.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label6.Text = "Cancella selezione"
Label6.BackColor = Color.RosyBrown
Label6.Font = New Font("Microsoft Sans Serif", 10)
Label6.ForeColor = Color.Black
Label6.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label6)
Dim Label7 As New Label '---------------- Label 7 - comando Ordinamento --------------
Label7.Size = New Size(130, 30)
Label7.Location = New Point(939, 791)
Label7.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
Label7.Text = "Ordinamento"
Label7.BackColor = Color.SkyBlue
Label7.Font = New Font("Microsoft Sans Serif", 10)
Label7.ForeColor = Color.Black
Label7.TextAlign = ContentAlignment.MiddleCenter
Controls.Add(Label7)
Detto questo proseguo con i codici, le spiegazioni e i commenti su questo thread.
Cercherò di essere più chiaro possibile, ma ho paura che il post sarà piuttosto lungo e vi prego di farmi sapere
se questa cosa non va bene ed eventualmente come mi devo comportare.
Siccome non ho ancora deciso se utilizzare layout fissi ( probabile ) o ridimensionabili da mouse,
per facilitare i calcoli ho assegnato a delle variabili pubbliche tutti i valori di settaggio.
Public Wpanel As Integer = 800 '... Larghezza Panel per cambio riga
Public xpicin As Integer = 20 '... posizione x inizio righe picturebox
Public xpic As Integer = 20 '... posizione x picturebox
Public ypic As Integer = 20 '... posizione y picturebox
Public Wpic As Integer = 120 '... larghezza picturebox
Public Hpic As Integer = 80 '... altezza picturebox
Public ximg As Integer = 5 '... posizione x immagine all'interno di picturebox
Public yimg As Integer = 5 '... posizione y immagine all'interno di picturebox
Public Wfdim As String = 0.0503 '... fattore dimensionamento larghezza immagine all'interno di picturebox
Public Hfdim As String = 0.0445 '... fattore dimensionamento altezza immagine all'interno di picturebox
Public hlab As Integer = 15 '... altezza label
Public ftxt As String = "Microsoft Sans Serif" '--- Font della label
Public htxt As Integer = 7 '... altezza Font della label
Public spWimg As Integer = 20 '... spazio orizzontale tra immagini ( e cornici )
Public spHimg As Integer = 30 '... spazio verticale tra immagini ( e cornici )
Qui Inizia il codice di attuazione:
'Dim Path As String = "G:\Ilmiofotoalbum" '------------------------------ percorso cartelle immagini
Dim ofd1 As OpenFileDialog = New OpenFileDialog()
ofd1.InitialDirectory = Path
ofd1.Multiselect = True
ofd1.Filter = "All files|*.*"
ofd1.FilterIndex = 2
ofd1.RestoreDirectory = True
If ofd1.ShowDialog() = DialogResult.OK Then
If Not Panel1.Controls.Count = 0 Then '------------------- controllo se nel panel ci sono già miniature
Dim iRisp As Integer
iRisp = MsgBox(" Nel Pannello sono già presenti altre immagini," & vbCrLf & vbCrLf & _
" [ SI ] Aggiunge le nuove immagini" & vbCrLf & vbCrLf & _
" [ NO ] Cancella le immagini presenti.", 3 + 32)
Select Case iRisp
Case vbYes
Case vbNo
Panel1.Controls.Clear()
Call sb320() '----------------------------- Routine per cancellare il contenuto del Panel
Case Else
Exit Sub
End Select
End If
Siccome non ho capito esattamente a cosa serve sapere il numero dei file della cartella, ho pensato che
avrebbe potuto essere utile anche il numero delle sole immagini selezionate , per questo ho implementato
tutte e due le funzioni di conteggio da usare secondo l'esigenza.
Dim files() As String = ofd1.FileNames
Dim din As New IO.DirectoryInfo(Path) '---------------------------------------- conteggio file e item
Dim nimg As Integer = CInt(din.GetFiles.GetLength(0)) '------------------ numero file in folder
Dim nitm As Integer = UBound(files) '-------------------------------------------- numero item in array
Label5.Text = (nitm + 1 & " - immagini")
Dim Npbx As UInt16 = 0 '... indice per identificare le pic
'Dim Nlab As UInt16 = 0 '... indice per identificare le label
Dim pic(nimg) As PictureBox '----------------------------------- numero file in folder / numero item in array
Qui ho pensato di realizzare delle miniature con una cornice che cambia colore quando vengono selezionate.
Per fare ciò ho ridimensionato l'immagine da inserire nella PictureBox:
For Each FileName In files
Npbx += Npbx '-------------------------------------- incremento l'indice della pic
''Nlab = Npic
pic(Npbx) = New PictureBox '------------------ creo una nuova picturebox
pic(Npbx).BackColor = Color.Gray '---------- colore della fondo che rimarrà visibile ( cornice )
pic(Npbx).Size = New System.Drawing.Size(Wpic, Hpic) '----- Dimensione PictureBox = ( 120 x 80 )
pic(Npbx).Location = New Point(xpic, ypic)
pic(Npbx).Image = Image.FromFile(FileName)
Dim bm_source As New Bitmap(FileName) '-------------- ridimensionamento immagine ----------------
Dim bm_dest As New Bitmap(CInt(bm_source.Width * Wfdim), CInt(bm_source.Height * Hfdim))
'--- In questo caso Size sarà: Wfdim = 0,0503 e Hfdim = 0,0455
Dim gr_dest As Graphics = Graphics.FromImage(bm_dest)
gr_dest.DrawImage(bm_source, ximg, yimg, bm_dest.Width, bm_dest.Height)
'--- In questo caso Location sarà: ximg = 5 e yimg = 5
'---------------------------------------------------------- Dimensioni dell'immagine risultante = ( 115 x 76 )
pic(Npbx).Image = bm_dest '------- caricamento dell'immagine in PictureBox
A questo punto o implementato le label con il titolo dell'immagine:
Dim labtit As New Label '--------------------------------------------- realizzazione label titolo dell'immagine
labtit.BackColor = Color.Beige
Dim filetit As System.IO.FileInfo
filetit = My.Computer.FileSystem.GetFileInfo(FileName) '--------- ricavo il titolo dell'immagine
labtit.Text = (filetit.Name)
labtit.Font = New Font(ftxt, htxt)
labtit.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
labtit.Size = New System.Drawing.Size(Wpic, hlab)
labtit.Location() = New Point(xpic, ypic + Hpic)
xpic = xpic + Wpic + spWimg '-------------------------- aggiornamento coordinate immagine e label successive
If xpic >= Wpanel Then '----------- larghezza pannello = 880 alla sesta PictureBox passa alla riga successiva
xpic = xpicin
ypic += Hpic + spHimg
End If
Panel1.Controls.Add(pic(Npbx))
Panel1.Controls.Add(labtit)
gr_dest.Dispose()
Next
End If
MsgBox(Panel1.Controls.Count)
Devo anche ammettere che purtroppo la mia esperienza in VB e la stanchezza di quei quattro neuroni rimasti
( 72 anni ), mi prendono un mucchio di tempo in più di quello che impieghereste voi.
Ma tengo duro perché è la mia passione, viva i bit.
Ho cercato di provare l'esempio di Thejuster perché sarei curioso di vedere il risultato utilizzando FlowLayoutPanel,
ma non sono riuscito a farlo funzionare perché mi da errore sulla riga p.Click += P_Click
'Public Event Click(sender As Object, e As System.EventArgs)' is an event, and cannot be called directly.
Use a 'RaiseEvent' statement to raise an event.
Per quanto riguarda la memoria avrete visto che ho utilizzato il metodo Graphic per ridimensionare le immagini,
( 120 x 8 per la PictureBox e 115 x 76 per l'immagine ) anche se ammetto che non pensavo alla memoria ma alla cornice.
Il messaggio di memoria insufficiente è comparso dopo caricato un centinaio di immagini 750 Kb media x 100 = 75 Mb,
ma non so ancora come interpretarlo.
Ho inserito gr_dest.Dispose(), sostituto di img.Dispose(), ma non ho notato differenze.
Altro errore che non ho ancora individuato è che alla fine, quando vado a contare le immagini del pannello,
risultano sempre essere il doppio di quelle effettivamente presenti.
Sto ancora guardando cose del codice di Carlo, ma credo sia ora di chiudere perché le cosa sono andate
per le lunghe.
Torno a ringraziarvi della pazienza, aspetto commenti e Saluto.
Gianni