+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 21

Discussione: [vb2017] Errore di memoria insufficiente in user control

  1. #1
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800

    [vb2017] Errore di memoria insufficiente in user control

    Salve vorrei che qualcuno mi aiutasse a capire il Perche di questo errore visto che con gli altri visual studio non mi ha mai dato problemi…..

    questo e l'errore visualizzato all'inserimento del user control...

    Fade.png

    e questo e il codice dell'User Control

    codice:
    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.ComponentModel
    
    
    Public Class ButtonFade
    
    #Region "Costruttore"
        'vengono ereditate tutte le proprietà di un normale Button
        Inherits Button
    
        Dim RoundPath As GraphicsPath
        Dim MeRect As RectangleF
        Public Sub New()
            'imposta lo stile del pulsante, in questo caso:
            'imposta il ridisegno durante il ridimensionamento
            'imposta il DoubleBuffering per evitare sfarfallii
            'viene supportato il colore trasparente... per ogni evenienza.
            Me.SetStyle(ControlStyles.ResizeRedraw Or
                        ControlStyles.AllPaintingInWmPaint Or
                        ControlStyles.UserPaint Or
                        ControlStyles.OptimizedDoubleBuffer Or
                        ControlStyles.SupportsTransparentBackColor, True)
    
        End Sub
    #End Region
    
    #Region "Enumerazioni"
        'tipi di sfumature
        Public Enum FadeType
            Verticale
            Orizzontale
            Ruotabile
            Mediana
            Radiale
        End Enum
        'stati del pulsante
        Private Enum State
            _None
            _Enter
            _Leave
            _Down
            _Disable
        End Enum
        Dim Stato As State
    #End Region
    
    #Region "Proprietà controllo"
    
        Private _Angolo As Integer = 45
        <Description("Modifica l'angolo di sfumatura in FadeMode=Ruotabile")>
        Property FadeAngle As Integer
            Get
                Return _Angolo
            End Get
            Set(ByVal value As Integer)
                If value >= 0 And value <= 360 Then
                    _Angolo = value
                    Me.Invalidate()
                End If
            End Set
        End Property
    
        Private _FadeMode As FadeType = FadeType.Radiale
        <Description("Modifica il tipo di sfumatura")>
        Property FadeMode As FadeType
            Get
                Return _FadeMode
            End Get
            Set(ByVal value As FadeType)
                _FadeMode = value
                Me.Invalidate()
            End Set
        End Property
    
        Private _Color1 As Color = Color.Azure
        <Description("Primo colore della sfumatura sfumatura")>
        Property Color1 As Color
            Get
                Return _Color1
            End Get
            Set(ByVal value As Color)
                _Color1 = value
                Me.Invalidate()
            End Set
        End Property
    
        Private _Color2 As Color = Color.Blue
        <Description("Secondo colore della sfumatura")>
        Property Color2 As Color
            Get
                Return _Color2
            End Get
            Set(ByVal value As Color)
                _Color2 = value
                Me.Invalidate()
            End Set
        End Property
    
        <Description("Colore solido del pulsante premuto")>
        Property ColorDown As Color = Color.Silver
    
    #End Region
    
    #Region "Eventi controllo"
        ''' <summary>
        ''' Il controllo ha i bordi arrotondati e per crearli viene usata la regione del controllo
        ''' regione che durante il ridimensionamento deve essere reimpostata
        ''' Una regione può essere creata anche tramite una GraphicsPath, come in questo caso
        ''' vedi la funzione RoundRect per i particolari
        ''' </summary>    
        Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
    
            MeRect = New RectangleF(0, 0, Me.Width, Me.Height)
    
            'ricava una GraphicsPath da un rettangolo arrotondato
            RoundPath = RoundRect(MeRect, 5, 5, 5, 5)
    
            'azzera la regione precedente del controllo
            Me.Region = Nothing
            'crea la regione che ritaglia il controllo secondo il suo contenuto
            Me.Region = New Region(RoundPath)
    
            'La GraphicsPath viene aggiustata poichè servirà anche per il disegno del bordo arrotondato
            RoundPath = RoundRect(RectangleF.Inflate(MeRect, -1, -1), 5, 5, 5, 5)
    
        End Sub
        Protected Overrides Sub OnPaint(ByVal pevent As System.Windows.Forms.PaintEventArgs)
            'imposta proprietà dell'oggetto graphics per un disegno ottimale, anche se le prestazioni possono risentirne
            pevent.Graphics.TextRenderingHint = Drawing.Text.TextRenderingHint.AntiAliasGridFit
            pevent.Graphics.SmoothingMode = SmoothingMode.HighQuality
    
            'cancella il contenuto con il colore di sfondo
            pevent.Graphics.Clear(_Color2)
    
            'verifica lo stato del pulsante
    
            'se è premuto viene solo riempito con un dato colore altrimenti viene sfumato
            Select Case Stato
                Case State._Down, State._Disable
    
                    pevent.Graphics.FillRectangle(New SolidBrush(_ColorDown), MeRect)
    
                Case Else
                    'disegna la sfumatura in base alle impostazioni
                    Select Case FadeMode
                        'sfumatura con angolo variabile regolabile dalla proprietà Angolo
                        Case FadeType.Ruotabile
                            Using Pennello = New LinearGradientBrush(MeRect, _Color1, _Color2, _Angolo)
                                pevent.Graphics.FillRectangle(Pennello, MeRect)
                            End Using
                            'sfumatura orizzontale
                        Case FadeType.Orizzontale
                            Using Pennello = New LinearGradientBrush(MeRect, _Color1, _Color2, 0)
                                pevent.Graphics.FillRectangle(Pennello, MeRect)
                            End Using
                            'sfumatura verticale
                        Case FadeType.Verticale
                            Using Pennello = New LinearGradientBrush(MeRect, _Color1, _Color2, 90)
                                pevent.Graphics.FillRectangle(Pennello, MeRect)
                            End Using
                            'sfumatura mediana
                        Case (FadeType.Mediana)
                            Using Pennello = New LinearGradientBrush(MeRect, _Color1, _Color2, 90)
                                'modifica il pennello affinchè disegni una sfumatura a campana
                                Pennello.SetSigmaBellShape(0.5, 0.5)
    
                                pevent.Graphics.FillRectangle(Pennello, MeRect)
                            End Using
                            'sfumatura radiale che dal centro sfuma all'esterno
                        Case FadeType.Radiale
                            Using pat = New GraphicsPath()
                                pat.AddEllipse(MeRect)
                                Using pennello = New PathGradientBrush(pat)
                                    pennello.CenterColor = _Color1
                                    pennello.SurroundColors = {_Color2}
                                    pevent.Graphics.FillRectangle(pennello, MeRect)
                                End Using
                            End Using
    
                    End Select
    
            End Select
    
            'disegna il bordo con un colore semitrasparente
            Using penna As New Pen(Color.FromArgb(192, 0, 0, 0), 2)
                pevent.Graphics.DrawPath(penna, RoundPath)
            End Using
    
            'disegna il testo centrato sul controllo
            Using al As New StringFormat
                al.LineAlignment = StringAlignment.Center
                al.Alignment = StringAlignment.Center
                pevent.Graphics.DrawString(Me.Text, Me.Font, New SolidBrush(Me.ForeColor), MeRect, al)
            End Using
    
        End Sub
    
        Private Sub ButtonFade_EnabledChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.EnabledChanged
            Stato = If(Me.Enabled, State._None, State._Disable)
            Invalidate()
        End Sub
    
        Private Sub ButtonFade_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
            If Me.Enabled Then Stato = State._Down
        End Sub
    
        Private Sub ButtonFade_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseEnter
            If Me.Enabled Then Stato = State._Enter
        End Sub
    
        Private Sub ButtonFade_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.MouseLeave
            If Me.Enabled Then Stato = State._Leave
        End Sub
    
        Private Sub ButtonFade_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseUp
            If Me.Enabled Then Stato = State._Enter
            Me.Invalidate()
        End Sub
    
    #End Region
    
    #Region "Funzioni private"
        ''' <summary>
        ''' Questa funzione crea una GraphicsPath, la quale non è altro che 
        ''' una matrice atta a contenere delle figure grafiche, 
        ''' rettangoli, ovali, linee, ecc che vi si immettono
        ''' in questo caso una serie di curve e linee che formano 
        ''' un rettangolo dai bordi arrotondati
        ''' </summary>
        ''' <param name="r">r, r1 r2, r3 e r4 rappresentano gli spigoli del rettangolo
        ''' più grandi sono i valori più gli spigoli saranno arrotondati</param>
        ''' <returns>il valore di ritorno è una GraphicsPath che servirà per il ritaglio e il disegno</returns>
        ''' <remarks></remarks>
        Private Function RoundRect(ByVal r As RectangleF, ByVal r1 As Single, ByVal r2 As Single, ByVal r3 As Single, ByVal r4 As Single) As GraphicsPath
    
            Dim x As Single = r.X
            Dim y As Single = r.Y
            Dim w As Single = r.Width
            Dim h As Single = r.Height
    
            'ogni curva e linea si connette alla precedente formando il rettangolo
            Dim rr As New GraphicsPath()
            rr.AddBezier(x, y + r1, x, y, x + r1, y, x + r1, y)
            rr.AddLine(x + r1, y, x + w - r2, y)
            rr.AddBezier(x + w - r2, y, x + w, y, x + w, y + r2, x + w, y + r2)
            rr.AddLine(x + w, y + r2, x + w, y + h - r3)
            rr.AddBezier(x + w, y + h - r3, x + w, y + h, x + w - r3, y + h, x + w - r3, y + h)
            rr.AddLine(x + w - r3, y + h, x + r4, y + h)
            rr.AddBezier(x + r4, y + h, x, y + h, x, y + h - r4, x, y + h - r4)
            rr.AddLine(x, y + h - r4, x, y + r1)
            Return rr
    
        End Function
    #End Region
    
    End Class
    qualcuno mi aiuta ?
    Ultima modifica di AntonioG; 11-02-2019 11:25  Motivo: Modificato titolo per chiarezza

  2. #2
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,131
    Blogs
    5
    Proponi uno zip con un codice completo del controllo e di test in cui si manifesta l'errore così da poterlo provare.
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  3. #3
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800
    Antonio, intanto grazie del tuo interessamento.. poi per quanto riguarda l'errore questo si manifesta aprendo un progetto nuovo e provando di trascinare l'usercontrol ovviamente prima bisogna inserirlo nella barra degli strumenti… che zip ti potrei creare se da questo errore con un progetto nuovo ? il user control in altri progetti ma con una versione di visual studio inferiore non mi ha dato mai nessun problema…..

  4. #4
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800
    comunque se ti e' piu' comodo ti linko il progetto da provare…

    https://1drv.ms/u/s!Amkr28KUAjT6nHuH29_7oVFxdyMj

    spero che tu riesca a capire come risolvere...

  5. #5
    Dev-01 non è in linea Scolaretto
    Post
    439
    Onestamente io questo problema l'ho avuto con tutte le versioni successive alla 2010 (se parliamo di Community Edition) e mi pareva risolto nella versione Enterprise di Visual Studio 2017.

    Il designer blocca il disegno di tutta la form indicando che è impossibile trovare lo user control (persino nella soluzione stessa) o che non è stato mai dichiarato per la form corrente mentre invece il documento del designer ne riporta dichiarazione, inizializzazione e proprietà.

    Questo accade anche seguendo tutte le direttive qui esposte.

    Io risolvo dichiarando costruendo tutto da codice: funziona sempre, tranne che nelle form MDI (nelle quali da qualche versione è possibile aggiungere controlli a piacere).

    Il problema si risolve se, per necessità, il controllo viene inserito in un FlowLayoutPanel, tuttavia il problema non si limita alla renderizzazione: spesso alcune proprietà (come ad esempio l'ereditata 'Anchor') si rifiutano di funzionare correttamente.

  6. #6
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800
    Dev-01 grazie dell'interessamento, comunque ho seguito i tuoi consigli di inserire il controllo in un FlowLayoutPanel, sia da codice che trascinandolo ma purtroppo il problema rimane…. stesso errore come devo procedere ??

  7. #7
    Dev-01 non è in linea Scolaretto
    Post
    439
    Questo specifico errore io l'ho avuto solo in un caso:

    Dichiaravo un form in un MDI e dal metodo Load di quest'ultimo richiamavo una funzione che creava degli handler a dei controlli contenuti nel primo.

    L'OverFlowMemoryException chiedeva se avessi intenzione di creare matrici di controlli e se fossi sicuro di avere a disposizione abbastanza memoria per farlo.

    Tolta la chiamata il problema non si è più presentato.

    Hai una situazione simile?

  8. #8
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800
    allora speriamo che il buon Antonio abbia una soluzione se no non so come risolvere….

  9. #9
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Luogo
    Roma
    Post
    16,131
    Blogs
    5
    Subito all'inizio della OnPaint metterei

    If MeRect.Width = 0 And MeRect.Height = 0 Then Return
    Avvisi generali e importanti, a pena CHIUSURA thread e/o BAN
    Il crossposting è vietato.
    Le richieste di "pappa pronta" sono vietate.
    Utilizzate i tag CODE per il codice.
    Leggere il Regolamento per chiarimenti PRIMA di creare nuovi thread.
    Utilizzare sempre i PM per comunicare con i moderatori.
    Non mi contattate in PM per problemi di software, usate il forum

  10. #10
    L'avatar di glak
    glak non è in linea Scribacchino
    Post
    800
    Come al solito ho sperato in te ed ho avuto successo grazie Antonio...… spero di non aver avuto una gran fortuna…. ma sembra che funzioni….

+ Rispondi al Thread
Pagina 1 di 3 123 ultimoultimo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi