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 - Come Riconoscere una Label da Una procedura Scritta in un modulo
Forum - C# / VB.NET - Come Riconoscere una Label da Una procedura Scritta in un modulo

Avatar
Maurizio.A (Normal User)
Newbie


Messaggi: 2
Iscritto: 31/12/2022

Segnala al moderatore
Postato alle 12:21
Domenica, 05/02/2023
Ciao a Tutti da Maurizio
Il mio problema e questo :
Ho scritto una procedura che Restringe il Form1 in modo Orizzontale ho Verticalmente e fin qui tutto ok.

Ora però mi trovo nella necessità di dover inserire la stessa procedura all'interno di un modulo
Però : Mentre prima indicavo l'oggetto inserito a livello del solo form
Come ad esempio : " Me.Label2.Text = "" " ecc...!

Quando richiamo tale oggetto dalla procedura riportata all'interno del modulo tutto questo " Me.Label2.Text = "" " mi viene sottolineato come errore .

Ho provato a sostituire il ( Me ) con il ( Form1 ) ma il tutto sembra non funzionare .
Pertanto vi chiedo come si possa risolvere questo errore Grazie
da Maurizio

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 14:48
Domenica, 05/02/2023
Sembra logico.
Perché la label in questione è contenuta nel modulo e non nel form.

Tieni presente che la chiave "Me" o "this" e relativa alla classe stessa di dove viene utilizzata.

Tipo se sto scrivendo codice nel form1
E faccio Me.Label1.
In questo modo sto chiedendo al form1 che contiene la label di impostare un valore.

Nel tuo caso, devi prima dichiarare un modulo / classe che contiene la label.
In seguito fare

Modulo.NomeLabel.Text =

Tipo
Dim m as new Modulo()
m.Label1.text =


Ultima modifica effettuata da Thejuster il 05/02/2023 alle 14:50


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Maurizio.A (Normal User)
Newbie


Messaggi: 2
Iscritto: 31/12/2022

Segnala al moderatore
Postato alle 15:39
Domenica, 05/02/2023
Ciao Thejuster sono grato di fare la tua conoscenza
Ascolta :
Premetto che sono alle prime armi con L'uso di Visual Studio 2022
Pertanto devo ancora imparare molto da questa forma di programmazione.
Anche perché io derivo dal vecchio Visual Basic 6.0 e il suo omonimo VBA di Excel.
Detto questo grazie hai tuoi suggerimenti, io sul mio progetto lo inserito in questo modo :

Tutto Ciò Lo Riportato Nel Modulo

Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.     Dim I
  3.  
  4.     Dim Tempo As String
  5.  
  6.     Dim K As Integer
  7.     Dim Tx As Integer
  8.     Dim Ty As Integer
  9.  
  10.     Dim Timer
  11.     Dim Start
  12.     Dim PauseTime
  13.     Dim m As New Class1()
  14.  
  15.     Private Sub DoEvents()
  16.         Throw New NotImplementedException()
  17.     End Sub
  18.  
  19.     Sub Chiudi_In_Modo_Vert(m)
  20.  
  21.         On Error Resume Next
  22.         m.Label2.Text = 35
  23. 10:
  24.         Dim PauseTime, Start
  25.  
  26.         PauseTime = 0.35
  27.         Start = Timer
  28.         Do While Timer < Start + PauseTime
  29.             DoEvents()
  30.  
  31.             Tempo = m.Label2.Text & ""
  32.             If Tempo >= "0" Then
  33.                 m.Height = m.Height - 1
  34.             Else
  35.                 m.Height = m.Height & 0
  36.                 'm.Close()
  37.             End If
  38.  
  39.         Loop
  40.  
  41.  
  42.         m.Label2.Text = m.Label2.Text - 1
  43.         If m.Label2.Text = 0 Then
  44.  
  45.  
  46.             ' Ferma Il Ciclo
  47.             End
  48.             Exit Sub
  49.         End If
  50.         GoTo 10
  51.     End Sub
  52. End Class



E ora sembra non darmi errori di alcun tipo!

Il problema però ora sarebbe quella di richiamare tale procedura
nel momento in qui clicco sul (Button) posizionato nel Form 1

Pensavo di cavarmela cosi :
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Dim m As New Class1()
  3.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  4.         Call Chiudi_In_Modo_Vert("m")
  5.     End Sub
  6.  
  7. End Class



Ma come vedi in questo caso continua a darmi errore sulla chiamata alla Routine perché ?

E anche qui come posso risolvere questo problema
Grazie Infinite Da maurizio

Ultima modifica effettuata da Thejuster il 05/02/2023 alle 16:55
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 17:11
Domenica, 05/02/2023
Intanto facciamo chiarezza.

Nel modulo Class1 ha dichiarato una variabile che punta a se stesso

Codice sorgente - presumibilmente C# / VB.NET

  1. Dim m As New Class1()



mentre nel Form1

Codice sorgente - presumibilmente VB.NET

  1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  2.         Call Chiudi_In_Modo_Vert("m")
  3.     End Sub



Al click del pulsante chiami la classe inviando un parametro.
fin qui non c'è nessun problema, tranne il fatto di dichiarare una variabile che punta e se stesso.

Nel caso vuoi che il Modulo debba chiudere il Form1, come vedo li nel commento

Codice sorgente - presumibilmente Plain Text

  1. 'm.Close()



Il discorso e diverso.
Basta che ti esprimi meglio nel topic e capiamo subito il problema.

Una classe, non può puntare ad un Form aperto quando viene creata, perché giustamente il compilatore si chiede.
"Mi stai dicendo di chiudere la porta di casa, ma non mi hai dato l'indirizzo civico. Dove si trova questa porta?"

Quindi devi fare in modo di dire alla classe quale Form stai cercando di chiudere.

Quindi dovresti fare tipo

Codice sorgente - presumibilmente VB.NET

  1. Public Class Class1
  2.  
  3. Dim Timer
  4. Dim Start
  5. Dim PauseTime
  6. Dim m As New Form1()
  7. 'ecc. ecc. ecc.
  8.  
  9. 'Quando viene creta la classe, assegno come parametro quello del Form attuale che lo crea
  10. Public Sub New(parent As Form1)
  11.         m = parent;
  12.     End Sub



Al Form1, quando crei la classe tipo Al FormLoad

Codice sorgente - presumibilmente VB.NET

  1. Dim m As Class1 = New Class1(Me)
  2.  
  3. '-----------
  4.  
  5. 'Dim m As New Class1()
  6.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  7.         Call Chiudi_In_Modo_Vert("m")
  8.     End Sub



Altrimenti se non era nemmeno questo che intendi scrivi chiaramente l'errore, cosa dice, dove accade e quando.
Purtroppo non sono ancora diventato indovino :rotfl:

Ultima modifica effettuata da Thejuster il 05/02/2023 alle 17:35


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


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:40
Martedì, 07/02/2023
Testo quotato

Postato originariamente da Maurizio.A:
Ora però mi trovo nella necessità di dover inserire la stessa procedura all'interno di un modulo
Però : Mentre prima indicavo l'oggetto inserito a livello del solo form
Come ad esempio : " Me.Label2.Text = "" " ecc...!


Le indicazioni di Thejuster sono corrette riferite ad una classe ma se non ho capito male, per quello che serve a te devi solo gestire l'oggetto label o tutti i componenti presenti in Form1 compreso Form1, da un modulo.

Puoi gestire tutte le proprietà della label che si trova nel Form1, compresi gli altri componenti e il form stesso direttamente perché il Form1 è pubblico e visibile in un modulo.
Il concetto applicato al tuo codice:
Codice sorgente - presumibilmente VB.NET

  1. Public Class Form1
  2.     Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  3.         Call Chiudi_In_Modo_Vert() ' non creo e non passo m perché Form1 è pubblico
  4.     End Sub
  5. End Class


e il MODULO, attenzione, MODULO non CLASSE
Codice sorgente - presumibilmente VB.NET

  1. Module Module1
  2.     Dim I
  3.     Dim Tempo As String
  4.     Dim K As Integer
  5.     Dim Tx As Integer
  6.     Dim Ty As Integer
  7.     Dim Timer
  8.     Dim Start
  9.     Dim PauseTime
  10.     ' Dim m As New Class1() ' SBAGLIATO
  11.  
  12.     'Private Sub DoEvents() ' NON FA NULLA
  13.     '    Throw New NotImplementedException()
  14.     'End Sub
  15.  
  16.     Public Sub Chiudi_In_Modo_Vert()
  17.  
  18.         ' On Error Resume Next ' questa istruzione nasconde gli errorri e ti impedisce di scovarli
  19.         Form1.Label2.Text = 35
  20. 10:
  21.         Dim PauseTime, Start
  22.  
  23.         PauseTime = 0.35
  24.         Start = Timer
  25.         Do While Timer < Start + PauseTime
  26.             Application.DoEvents() ' SCRITTO PER ESTESO
  27.  
  28.             Tempo = Form1.Label2.Text & ""
  29.             If Tempo >= "0" Then
  30.                 Form1.Height = Form1.Height - 1
  31.             Else
  32.                 Form1.Height = Form1.Height & 0
  33.                 'm.Close()
  34.             End If
  35.  
  36.         Loop
  37.  
  38.         Form1.Label2.Text = Form1.Label2.Text - 1
  39.         If Form1.Label2.Text = 0 Then
  40.  
  41.  
  42.             ' Ferma Il Ciclo
  43.             End
  44.             Exit Sub
  45.         End If
  46.         GoTo 10
  47.     End Sub
  48. End Module


Il codice ha delle incongruenze, macchinoso e non esce dal ciclo. Avrei scritto così:
Codice sorgente - presumibilmente VB.NET

  1. Module Module1
  2.     Public Sub Chiudi_In_Modo_Vert()
  3.         Do
  4.             Form1.Height -= 4 ' diminuire per rallentare
  5.             Form1.Label2.Text = Form1.ClientSize.Height
  6.             Threading.Thread.Sleep(1) ' attende 1 millisecondo, serve per fare in modo che la velocità di chiusura sia indipendente dalla potenza di calcolo di CPU e GPU
  7.             Application.DoEvents()
  8.         Loop While Form1.ClientSize.Height > 1
  9.         Form1.Close()
  10.     End Sub
  11. End Module



Ho notato che hai accettato la correzione automatoca di vs ed inserito:
Codice sorgente - presumibilmente VB.NET

  1. Private Sub DoEvents()
  2.      Throw New NotImplementedException()
  3. End Sub


Tale correzione ti è stata proposta perché hai inserito l'istruzione DoEvents, inesistente in VB .Net, senza la sua radice.
Quando vuoi usare questa istruzione in VB .Net la devi scrivere per esteso: Application.DoEvents

L'aver accettato la correzione proposta, ha eliminato l'errore creando una sub con il nome non riconosciuto, che però non fa nulla riferito al concetto di DoEvents come istruzione VB.




Ultima modifica effettuata da Carlo il 08/02/2023 alle 10:15


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:06
Mercoledì, 08/02/2023
Praticamente lo stesso codice che ti avevano suggerito di correggere in

https://forum.html.it/forum/showthread.php?threadid=2977445


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 10:24
Mercoledì, 08/02/2023
Testo quotato

Postato originariamente da nessuno:

Praticamente lo stesso codice che ti avevano suggerito di correggere in

https://forum.html.it/forum/showthread.php?threadid=2977445



Si, con la differenza che lì non gli hanno dato nessun aiuto, si sono limitati a dire che il codice era sbagliato e siccome Maurizio era incompetente, non doveva chiedere aiuto ma studiare e quando avesse raggiunto le competenze necessarie correggersi il codice da solo. Che suggerimento è?

Invece qui Thejuster ha ben esposto come agire con le classi, ed io come usare il modulo.
C'è anche un'altra differenza, il codice proposto da Maurizio qui su PieroTofy funziona (chiude gradualmente il form in verticale), anche se è macchinoso, con istruzioni inutili e non esce dal loop.

Non ho evidenziato le incongruenze perché Maurizio non ha fatto domande in merito, ha chiesto perché non vedeva la label nel modulo, e gli è stato risposto. Se Maurizio avrà ulteriore bisogno sarò pronto a rispondergli anche se la domanda sarà semplicistica.

Ultima modifica effettuata da Carlo il 08/02/2023 alle 13:54


in programmazione tutto è permesso
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 14:17
Mercoledì, 08/02/2023
Beh, direi che non è un aiuto di cui aveva bisogno ma, come è stato detto in quel forum, di "riscrivere" tutto il codice.

E non tutti i forum lo fanno, lo sai benissimo perché partecipi ad altri forum.

Del resto, aveva detto che lo aveva fatto in VB6. Forse il suggerimento di vedere cosa aveva scritto in VB6 gli è servito per farlo funzionare (a parte tutti i DoEvents piazzati a caso).

A cosa serve, mi chiedo, avere tutto il codice riscritto se poi non lo si studia per anni e anni?
A Maurizio, in mille forum, da tanti anni, si raccomanda di studiare gli esempi forniti e di studiare la teoria; anche in questo forum dove, invece di studiare ci ha mandato a "quel paese".

Ultima modifica effettuata da nessuno il 08/02/2023 alle 14:36


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote