Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - info
Forum - C# / VB.NET - info

Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 12:10
Martedì, 31/10/2023
buongiorno a tutti, è da un po di tempo che non vengo su questo forum, ho ripreso un vecchio progetto che avevo accantonato x via di mancanza di tempo, premetto che ciò che scrivo non è mio, ho copiato uno schema per avere un custom progressbar x controllare il volume del mio media player, perche la progressbar che da il sistema non mi piace, solo che mi da un errore che non capisco, potete aiutarmi voi gentilmente? allego il codice che ho copiato
ps. scusate se ho copiato ma di disegno progettuale non capisco niente, le mie competenze arrivano fino ad un certo punto.
il form è un form .cs
Codice sorgente - presumibilmente C++

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Drawing;
  5. using System.Data;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10.  
  11. namespace WindowsFormsApp1
  12. {
  13.     public partial class volume_control : UserControl
  14.     {
  15.         public volume_control()
  16.         {
  17.             InitializeComponent();
  18.             this.Size = new Size(350, 30);
  19.             this.BackColor = Color.Black;
  20.             DoubleBuffered = true;
  21.         }
  22.  
  23.         int pb_value = 40, pb_Min = 0, pb_Max = 100;
  24.  
  25.         public int Max { get { return pb_Max; } set { pb_Max = value; Invalidate(); } }
  26.         public int Min { get { return pb_Min; } set { pb_Max = value; Invalidate(); } }
  27.         public int value { get { return pb_value; } set { pb_value = value; Invalidate(); } }
  28.         public int gap = 10;
  29.  
  30.         Color b_color = Color.Aqua;
  31.         public Color Bar_color { get { return b_color; } set { b_color = value;Invalidate(); } }
  32.  
  33.         private void volume_control_Paint(object sender, PaintEventArgs e)
  34.         {
  35.             int start_point = 40;
  36.             SolidBrush sb = new SolidBrush(Color.DimGray);
  37.             for (int j = 0; j < (Max * ClientSize.Width / Max - 75) / gap;j++)
  38.  
  39.  
  40.             {
  41.                 e.Graphics.FillRectangle(sb, new Rectangle(start_point, 0, gap - 5, ClientSize.Height));
  42.                 start_point += gap;
  43.             }
  44.             int buffer_point = 40;
  45.             SolidBrush br = new SolidBrush(b_color);
  46.  
  47.             for(int i=0; i < (pb_value*ClientSize.Width / Max - pb_value) / gap;i++)
  48.  
  49.             {
  50.                 e.Graphics.FillRectangle(br, new Rectangle(buffer_point, 0, gap - 2, ClientSize.Height));
  51.                 buffer_point += gap;
  52.             }
  53.  
  54.             int thum_size = 25;
  55.             SolidBrush thumb = new SolidBrush(Color.White);
  56.             e.Graphics.FillRectangle(thumb, new Rectangle(buffer_point, 0, thum_size, ClientSize.Height));
  57.  
  58.             if(pb_value>=Min)
  59.             {
  60.                 Image left_img = Properties.Resources.down_img;
  61.                 e.Graphics.DrawImage(left_img , 5, 0, ClientSize.Height, ClientSize.Height);
  62.  
  63.             }
  64.             if (pb_value <= 50)
  65.             {
  66.                 Image right_img = Properties.Resources.mid_img;
  67.                 e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height);
  68.  
  69.             }
  70.             if (pb_value <= Min)
  71.             {
  72.                 Image left_img = Properties.Resources.mute_img;
  73.                 e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height);
  74.  
  75.             }
  76.             if (pb_value >= 50)
  77.             {
  78.                 Image right_img = Properties.Resources.high_img;
  79.                 e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height);
  80.  
  81.             }
  82.  
  83.         }
  84.         bool mouse = false;
  85.         private void volume_control_MouseDown(object sender, MouseEventArgs e)
  86.         {
  87.             mouse = true;
  88.             Bar_value(thumb_value(e.X));
  89.  
  90.  
  91.         }
  92.  
  93.         private void volume_control_MouseMove(object sender, MouseEventArgs e)
  94.         {
  95.             if (!mouse) return;
  96.             Bar_value(thumb_value(e.X));
  97.  
  98.         }
  99.  
  100.         private void volume_control_MouseUp(object sender, MouseEventArgs e)
  101.         {
  102.             mouse = false;
  103.         }
  104.  
  105.         private void Bar_value(float value)
  106.         {
  107.             if (value < Min) value = Min;
  108.             if (value > Max) value = Max;
  109.             if (pb_value == value) return;
  110.             pb_value = (int)value;
  111.             this.Refresh();
  112.  
  113.         }
  114.         private float thumb_value(int x)
  115.         {
  116.             return Min + (Max - Min) * x / (float)(ClientSize.Width);
  117.  
  118.         }
  119.     }
  120. }



il problema è che alla riga 37 mi dice "eccezione non gestita"
System.DivideByZeroException: 'Tentativo di divisione per zero.'

che vuol dire?
grazie mille


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1351
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:11
Martedì, 31/10/2023
Prima di usare l'UserControl, devi inserire un valore per Max, altrimenti essendo zero hai l'errore.

Nel codice del form principale:

Codice sorgente - presumibilmente C++

  1. using System.Windows.Forms;
  2.  
  3. namespace WindowsFormsApp1
  4. {
  5.     public partial class Form1 : Form
  6.     {
  7.         public Form1()
  8.         {
  9.             InitializeComponent();
  10.             volume_control1.Max = 100;
  11.         }
  12.     }
  13. }



L'UserControl non sembra pensato per essere inserito da progettazione ma da codice:

Codice sorgente - presumibilmente C++

  1. using System.Windows.Forms;
  2.  
  3. namespace WindowsFormsApp1
  4. {
  5.     public partial class Form1 : Form
  6.     {
  7.         volume_control vc = new volume_control(); // nuova ProgressBar vc
  8.         public Form1()
  9.         {
  10.             InitializeComponent();
  11.             vc.Max = 100;
  12.             vc.Left = 100;
  13.             vc.Top = 100;
  14.             this.Controls.Add(vc);
  15.         }
  16.     }
  17. }



In alternativa si potrebbe aggiungere una riga in volume_control_Paint per evitare che Max valga zero: if (Max == 0) Max = 100;

Ultima modifica effettuata da Carlo il 31/10/2023 alle 17:10


in programmazione tutto è permesso
PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 17:23
Martedì, 31/10/2023
Grazie mille, quando vado a casa provo

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 10:49
Mercoledì, 01/11/2023
ecco tutto il cod. che uso x il mio player
Codice sorgente - presumibilmente VB.NET

  1. Imports WMPLib
  2. Imports System.IO
  3. Imports TagLib.Id3v2
  4. Public Class media_pleyer
  5.     Dim numero As Integer
  6.     Dim canzoni() As String
  7.     Dim i As Integer
  8.     Dim musica As String
  9.     Dim indice As Integer
  10.     Dim playing As Boolean
  11.  
  12.     Private Sub Nexttrack()
  13.         indice = List_canzoni.SelectedIndex
  14.         indice = indice + 1
  15.         If indice = Label4.Text Then
  16.             indice = 0
  17.         End If
  18.         List_canzoni.SelectedIndex = indice
  19.  
  20.     End Sub
  21.  
  22.     Private Sub Previoustrack()
  23.         indice = List_canzoni.SelectedIndex
  24.         indice = indice - 1
  25.         If indice < 0 Then
  26.             indice = Label4.Text - 1
  27.         End If
  28.         List_canzoni.SelectedIndex = indice
  29.     End Sub
  30.     Private Sub Button5_Click(sender As Object, e As EventArgs) Handles btn_open.Click
  31.         AxWindowsMediaPlayer1.Visible = True
  32.         List_canzoni.Visible = True
  33.  
  34.         FolderBrowserDialog1.ShowDialog()
  35.         If FolderBrowserDialog1.SelectedPath = "" Then
  36.  
  37.             Exit Sub
  38.         Else
  39.             canzoni = System.IO.Directory.GetFiles(FolderBrowserDialog1.SelectedPath)
  40.  
  41.         End If
  42.         For i = 0 To canzoni.Length - 1
  43.             ListBox1.Items.Add(canzoni(i))
  44.             List_canzoni.Items.Add(System.IO.Path.GetFileName(canzoni(i)))
  45.         Next
  46.  
  47.         numero = List_canzoni.Items.Count
  48.         Label4.Text = numero
  49.         btn_play.Enabled = True
  50.  
  51.  
  52.     End Sub
  53.  
  54.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles btn_play.Click
  55.         Timer2.Enabled = True
  56.         List_canzoni.SelectedIndex = 0
  57.         ListBox1.SelectedIndex = List_canzoni.SelectedIndex
  58.         musica = ListBox1.Text
  59.         AxWindowsMediaPlayer1.URL = musica
  60.         musica = ListBox1.SelectedItem
  61.         AxWindowsMediaPlayer1.URL = musica
  62.         lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
  63.  
  64.     End Sub
  65.  
  66.     Private Sub Button6_Click(sender As Object, e As EventArgs) Handles btn_pause.Click
  67.         If playing Then
  68.             AxWindowsMediaPlayer1.Ctlcontrols.pause()
  69.         Else
  70.             AxWindowsMediaPlayer1.Ctlcontrols.play()
  71.         End If
  72.         playing = Not playing
  73.     End Sub
  74.  
  75.     Private Sub Button2_Click(sender As Object, e As EventArgs) Handles btn_stop.Click
  76.         AxWindowsMediaPlayer1.URL = ""
  77.         Timer2.Enabled = False
  78.         lb_title.Text = "Title"
  79.         Label3.Text = "00:00"
  80.         Label6.Text = "00:00"
  81.         TrackBar3.Value = 0
  82.     End Sub
  83.  
  84.     Private Sub Button3_Click(sender As Object, e As EventArgs) Handles btn_next.Click
  85.         Nexttrack()
  86.         lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
  87.     End Sub
  88.  
  89.     Private Sub Button4_Click(sender As Object, e As EventArgs) Handles btn_previous.Click
  90.         Previoustrack()
  91.         lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
  92.     End Sub
  93.  
  94.     Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles trc_volume.Scroll
  95.         AxWindowsMediaPlayer1.settings.volume = trc_volume.Value
  96.         lb_volume.Text = trc_volume.Value.ToString + "%"
  97.     End Sub
  98.  
  99.     Private Sub media_pleyer_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  100.         List_canzoni.Visible = False
  101.         trc_volume.Value = AxWindowsMediaPlayer1.settings.volume
  102.         btn_play.Enabled = False
  103.         lb_volume.Text = "50%"
  104.  
  105.     End Sub
  106.     Private Sub Button9_Click(sender As Object, e As EventArgs) Handles btn_fullscreen.Click
  107.         AxWindowsMediaPlayer1.fullScreen = True
  108.     End Sub
  109.  
  110.     Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
  111.         Timer2.Interval = 60
  112.         Label3.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentPositionString
  113.         Label6.Text = AxWindowsMediaPlayer1.currentMedia.durationString
  114.  
  115.         Dim cur As Integer = AxWindowsMediaPlayer1.Ctlcontrols.currentPosition
  116.         Dim len As Integer = AxWindowsMediaPlayer1.currentMedia.duration
  117.  
  118.         TrackBar3.Value = cur
  119.         TrackBar3.Maximum = len
  120.         If TrackBar3.Value = 100 Then
  121.             TrackBar3.Value = 0
  122.         End If
  123.  
  124.  
  125.     End Sub
  126.  
  127.     Private Sub AxWindowsMediaPlayer1_Enter(sender As Object, e As EventArgs) Handles AxWindowsMediaPlayer1.Enter
  128.         AxWindowsMediaPlayer1.fullScreen = False
  129.     End Sub
  130.  
  131.     Private Sub TrackBar3_Scroll(sender As Object, e As EventArgs) Handles TrackBar3.Scroll
  132.         AxWindowsMediaPlayer1.Ctlcontrols.currentPosition = TrackBar3.Value
  133.     End Sub
  134.     Private Sub ListBox2_SelectedIndexChanged(sender As Object, e As EventArgs) Handles List_canzoni.SelectedIndexChanged
  135.         Label2.Text = List_canzoni.SelectedIndex
  136.         ListBox1.SelectedIndex = List_canzoni.SelectedIndex
  137.         musica = ListBox1.Text
  138.         AxWindowsMediaPlayer1.URL = musica
  139.         Timer2.Enabled = True
  140.         lb_title.Text = AxWindowsMediaPlayer1.Ctlcontrols.currentItem.name
  141.  
  142.  
  143.  
  144.     End Sub
  145.     Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  146.         Label7.Text = Now.Hour & ":" & Now.Minute & ":" & Now.Second
  147.     End Sub
  148.  
  149. End Class


PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 10:54
Mercoledì, 01/11/2023
scusate ho sbagliatp post dove postare il cod, ma non so come cancellarlo, questo è il cod, che uso x il mio player e dove voglio usare la custom progrressbar per il controllo del volume

PM Quote
Avatar
nightwolf (Normal User)
Pro


Messaggi: 149
Iscritto: 14/09/2010

Segnala al moderatore
Postato alle 19:27
Mercoledì, 01/11/2023
grazie mille adesso tutto funziona. un altra domanda, è possibile usare questo controllo nel mio progetto vb.net essendo un progetto in c#? come posso importarlo?

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2308
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 22:14
Mercoledì, 01/11/2023
creare una libreria in vb.net, in seguito importare la libreria ed usarlo nel progetto c#.

Edit:

Comunque non sò, ma rileggendo un pò il codice a me sembra corretto carlo.

Codice sorgente - presumibilmente C++

  1. int pb_value = 40, pb_Min = 0, pb_Max = 100;
  2.  
  3. public int Max { get { return pb_Max; } set { pb_Max = value; Invalidate(); } }



In tutti i miei progetti C# con controlli che realizzo, eseguo la medesima procedura.
Alla fine Max è solo una proprietà che restituisce pb_Max, e assegna pb_Max il valore, ridisegnando il controllo.
Mi sembra strano che gli abbia dato errore in quel punto.

Ad esempio qui
https://github.com/MakingItalia/MMORpgmaker/blob/master/Cli ...

Alcune proprietà come IsPassword o Visibile sono gestite direttamente dalle variabili.
e non vengono assegnate al costruttore.

Magari non so il contesto è diverso, non saprei spiegarmi la motivazione altrimenti.
ho scritto tutto questo giusto per curiosità, perché mi sembra molto strano.


Ultima modifica effettuata da Thejuster il 01/11/2023 alle 22:28


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1351
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 2:02
Giovedì, 02/11/2023
Testo quotato

Postato originariamente da Thejuster:

Comunque non sò, ma rileggendo un pò il codice a me sembra corretto carlo.




Sono perplesso anche io, l'userControl così come scritto se trascinato nel form da progettazione viene correttamente inserito e nelle proprietà Max vale 100. E' sufficiente uscire da progettazione e rientrare e l'userControl segnala la divisione per zero, le proprietà non sono più accessibili...
Ho provato cn VS2017 e VS2022.

@nightwolf

Il controllo lo puoi usare da vb.net come indicato da Thejuster, oppure convertirlo in VB.Net, meglio sarebbe se converti il tuo programma in C#, ma questo esula dalla discussione.

Per usare l'userControl nel tuo progetto VB.Net procedi come segue:
Su [Esplora soluzioni] sopra al nome del progetto clicca con il tasto destro e scegli dal menù: Aggiungi/Controllo utente, dai il nome all'userControl: volume_control.vb
si apre la pagina progettazione dell'userControl, vai al codice con F7, incolla il codice vb:

Codice sorgente - presumibilmente VB.NET

  1. Partial Public Class volume_control
  2.  
  3.     Public Sub New()
  4.         InitializeComponent()
  5.         Me.Size = New Size(350, 30)
  6.         Me.BackColor = Color.Black
  7.         DoubleBuffered = True
  8.     End Sub
  9.  
  10.     Private pb_value As Integer = 40, pb_Min As Integer = 0, pb_Max As Integer = 100
  11.  
  12.         Public Property Max As Integer
  13.             Get
  14.                 Return pb_Max
  15.             End Get
  16.             Set(ByVal value As Integer)
  17.                 pb_Max = value
  18.                 Invalidate()
  19.             End Set
  20.         End Property
  21.  
  22.         Public Property Min As Integer
  23.             Get
  24.                 Return pb_Min
  25.             End Get
  26.             Set(ByVal value As Integer)
  27.                 pb_Max = value
  28.                 Invalidate()
  29.             End Set
  30.         End Property
  31.  
  32.         Public Property value As Integer
  33.             Get
  34.                 Return pb_value
  35.             End Get
  36.             Set(ByVal value As Integer)
  37.                 pb_value = value
  38.                 Invalidate()
  39.             End Set
  40.         End Property
  41.  
  42.         Public gap As Integer = 10
  43.         Private b_color As Color = Color.Aqua
  44.  
  45.         Public Property Bar_color As Color
  46.             Get
  47.                 Return b_color
  48.             End Get
  49.             Set(ByVal value As Color)
  50.                 b_color = value
  51.                 Invalidate()
  52.             End Set
  53.         End Property
  54.  
  55.     Private Sub volume_control_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) Handles MyBase.Paint
  56.         If Max = 0 Then Max = 100
  57.         Dim start_point As Integer = 40
  58.         Dim sb As SolidBrush = New SolidBrush(Color.DimGray)
  59.  
  60.         For j As Integer = 0 To (Max * ClientSize.Width / Max - 75) / gap - 1
  61.             e.Graphics.FillRectangle(sb, New Rectangle(start_point, 0, gap - 5, ClientSize.Height))
  62.             start_point += gap
  63.         Next
  64.  
  65.         Dim buffer_point As Integer = 40
  66.         Dim br As SolidBrush = New SolidBrush(b_color)
  67.  
  68.         For i As Integer = 0 To (pb_value * ClientSize.Width / Max - pb_value) / gap - 1
  69.             e.Graphics.FillRectangle(br, New Rectangle(buffer_point, 0, gap - 2, ClientSize.Height))
  70.             buffer_point += gap
  71.         Next
  72.  
  73.         Dim thum_size As Integer = 25
  74.         Dim thumb As SolidBrush = New SolidBrush(Color.White)
  75.         e.Graphics.FillRectangle(thumb, New Rectangle(buffer_point, 0, thum_size, ClientSize.Height))
  76.  
  77.         If pb_value >= Min Then
  78.             Dim left_img As Image = My.Resources.down_img
  79.             e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height)
  80.         End If
  81.  
  82.         If pb_value <= 50 Then
  83.             Dim right_img As Image = My.Resources.mid_img
  84.             e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height)
  85.         End If
  86.  
  87.         If pb_value <= Min Then
  88.             Dim left_img As Image = My.Resources.mute_img
  89.             e.Graphics.DrawImage(left_img, 5, 0, ClientSize.Height, ClientSize.Height)
  90.         End If
  91.  
  92.         If pb_value >= 50 Then
  93.             Dim right_img As Image = My.Resources.high_img
  94.             e.Graphics.DrawImage(right_img, ClientSize.Width - 35, 0, ClientSize.Height, ClientSize.Height)
  95.         End If
  96.     End Sub
  97.  
  98.     Private mouse As Boolean = False
  99.  
  100.     Private Sub volume_control_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown
  101.         mouse = True
  102.         Bar_value(thumb_value(e.X))
  103.     End Sub
  104.  
  105.     Private Sub volume_control_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseMove
  106.         If Not mouse Then Return
  107.         Bar_value(thumb_value(e.X))
  108.     End Sub
  109.  
  110.     Private Sub volume_control_MouseUp(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseUp
  111.         mouse = False
  112.     End Sub
  113.  
  114.     Private Sub Bar_value(ByVal value As Single)
  115.             If value < Min Then value = Min
  116.             If value > Max Then value = Max
  117.             If pb_value = value Then Return
  118.             pb_value = CInt(value)
  119.             Me.Refresh()
  120.         End Sub
  121.  
  122.     Private Function thumb_value(ByVal x As Integer) As Single
  123.         Return Min + (Max - Min) * x / CSng((ClientSize.Width))
  124.     End Function
  125.  
  126. End Class



Dovresti riscontrare la presenza di 4 errori perché mancano le immagini, salva tutto, vai su [Esplora soluzioni] e clicca sopra al nome del progetto con il tasto destro, questa volta dal menù scegli: proprietà, nella pagina che si apre scegli: Risorse, nei menù seleziona: Aggiungi risorsa/Aggiungi file esistente: scegli le 4 immagini che serviranno a personalizzare la grafica, i nomi devono essere: down_img, mid_img, mute_img e high_img.
Ora non ci devono essere più errori.
Bisogna attivare gli eventi, torna in volume_control.vb(progettazione), in basso a destre c'è la pagina delle proprietà, clicca l'iconcina a forma di fulmine per visualizzare gli eventi, scorri gli eventi e trova: MouseDown a destra seleziona la routine che deve essere eseguita quando si schiaccia il mouse: volume_control_MouseDown
fai lo stesso con:
MouseMove - volume_control_MouseMove
MouseUp - volume_control_MouseUp
Paint - volume_control_Paint

Salva tutto, vai in media_pleyer(progettazione) e sulla casella degli strumenti trovi in alto l'userControl: volume_control, trascina nel form ed usalo come una HScrollBar normale.

Se hai problemi chiedi.

Ultima modifica effettuata da Carlo il 02/11/2023 alle 2:09


in programmazione tutto è permesso
PM Quote