Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C#] Utilizzare label in una classe esterna

    Salve,
    ho creato un nuovo progetto C# (in realtà sto lavorando con il compact framework per cellullari), e mi da il classico form in cui ho trascinato dentro una nuova label.

    Dopo ho creato a parte una nuova classe, esterna al form, che deve modificarmi la label. La label l'ho messa di tipo public ma se faccio "Form1.label1.text" ma mi da errore perchè mi vede Form1 ma non label1.

    Da cosa dipende? come si fa?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  2. #2
    Se tu guardi in progettazione, nelle propretà della Label c'è un parametro dove puoi modificarne lo scope (normalmente un controllo è Friend e non può essere utilizzato se non nella classe dove è istanziato)
    Mi contraddico facilmente, ma lo faccio così spesso che questo fa di me una persona coerente [Caparezza]
    Se la conoscenza crea problemi, non è con l'ignoranza che li si risolve [Isaac Asimov]
    >>>Visita il mio blog<<<

  3. #3
    Fa così perché dalla classe esterna non è visibile l'istanza del form principale, ma la definizione (la classe) a cui il form appartiene.

    Io in genere dichiaro il costruttore della classe secondaria con il parametro del tipo della classe Form1, l'assegno ad una variabile globale (alla classe), ad esempio ParentForm. e al momento che sulla routine devo fare riferimento alla classe secondaria, gli passo Me.
    Sulla classe secondaria, basta fare riferimento a ParentForm.Label1

  4. #4
    Non sto riuscendo a capire.

    Cioè io in form1.designer.cs ho importato che la mia label è pubblica. Poi il problema qual'è? che non riesco sostanzialmente a passare il riferimento a form1 alla mia classe esterna?

    Le classi però le richiamo in form1, non c'è modo di passargli come parametro qualcosa tipo "this" alle classi che richiamo? come dite voi tramite parametro. Ma il mio form1 di che tipo è? che tipo di parametro devo prevedere? Form? e sopratutto posso passare semplicemente "this" per avvalorare il parametro?

    Cioè io richiamo in form1 la classe
    codice:
    public class miaclasse ()
    che paramtro devo prevedere in mia classe per passargli il form? e per passargli il form come faccio?
    "Estremamente originale e fantasioso" By darkiko;
    "allora sfiga crepuscolare mi sa che e' meglio di atmosfera serale" By NyXo;
    "per favore, già è difficile con lui" By fcaldera;
    "se lo apri te e invece di "amore" ci metti "lavoro", l'effetto è lo stesso" By fred84

  5. #5
    Come ho detto prima, le cose non vanno confuse. Form1 è il nome della classe, non dell'istanza del form visualizzato. Quindi quando dall'esterno vedi Form1, non vedi il form, ma solo la classe che lo definisce. Il tuo Form1 è di tipo Form1, e il parametro deve essere di tipo Form1. Tutto qui.

    Un esempio:

    codice:
      public partial class Form1 : Form
      {
        public Form1()
        {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
          Prova x = new Prova(this);
          this.label1.Text="";
          x.Richiama("Prova");
        }
      }
    
      public class Prova
      {
        Form1 ParentForm;
        public Prova(Form1 Parent)
        {
          ParentForm = Parent;
        }
        public void Richiama(string Val)
        {
          MyParent.label1.Text = Val;
        }
      }
    Per far capire, il seguente codice definisce una classe:
    codice:
      public class Prova
      {
        int a;
        static string b;
        void UnaRoutine()
        {
          a = 1;
          b = "Prova";
        }
        void UnAltraRoutine()
        {
          a = 2;
          b = "Prova N. 2";
        }
      }
    Il seguente codice definisce una serie di istanze di quella classe:
    codice:
        Prova x1,x2;
        Prova[] PrArr;
    x1 e x2 sono istanze di quella classe, Prova è un array di istanze di quella classe.
    Se io faccio x1.a = 4 e x2.a = 17, le due istanze avranno il valore a pari a 4 e 17 rispettivamente.
    Gli oggetti facenti parte della classe possono essere definiti rispetto alla classe solo se dichiarati statici (come b).
    Se io faccio x1.UnaRoutine, sia x1.b che x2.b saranno pari a "Prova" perché la variabile b viene impostata sulla classe e non sulle istanze.
    In questo caso posso fare anche Prova.b = "Qualcosa".
    Fin qui è chiaro?

    A questo punto devi considerare che il Form1 è paragonabile a Prova, e il form che vedi sullo schermo è come x1 (anche se non esiste nessuna variabile, eccetto this, a cui tale form si riferisce), e che la label è come la variabile a, e non come la variabile b.
    Per farte in modo che la variabile a sia visibile da un'altra classe, devi passare this al di fuori di Form1. Tutto qui

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.