Oppure

Loading
20/02/20 11:49
Thejuster
Purtroppo sono abituato a scrivere in C Like e i convertitori online alcune cose non le traducono.

AddHandler al p_Click aggiunge un evento ad un controllo. appunto al momento del click.
Ma, se crei un ciclo per esempio 100 controlli e li reindirizzi tutti allo stesso void del click
allora tutti e 100 controlli risponderanno a quel click.

ed entra in gioco il CType per identificare Quale controllo sta chiamando quel metodo.
e da lì risalire al tag e mostrare l'immagine.

Alla fine cmq lavorandoci un pò puoi ottenere qualcosa genere.
fatto in 5 minuti.

Ultima modifica effettuata da Thejuster 20/02/20 13:14
mire.forumfree.it/ - Mire Engine
C# UI Designer
20/02/20 18:27
Carlo
Postato originariamente da gianni47:
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.

Quello che ti viene proposto è frutto di un pensiero, non è detto che poi lo devi usare, il numero sarebbe servito se a priori vuoi impostare un ambiente per maneggiare un numero noto di immagini e nella cartella ci sono mescolati files diversi da immagini. Ma se hai provato il mio esempio hai visto che neanche io l'ho usato, invece ho preferito mettere un filtro nella open in modo da avere solo immagini grafiche riconosciute da VB .NET:
OfD1.Filter = "Images(*.jpg *.bmp *.png *.gif *.tif)|*.jpg;*.bmp;*.png;*.gif;*.tif|Tutti i file (*.*)|*.*"


Postato originariamente da gianni47: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

Come già ti ha comunicato Thejuster la riga è uscita da un convertitore e non è corretta la devi sostituire con:
 AddHandler p.Click, AddressOf P_Click

e l'esempio di Thejuster funzionerà.

Quello che affermo ora scaturisce dalla sola lettura del codice, non ho fatto prove.
Hai postato questo:

    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


alla riga 8 carichi un file : pic(Npbx).Image = Image.FromFile(FileName)
poi alla riga 16 ancora da una BMP: pic(Npbx).Image = bm_dest

Ritengo che la riga 8 va eliminata, forse è lei che ti da il raddoppio di immagini conteggiate.
Invece per liberare la memoria devi aggiungere dopo la riga 16 :
bm_source.Dispose()

Ti avevo anche consigliato di usare un User Control (Controllo Utente se hai VS in italiano), il vantaggio dell'user control e che non ti devi preoccupare di posizionare label e picturebox, non ti devi preoccupare neanche del clik con un indice perché il codice dell'evento click lo scrivi dentro all'user control. Avevo già un programma di esempio Visualizzatore, ora l'ho modificato con alcune idee di Thejuster, l'UserControl si chiama UC1, controlla come funziona.

Allegato zip

Se anche tu alleghi il tuo zip ci do un'occhiata.
Ultima modifica effettuata da Carlo 21/02/20 16:34
in programmazione tutto è permesso
23/02/20 20:15
gianni47

n questi giorni ho pulito diversi chili di fagioli, patate e cipolle per la fagiolata benefica del mio paese.
Ora Thejuster mi parla di C Like, CType e void del click; che verdure sono che non le conosco?
Questo per dire che di fronte a questi discorsi le mie conoscenze informatiche si fermano miseramente.
Comunque grazie al vostro contributo e alcune rielaborazioni, sono riuscito a stendere un codice che
soddisfa egregiamente le mie aspettative. La modifica sostanziale è stata quella di sostituire il Panel
con il FlowLayoutPanel ( che non conoscevo ancora ). Da qui ho implementato cornice, etichetta e il Click
che mi visualizza l'immagine selezionata ingrandita in una ImageBox.

Ed ecco il risultato attuale:

        Dim Path as string = "G:\Ilmiofotoalbum""
        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 FlowLayoutPanel1.Controls.Count = 0 Then
                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
                        FlowLayoutPanel1.Controls.Clear()
                    Case Else
                        Exit Sub
                End Select
            End If
            Dim files() As String = ofd1.FileNames
            Dim filetit As System.IO.FileInfo
            For Each FileName In files
                Dim p As Panel = New Panel()
                p.Size = New Size(wpan, hpan)   '.............. (130, 115)
                p.BackColor = Color.Silver
                p.BorderStyle = BorderStyle.FixedSingle
                Dim b As Bitmap = New Bitmap(wpan, hpan)   '.............. (130, 115)
                Dim img As Image = Image.FromFile(FileName)
                Dim gr As Graphics = Graphics.FromImage(b)
                gr.DrawImage(img, ximg, yimg, wimg, himg)   '................(4, 4, 120, 90)
                p.BackgroundImage = b
                p.Tag = FileName
                Dim labtit As New Label '--------------------------------------------- realizzazione label titolo immagine
                labtit.BackColor = Color.Beige
                filetit = My.Computer.FileSystem.GetFileInfo(FileName) '--------- rilevamento titolo immagine
                labtit.Text = (filetit.Name)
                labtit.Font = New Font(ftxt, htxt)   '....................  ("Microsoft Sans Serif", 7)
                labtit.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
                labtit.Size = New System.Drawing.Size(wpan, hlab)   '................ (130, 15)
                labtit.Location() = New Point(xlab, hpan - hlab - 3)   '.................. (0, 115 - 15 - 3)
                FlowLayoutPanel1.Controls.Add(p)
                p.Controls.Add(labtit)
                img.Dispose()
                p.Cursor = Cursors.Hand
                AddHandler p.Click, AddressOf P_Click   '---------------------- selezione immagone per ingrandimento
                AddHandler p.DoubleClick, AddressOf P_2Click   '----------- selezione immagone per catalogazione

Private Sub P_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim img As Image = Image.FromFile((CType(sender, Panel)).Tag.ToString())
        PictureBox1.BackgroundImage = img
        PictureBox1.BackgroundImageLayout = ImageLayout.Stretch
    End Sub

 Private Sub P_2Click(ByVal sender As Object, ByVal e As EventArgs)
        '------------------ da implementare -------------------
    End Sub


Ora avrei bisogno di implementare la selezione multipla con il mouse.
Se gentilmente mi potete dare qualche indizio ve ne sarei grato.
Saluto e ringrazio dell'attenzione.

Gianni
aaa
23/02/20 20:34
gianni47
Vi chiedo scusa ma ho risposto senza accorgermi che c'erano altri post nella pagina successiva.
Leggo e poi rispondo.
Scusatemi ancora, sono reduce dalla fagiolata ( preparazione e distribuzione ) e sono ancora un po fuso.

Gianni.
aaa
24/02/20 23:27
gianni47
Ciao Carlo, ho scaricato e avviato il tuo VisualizzaIMMAGINI.
Cosa dire?. Non so se essere più demoralizzato o ammirato, comunque tutti e due.
Se non fosse che realizzare programmi in VB mi intriga e mi appassiona, andrei a fare altro.

Diminuendo con gli anni le elasticità mentali, da tempo mi sono dato una direttiva nella realizzazione
dei miei programmi:
Utilizzare prevalentemente codici che conosco e su cui posso intervenire anche dopo tanto tempo.
Il metodo che mi sono creato funziona così:

Al posto dei pulsanti solitamente utilizzo le Label, e dal click o doubleclick faccio delle call a sub pubbliche,
che sono la maggioranza dei miei codici come pure le variabili. Questo metodo ha i suoi pro e contro,
ma mi permettere di adattare facilmente il programma modificando, sostituendo o eliminando alcune sub
o la sequenza della loro attuazione.

Credo che qualunque sia l'obiettivo da raggiungere e i metodi utilizzati, la programmazione stimola e
gratifica la creatività dell'artefice e dunque da coltivare senza ripensamenti, e come dici tu :
In programmazione tutto è permesso.

Ho preparato una versione demo del mio programma " almealbumfoto " (così come si pronuncia in dialetto piemontese). Ora come mi hai suggerito tenterò di allegarlo, poi con calma andrò ad analizzare più dettagliatamente il tuo progetto, dopodiché magari provo a giocare un poco per vedere se è possibile
fondere il tuo codice con il mio metodo come ho fatto in questa release.

Purtroppo nell'ambito delle mie conoscenze non ho nessuno con cui parlare e confrontarmi su questi temi,
se non in rete, perciò non finirò mai di ringraziarti per la tua disponibilità.

Gianni
aaa
25/02/20 0:35
Carlo
Quando si programma per divertimento non sei obbligato a seguire nulla, quello che va bene per te va bene per tutti.
il programma va bene, ti consiglio di modificare il filter e la directory iniziale, se la ometti il programma si riaprerà nell'ultima cartella usata.

 Public Sub sb310()   '---------------------------------- [ sb310 ] 'lmefotoalbum ---------------------- 200217
        'MsgBox("sb310")
        'Exit Sub
       ' Dim Path As String = "C:\" ' meglio ometterla
        Dim ofd1 As OpenFileDialog = New OpenFileDialog()
       ' ofd1.InitialDirectory = Path ' meglio ometterla
        ofd1.Multiselect = True
        ' ***** FILTRO PER TUTTE LE IMMAGINI ********
        ofd1.Filter = "Images(*.jpg *.bmp *.png *.gif *.tif)|*.jpg;*.bmp;*.png;*.gif;*.tif|Tutti i file (*.*)|*.*"
        ' ****************************************
        ofd1.FilterIndex = 2
        '......
        '......
        '......
        '......



Per l'implementazione successiva: click per selezionare immagini multiple, aspetto che prendi confidenza con l'user control, che semplifica di molto il compito.
Se hai domande, fai pure.
in programmazione tutto è permesso
25/02/20 20:54
gianni47
Ciao Carlo, ho riletto i precedenti post per raccogliere le idee e riuscire ad orientarmi sul tema dei contenitori.

Sto cercando di capire quale potrebbe essere il metodo migliore da utilizzare tra le due soluzioni:
Panel o flowLayoutPanel ?

Da una prima valutazione mi sembra che i risultati finali dovrebbero essere paragonabili,
escludendo ovviamente i codici esecutivi, ma credo che sicuramente ci siano delle differenze.

Siccome questa scelta è alla base di tutto il progetto, una tua opinione mi sarebbe di grande aiuto.

Per gli user control hai ragione, prima mi alleno e poi ne riparliamo.

Come al solito ringrazio e saluto.

Gianni.
aaa
26/02/20 11:25
gianni47
Ciao Carlo, per un momento stavo dimenticando quello che ho fatto fino ad ora: cercare in rete.
Non è stato così difficile capire che la scelta ovvia è il flowLayoutPanel.
Non mi sembra il caso di romperti le scatole per queste cose, quindi non disturbarti a rispondermi;
quando sarà ora stai certo che non mancherò di farmi vivo.
Un saluto.

Gianni
aaa