Parametro non valido in runtime

di il
6 risposte

Parametro non valido in runtime

Ciao a tutti, ho un problema con un piccolo programmino c#, un attributo di tipo graphics se usato in un metodo runtime, risulta "corrotto".
l'errore ha nome: System.ArgumentException: 'Parametro non valido.', e c'è dove provo ad usare il graphics per un semplice fillrectangle.
Vi allego il progetto, ho messo un key down dove se premi invio ti fa partire lo start nella user control partita, che ha come attributo questo fatidico graphics, chiamato e, avrei dovuto usarlo nel draw, ma ho visto che se viene eseguito in runtime (ho provato di tutto) non funziona nulla...
Invece se lo start viene eseguito non runtime funziona... qualcuno può gentilmente dargli una occhiata?
p.s. sono abbastanza niubbo di queste cose e sto provando a capirci qualcosa...
main ->

public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
            partita.assegna_label(ref score);
        }
        private void Main_KeyDown(object sender, KeyEventArgs e)
        {
            if (!(partita.è_startato) & e.KeyCode == Keys.Enter)
            {
                score.Text = "0";
                partita.start();
            }
            else
            {
                partita.update_imput(e.KeyCode);
            }
        }
    }
    
    
user control partita ->

    public partial class Partita : UserControl
    {
        Random random;
        public bool è_startato = false;
        Label score;
        Graphics e;
        public Partita()
        {
            InitializeComponent();
        }
        public void start()
        {
            e.FillRectangle(Brushes.Red, 0, 0, 20, 20); //prova	qua se lo start viene richiamato runtime (key down dal main) la e sembrerebbe 				 
                                                                                               //corrotta? nulla? non lo so... allego una foto.
            è_startato = true;
            Pixels pixels = new Pixels(400, 400, 20, e);
            //pixels.Draw(3, 6, 4, Color.Red, 0); //prova
            //...
            è_startato = false;
        }
        public void update_imput(Keys imput)
        {
            
        }
        private void Partita_Paint(object sender, PaintEventArgs e)
        {
            //e_.Graphics.FillRectangle(Brushes.Red, 0, 0, 20, 20); //prova
            this.e = e.Graphics;
        }
        public void assegna_label(ref Label a)
        {
            score = a;
        }
    }

Allegati:
runtime
runtime

27062_72d74bbd4db55baeb280f143d36aae4a.png
27062_72d74bbd4db55baeb280f143d36aae4a.png

6 Risposte

  • Re: Parametro non valido in runtime

    Quando verrebbe inizializzato quell'oggetto Graphics?
    E perché ne usi uno diverso da quello gestito direttamente dalla classe UserControl?
  • Re: Parametro non valido in runtime

    Alka ha scritto:


    Quando verrebbe inizializzato quell'oggetto Graphics?
    E perché ne usi uno diverso da quello gestito direttamente dalla classe UserControl?
    Grazie mille della risposta ...
    l'oggetto di tipo graphics viene inizializzato come attributo alla creazione dell'oggetto di tipo partita nel main.(L'ho chiamato e)
    ho usato nel'evento della user control per assegnare il giusto valore ad "e" di tipo graphics, esattamente qui ->
    
    private void Partita_Paint(object sender, PaintEventArgs e)
            {
                //e_.Graphics.FillRectangle(Brushes.Red, 0, 0, 20, 20); //prova
                this.e = e.Graphics;
            }
    
    Le ho provate di tutte, sarà molto probabilmente una piccola cosa che non conosco visto che so veramente poco... Grazie del tuo tempo.
  • Re: Parametro non valido in runtime

    Lorenzo45345 ha scritto:


    l'oggetto di tipo graphics viene inizializzato come attributo alla creazione dell'oggetto di tipo partita nel main.
    ho usato nel'evento della user control per assegnare il giusto valore ad "e" di tipo graphics, esattamente qui ->
    
    private void Partita_Paint(object sender, PaintEventArgs e)
            {
                //e_.Graphics.FillRectangle(Brushes.Red, 0, 0, 20, 20); //prova
                this.e = e.Graphics;
            }
    
    L'oggetto Graphics non è necessario tenerselo memorizzato, e non bisogna richiamare i suoi metodi fuori dal contesto dell'evento Paint, che è quello responsabile del tracciamento della grafica del controllo sullo schermo.

    Inserisci tutto il disegno che devi mostrare a video nell'evento Paint, e non altrove.
  • Re: Parametro non valido in runtime

    Alka ha scritto:


    Lorenzo45345 ha scritto:


    l'oggetto di tipo graphics viene inizializzato come attributo alla creazione dell'oggetto di tipo partita nel main.
    ho usato nel'evento della user control per assegnare il giusto valore ad "e" di tipo graphics, esattamente qui ->
    
    private void Partita_Paint(object sender, PaintEventArgs e)
            {
                //e_.Graphics.FillRectangle(Brushes.Red, 0, 0, 20, 20); //prova
                this.e = e.Graphics;
            }
    
    L'oggetto Graphics non è necessario tenerselo memorizzato, e non bisogna richiamare i suoi metodi fuori dal contesto dell'evento Paint, che è quello responsabile del tracciamento della grafica del controllo sullo schermo.

    Inserisci tutto il disegno che devi mostrare a video nell'evento Paint, e non altrove.
    grazie mille, sarebbe interessante a livello più tecnico capire il perchè, ma grazie mille della risposta XD.
  • Re: Parametro non valido in runtime

    Lorenzo45345 ha scritto:


    grazie mille, sarebbe interessante a livello più tecnico capire il perchè, ma grazie mille della risposta XD.
    Come prima cosa, potresti leggere la documentazione per approfondire l'argomento.

    Per sintetizzare, l'azione del disegno avviene in momenti ben specifici della vita del controllo visuale: ad esempio, quando si visualizza la prima volta la finestra, oppure quando questa viene nascosta e poi mostrata, oppure coperta da altre finestre e portata in primo piano di nuovo...

    Tutte le fasi indicate sopra prevedono che, a un certo punto, il controllo debba disegnare sé stesso: questo avviene generalmente invocando il metodo "Paint", che poi si rifà all'evento che hai ridefinito, ed è questo il momento in cui tu puoi intervenire per aggiungere il tuo "disegno" per rappresentare quello che vuoi vedere a video.

    Il disegno, una volta eseguito, non ha bisogno di essere rifatto continuamente, a meno che non si verifichi una delle situazioni indicate all'inizio, ma è il framework ad accorgersene e a invocare il "Paint" e quindi anche il tuo codice per ottenere la rappresentazione aggiornata del controllo.

    Qualsiasi disegno fuori dal contesto sopra può portare a errori, oppure a elementi grafici che non vengono mantenuti e a una serie imprecisabile di effetti collaterali.

    Se le condizioni del tuo gioco cambiano e hai bisogno di aggiornare quanto rappresentato a video, la soluzione non è quella di disegnare la situazione aggiornata direttamente, bensì quella di suggerire al controllo che ha bisogno di un "Repaint" perché qualcosa è cambiato, e sarà il controllo stesso a ridisegnarsi invocando anche la tua logica, che ovviamente dovrà tenere conto della situazione aggiornata.

    Dovrebbe essere tutto più chiaro così, spero.
  • Re: Parametro non valido in runtime

    Grazie mille XD, ora è tutto chiaro
Devi accedere o registrarti per scrivere nel forum
6 risposte