Oppure

Loading
05/02/23 11:21
Maurizio.A
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
05/02/23 13:48
Thejuster
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 05/02/23 13:50
mire.forumfree.it/ - Mire Engine
C# UI Designer
05/02/23 14:39
Maurizio.A
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

  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 :

 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 05/02/23 15:55
05/02/23 16:11
Thejuster
Intanto facciamo chiarezza.

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

Dim m As New Class1()


mentre nel Form1

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

'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


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


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 :rotfl:
Ultima modifica effettuata da Thejuster 05/02/23 16:35
mire.forumfree.it/ - Mire Engine
C# UI Designer
07/02/23 9:40
Carlo
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:
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
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ì:
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:
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 08/02/23 9:15
in programmazione tutto è permesso
08/02/23 9:06
nessuno
Praticamente lo stesso codice che ti avevano suggerito di correggere in

forum.html.it/forum/…
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à.
08/02/23 9:24
Carlo
Postato originariamente da nessuno:

Praticamente lo stesso codice che ti avevano suggerito di correggere in

forum.html.it/forum/…


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 08/02/23 12:54
in programmazione tutto è permesso
08/02/23 13:17
nessuno
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 08/02/23 13: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à.