Modificare il testo di una Label creata runtime

di il
30 risposte

30 Risposte - Pagina 2

  • Re: Modificare il testo di una Label creata runtime

    17/05/2024 - GarGia1960 ha scritto:


    Ciao,

    io quando creo un controllo a runtime lo richiamo con il comando:

    Dim lbls() As Control = Me.Controls.Find(ControlName, True) 
    Dim lbl As Label = CType(lbls(0), Label) 

    Basta cambiare il tipo di controllo, Label, Button, TextBox, …. ecc.

    E se non conosco il nome del controllo?

  • Re: Modificare il testo di una Label creata runtime

    Di solito quando si programma si mette sempre un nome, almeno quando si prevede di usarlo.

  • Re: Modificare il testo di una Label creata runtime

    18/05/2024 - GarGia1960 ha scritto:


    Di solito quando si programma si mette sempre un nome, almeno quando si prevede di usarlo.

    Beh, delphi si inca…vola se un oggetto non ha un nome…

    La mia osservazione è: se creo n oggetti nominati oggetto+idrecord dove l'id lo prendo dall'id del record di una tabella.

    Al click sull'oggetto  mi ricavo il nome dell'oggetto e so che la parte finale è l'id del record.

    Non sapendo quanti oggetti creo, e quale id viene associato in delphi so come trovare il nome dell'oggetto che ho clikkato ma con vb.net? 

    Non sono riuscito a trovare la funzione che, come in delphi, mi da vita morte e miracoli di quell'oggetto creato a runtime (anche l'ora della sua creazione).

    È questa la mia osservazione..

  • Re: Modificare il testo di una Label creata runtime

    18/05/2024 - GarGia1960 ha scritto:


    Di solito quando si programma si mette sempre un nome, almeno quando si prevede di usarlo.

    Ah certo, se prevedi di usare il nome, devi mettere un nome. :)

    Il punto è che nello scenario attuale non è efficiente metterlo e non servirebbe.

  • Re: Modificare il testo di una Label creata runtime

    Diciamo pure che se prevedi di mettere qualcosa, che sia a design time o a run time deve avere un nome…

    Come fate a mettere un pulsante senza nome? O una label senza nome? Mah!

    Il punto è: sr il nome lo mette l'utente (che so… ambarabaciccicocco) da programma, come fai ad assegnare alla label amarabaciccicocco il valore “prova”?

    Credo sia questa la dimanda dell'autore del post. Si ok findcontrol o altro ma in ogni caso vuole il nome.

    Ora supponiamo che l'utente crea anche le label “trecivettesulcomo” e “passapaperino”, come faccio a distinguere il comando su tre label?

     ma potrebbero essere tre oggetti non necessariamente label…

  • Re: Modificare il testo di una Label creata runtime

    20/05/2024 - sihsandrea ha scritto:


    Diciamo pure che se prevedi di mettere qualcosa, che sia a design time o a run time deve avere un nome…

    A designtime, in WinForms, il nome va obbligatoriamente messo perché la libreria usa quell'identificatore per impostare le proprietà, generando codice all'interno del file *.Designer.cs.

    A runtime, ossia creando il controllo tramite codice al di fuori del designer, il controllo NON richiede di avere un nome, e NON ha senso metterlo.

    20/05/2024 - sihsandrea ha scritto:


    Come fate a mettere un pulsante senza nome? O una label senza nome? Mah!

    Se non voglio distinguere i controlli per nome, perché devo per forza attribuire un nome?

    18/05/2024 - sihsandrea ha scritto:


    Beh, delphi si inca…vola se un oggetto non ha un nome…

    Non è vero: infatti ha perfettamente senso avere componenti senza nome, se non voglio associarvi eventi specifici o riferirmi a quel componente tramite codice. Questo in linea generale, anche quando si usa il designer.

    Quando parliamo invece di controlli a runtime, a maggior ragione perché generando componenti tramite codice è un segnale evidente che sto producendo quei componenti a fronte di un'altra struttura dati che guida la creazione di quei componenti, e pertanto il loro riferimento può essere memorizzato e strutturato in modo diverso rispetto all'uso di un nome, che è sempre inefficiente.

    20/05/2024 - sihsandrea ha scritto:


    Il punto è: sr il nome lo mette l'utente (che so… ambarabaciccicocco) da programma, come fai ad assegnare alla label amarabaciccicocco il valore “prova”?

    Il riferimento a quella Label è un riferimento a un oggetto, in fondo, quindi io posso recuperarlo, memorizzarlo e successivamente ottenerlo in milioni di altri modi che non sia passando attraverso la FindControl.

    20/05/2024 - sihsandrea ha scritto:


    Ora supponiamo che l'utente crea anche le label “trecivettesulcomo” e “passapaperino”, come faccio a distinguere il comando su tre label?

    Il punto è questo: se i controlli vengono creati a runtime, ciò avviene per un motivo. Mettiamo di dover mostrare 1000 valori all'interno di un Form, farò un ciclo che per ogni valore crea una Label in cui mostrare il dato, magari in un layout che possa disporle affiancate o separandole con un ciclo che incrementa X e Y nella posizione. Non ha senso attribuire a questi controlli un nome: è sufficiente memorizzarle in fase di creazione all'interno di una lista indicizzata, oppure in una struttura che i riferimenti al controllo e al dato che deve essere mostrato. In poche parole, qualunque struttura che non dipenda da un nome e dalla ricerca dello stesso con un ciclo lineare è preferibile.

    20/05/2024 - sihsandrea ha scritto:


     ma potrebbero essere tre oggetti non necessariamente label…

    Appunto, può trattarsi di qualunque oggetto, quindi da dove proverrebbe la regola che per identificare un componente o un controllo, quindi un oggetto, io devo per forza dargli un nome? Se lo creo a runtime, salvo il suo riferimento in un campo del Form (che poi è l'equivalente di dare un nome a designtime), ma posso scegliere qualunque altra struttura dati. Ovvio che se ne creo uno solo, il problema non si pone, ma per N componenti/controlli il senso di usare un nome diminuisce ancora di più.

    Se in .NET non è stato replicato il concetto di “matrice di controlli” presente nel vecchio VB6, un motivo c'è…

  • Re: Modificare il testo di una Label creata runtime

    Uhm… dove trovo riscontro di quanto affermi?

    Se prendo un componente e lo metto su un form mi ritrovo, a titolo di esempio, button1. Se tolgo il nome mi va in errore perché manca il nome.

  • Re: Modificare il testo di una Label creata runtime

    20/05/2024 - sihsandrea ha scritto:


    Uhm… dove trovo riscontro di quanto affermi?

    Se prendo un componente e lo metto su un form mi ritrovo, a titolo di esempio, button1. Se tolgo il nome mi va in errore perché manca il nome.

    E' esattamente quello che dico nella primissima riga del mio messaggio sopra, che ti quoto di seguito:

    A designtime, in WinForms, il nome va obbligatoriamente messo perché la libreria usa quell'identificatore per impostare le proprietà, generando codice all'interno del file *.Designer.cs.

    Questo è l'unico scenario in cui sei costretto a dare (o tenere come default) un nome al componente/controllo che inserisci sulla superficie di disegno, perché in WinForms le proprietà non sono serializzate ma definite tramite codice, e quindi un nome per il campo associato al componente/controllo va dato obbligatoriamente, per un requisito del framework.

    In Delphi - ad esempio - il nome lo puoi cancellare, anche in fase di progettazione (purché rimanga almeno un riferimento al tipo nel codice).

    In TUTTI gli altri scenari (altri framework e/o in WinForms a runtime), il nome non è richiesto, e creando i controlli a runtime è del tutto opzionabile, come requisito, ed evitabile, come modo di individuare l'oggetto corrispondente, perché la FindControl() non è efficiente.

    Certo, non è illegale usarla, di sicuro è la soluzione più immediata, non c'è da crocifiggere chi lo fa, ma vi sono altre soluzioni più efficaci, anche se richiedono un minimo di conoscenze in più, ma neanche tante (se si sviluppano applicazioni in .NET che non siano “micro tool”).

  • Re: Modificare il testo di una Label creata runtime

    20/05/2024 - sihsandrea ha scritto:


    Credo sia questa la dimanda dell'autore del post. Si ok findcontrol o altro ma in ogni caso vuole il nome.

    Sì, SIhsandrea, era questa la mia necessità. 
    Ringrazio tutti per le risposte da cui c'è sempre da imparare.

  • Re: Modificare il testo di una Label creata runtime

    Si ma hai risolto? Senza dare un nome alla label?

    Io sono curioso… con vb.net

  • Re: Modificare il testo di una Label creata runtime

    Il messaggio precedente non era completo e non pensavo di averlo inviato

    20/05/2024 - sihsandrea ha scritto:


    Credo sia questa la dimanda dell'autore del post. Si ok findcontrol o altro ma in ogni caso vuole il nome.

    Effettivamente con il nome è molto più intuitiva e facile da usare …

    20/05/2024 - Alka ha scritto:


    Certo, non è illegale usarla, di sicuro è la soluzione più immediata, non c'è da crocifiggere chi lo fa, ma vi sono altre soluzioni più efficaci, anche se richiedono un minimo di conoscenze in più, ma neanche tante (se si sviluppano applicazioni in .NET che non siano “micro tool”).

    … e soprattutto immediata per chi non ha tutta questa dimestichezza con la programmazione.

    Controls("Display").Text = "HELLO WORLD"

    Funziona perfettamente.

    Grazie e alla prossima.

  • Re: Modificare il testo di una Label creata runtime

    26/05/2024 - joker7421 ha scritto:


    Effettivamente con il nome è molto più intuitiva e facile da usare …

    Inizialmente sì, ma a tendere potrebbe rivelarsi più complesso, perché 1) devi dare sempre un nome ai controlli, 2) la relazione tra “parent” conta e quindi potrebbe essere necessario ricorrere a procedure ricorsive, 3) la ricerca diventa sempre più lenta all'aumentare dei controlli, 4) ogni volta devi generare il nome che stai cercando con progressivi o altro espediente, inventandoti uno standard e mantenendolo uniforme nel codice, 5) in genere si dovrebbe cercare la soluzione ottimale e non quella più semplice, perché quando poi quella semplice farà emergere i problemi che si porta dietro, risolverli potrebbe essere più complesso che riservarsi 5 minuti allo scopo di studiare la soluzione migliore.

    Poi, in relazione al punto 5), può essere che FindControl() sia anche la soluzione ottimale, ma meglio determinarlo perché effettivamente lo è, piuttosto che darlo per assodato perché inizialmente è la più semplice, anche apparentemente.

  • Re: Modificare il testo di una Label creata runtime

    Fatte le prove.. 

    Se non dai il nome viene assegnato da solo (quale sia… boooh!)

    Ho creato un pulsante che crea a runtime la label..

    Un pulsante che ne cambia il testo…

    Un pulsante che elimina la label…

    Considerazioni:

    Creo la label, cambio il testo, elimino la label… tutto ok!

    Smanetto e…

    Creo la label, creo un'altra label, voglio cambiare il testo alla prima label ma lo cambia all'ultima creata…

    Voglio eliminare la label e elimina l'ultima creata…

    Rielimino e mi da accessviolation…

    A questo punto mi torna in mente il mio padrino di programmazione con la sua frase: “a fare le cose per bene si impiega meno tempo che a farle male, perché poi impieghi il triplo del tempo per rattoppare gli errori”.

    Ergo, dai un nome a ciò che crei a runtime… soprattutto se non sai cosa fa o farà l'utente.

    Così ha senso findcontrol("lab1")

    Sempre pronto ad imparare nuove strade, non ho avuto risposta su come fare per cambiare, ad esempio, label1 da “hallo word” a “ciao mondo” e label2 da “benvenuto utente” a “benvenuto andrea”.

    E mi fermo a due label…

    Desideroso, ripeto, di apprendere il mondo vb.net.

  • Re: Modificare il testo di una Label creata runtime

    27/05/2024 - sihsandrea ha scritto:


    Se non dai il nome viene assegnato da solo (quale sia… boooh!)

    Dove? In che contesto? Di cosa parliamo?

    27/05/2024 - sihsandrea ha scritto:


    Smanetto e…

    […]

    Rielimino e mi da accessviolation…

    AccessViolation? Quindi parliamo di Delphi. Al netto del parallelismo tirato in ballo per esemplificare, le regole della VCL di Delphi rispetto a WinForms di .NET sono simili ma non sono uguali: non si tratta dello stesso linguaggio né dello stesso framework.

    Detto questo, hai descritto tutto a parole ma non hai postato alcun tipo di codice (e in ogni caso non lo farei qui, visto che sarebbe OT) e non c'è garanzia alcuna che tu non abbia quindi commesso nei vari procedimenti altri tipi di errore che producano errori dovuti in realtà a motivazioni diverse rispetto a quella della banale assegnazione di un nome.

    27/05/2024 - sihsandrea ha scritto:


    A questo punto mi torna in mente il mio padrino di programmazione con la sua frase: “a fare le cose per bene si impiega meno tempo che a farle male, perché poi impieghi il triplo del tempo per rattoppare gli errori”.

    Questo è un ottimo consiglio, in generale.

    27/05/2024 - sihsandrea ha scritto:


    Ergo, dai un nome a ciò che crei a runtime… soprattutto se non sai cosa fa o farà l'utente.

    L'utente qui non c'entra nulla: il nome è una proprietà, e come tale ha un ruolo e un suo funzionamento che non è casuale, ma regolato da come quel valore viene gestito nel framework stesso e in base alle sue regole, ergo conoscendo le regole è fondamentale per sapere come applicarle, e se non si contravviene alle regole quello significa fare le cose per bene, ovvero come se le aspetta il framework o la libreria di turno. La regola da seguire in generale quindi sarebbe  “dai un nome a ciò che ha senso abbia un nome”, a meno che lo strumento non ti obblighi altrimenti (ma quella sarebbe appunto una regola imposta).

    27/05/2024 - sihsandrea ha scritto:


    Sempre pronto ad imparare nuove strade, non ho avuto risposta su come fare per cambiare, ad esempio, label1 da “hallo word” a “ciao mondo” e label2 da “benvenuto utente” a “benvenuto andrea”.

    Non è chiaro cosa intendi. Definisci i requisiti specifici del tuo dubbio (magari conviene in un thread specifico, perché temo si vada molto OT), postando il codice e spiegando cosa non ti è chiaro nell'approccio o nelle spiegazioni, e indicando anche il linguaggio di riferimento, perché io al momento non capisco più se si sta parlando di Delphi, .NET o altro. :)

  • Re: Modificare il testo di una Label creata runtime

    Ok, ricapitolando.

    e' stato chiesto come cambiare qualcosa ad un oggetto creato a runtime.

    sono state date risposte fino a che GARGIA1960 ha scritto: Di solito quando si programma si mette sempre un nome, almeno quando si prevede di usarlo.

    reputando ovvio l'uso di un nome, da lì la mia domanda: in delphi so come fare ma in vb.net? 

    tu (alka) mi hai risposto

    20/05/2024 - sihsandrea ha scritto:


    Come fate a mettere un pulsante senza nome? O una label senza nome? Mah!

    Se non voglio distinguere i controlli per nome, perché devo per forza attribuire un nome?

    18/05/2024 - sihsandrea ha scritto:


    Beh, delphi si inca…vola se un oggetto non ha un nome…

    Non è vero: infatti ha perfettamente senso avere componenti senza nome, se non voglio associarvi eventi specifici o riferirmi a quel componente tramite codice. Questo in linea generale, anche quando si usa il designer.

    da li, ho fatto il test di cui parlavo… offtopic? no ribattevo ad una tua affermazione, questa si offtopic, in quanto il mio accenno a delphi era una riflessione.

    27/05/2024 - Alka ha scritto:


    27/05/2024 - sihsandrea ha scritto:


    Sempre pronto ad imparare nuove strade, non ho avuto risposta su come fare per cambiare, ad esempio, label1 da “hallo word” a “ciao mondo” e label2 da “benvenuto utente” a “benvenuto andrea”.

    Non è chiaro cosa intendi. Definisci i requisiti specifici del tuo dubbio (magari conviene in un thread specifico, perché temo si vada molto OT), postando il codice e spiegando cosa non ti è chiaro nell'approccio o nelle spiegazioni, e indicando anche il linguaggio di riferimento, perché io al momento non capisco più se si sta parlando di Delphi, .NET o altro. :)

    cosa non è chiaro? sapere come fare con vb.net? ripeto, in delphi non ho alcun problema, vorrei sapere esattamente dove reperire info su vb.net per il caso specifico.

    poi ho sollevato un problema: se non dai un nome, e metti piu' label, come fai a trovare il destinatario del cambio testo tra piu' label? sempre in vb.net (specifico a scanso di equivoci), perchè mi interessa. VB.NET NON DELPHI…. io senza nomeoggetto non ho trovato nulla (in vb.net).

    fine megaparentesi delphi…

    nocciolo: se ho una sola label (ammesso che abbia qualche senso crearla a runtime una sola) va bene. ma se creo oggetti che rappresentano dei dati presi da un database (per esempio, voglio associare un disegno di un'automobile piu' o meno grande a seconda delle percentuali di vendita, per n modelli di automobili) creo l'immagine (automobilina) e la chiamo idmodello e la dimensione la prendo da modellovenduto/totalevendite… solo per non usare torte o grafici a barre… poi al doppio click apro la scheda tecnica del modello (ergo devo conoscere l'id della vettura associata a quell'oggetto creato a runtime - magari image + idmodello). ah, sono tutti esempi e ipotesi della creazione a run time di oggetti.

    in altre parole, voglio che una label abbia un testo e un'altra label ne abbia un altro. SEMPRE IN VB.NET che credo in fondo sia la richiesta, altrimenti avrebbe messo la label in sede di progetto.

Devi accedere o registrarti per scrivere nel forum
30 risposte