
Maurizio.A (Normal User)
Newbie
    
Messaggi: 2
Iscritto: 31/12/2022
|
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
|
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2218
Iscritto: 04/05/2008
|
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
|
|

Maurizio.A (Normal User)
Newbie
    
Messaggi: 2
Iscritto: 31/12/2022
|
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 |
Public Class Class1 Dim I Dim Tempo As String Dim K As Integer Dim Tx As Integer Dim Ty As Integer Dim Timer Dim Start Dim PauseTime Dim m As New Class1() Private Sub DoEvents() Throw New NotImplementedException() End Sub Sub Chiudi_In_Modo_Vert(m) On Error Resume Next m.Label2.Text = 35 10: Dim PauseTime, Start PauseTime = 0.35 Start = Timer Do While Timer < Start + PauseTime DoEvents() Tempo = m.Label2.Text & "" If Tempo >= "0" Then m.Height = m.Height - 1 Else m.Height = m.Height & 0 'm.Close() End If Loop m.Label2.Text = m.Label2.Text - 1 If m.Label2.Text = 0 Then ' Ferma Il Ciclo End Exit Sub End If GoTo 10 End Sub 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 |
Public Class Form1 Dim m As New Class1() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call Chiudi_In_Modo_Vert("m") End Sub 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 |
|

Thejuster (Admin)
Guru^2
    
Messaggi: 2218
Iscritto: 04/05/2008
|
Intanto facciamo chiarezza.
Nel modulo Class1 ha dichiarato una variabile che punta a se stesso
Codice sorgente - presumibilmente C# / VB.NET |
mentre nel Form1
Codice sorgente - presumibilmente VB.NET |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call Chiudi_In_Modo_Vert("m") 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 |
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 |
Public Class Class1 Dim Timer Dim Start Dim PauseTime Dim m As New Form1() 'ecc. ecc. ecc. 'Quando viene creta la classe, assegno come parametro quello del Form attuale che lo crea Public Sub New(parent As Form1) m = parent; End Sub
|
Al Form1, quando crei la classe tipo Al FormLoad
Codice sorgente - presumibilmente VB.NET |
Dim m As Class1 = New Class1(Me) '----------- 'Dim m As New Class1() Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call Chiudi_In_Modo_Vert("m") 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 Ultima modifica effettuata da Thejuster il 05/02/2023 alle 17:35
|
|

Carlo (Member)
Guru
    
Messaggi: 1134
Iscritto: 29/01/2018
|
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 |
Public Class Form1 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Call Chiudi_In_Modo_Vert() ' non creo e non passo m perché Form1 è pubblico End Sub End Class
|
e il MODULO, attenzione, MODULO non CLASSE
Codice sorgente - presumibilmente VB.NET |
Module Module1 Dim I Dim Tempo As String Dim K As Integer Dim Tx As Integer Dim Ty As Integer Dim Timer Dim Start Dim PauseTime ' Dim m As New Class1() ' SBAGLIATO 'Private Sub DoEvents() ' NON FA NULLA ' Throw New NotImplementedException() 'End Sub Public Sub Chiudi_In_Modo_Vert() ' On Error Resume Next ' questa istruzione nasconde gli errorri e ti impedisce di scovarli Form1.Label2.Text = 35 10: Dim PauseTime, Start PauseTime = 0.35 Start = Timer Do While Timer < Start + PauseTime Application.DoEvents() ' SCRITTO PER ESTESO Tempo = Form1.Label2.Text & "" If Tempo >= "0" Then Form1.Height = Form1.Height - 1 Else Form1.Height = Form1.Height & 0 'm.Close() End If Loop Form1.Label2.Text = Form1.Label2.Text - 1 If Form1.Label2.Text = 0 Then ' Ferma Il Ciclo End Exit Sub End If GoTo 10 End Sub End Module
|
Il codice ha delle incongruenze, macchinoso e non esce dal ciclo. Avrei scritto così:
Codice sorgente - presumibilmente VB.NET |
Module Module1 Public Sub Chiudi_In_Modo_Vert() Do Form1.Height -= 4 ' diminuire per rallentare Form1.Label2.Text = Form1.ClientSize.Height 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 Application.DoEvents() Loop While Form1.ClientSize.Height > 1 Form1.Close() End Sub End Module
|
Ho notato che hai accettato la correzione automatoca di vs ed inserito:
Codice sorgente - presumibilmente VB.NET |
Private Sub DoEvents() Throw New NotImplementedException() 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 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6318
Iscritto: 03/01/2010
|
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à. |
|

Carlo (Member)
Guru
    
Messaggi: 1134
Iscritto: 29/01/2018
|
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 |
|

nessuno (Normal User)
Guru^2
    
Messaggi: 6318
Iscritto: 03/01/2010
|
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à. |
|