Non è come tu la semplifichi. Ora ti dimostro. In primis ti lascio il
link del mio programma funzionante scritto con Xojo (periodo covid lockdown) e che sto convertendo in VBnet - non occorre che tu lo scarichi, basta che tu veda le immagini per capire su cosa sto lavorando.
In questo modo capisce questi eventi mappa da dove vengono..
Tra l'altro, FormMain è il nome della classe? Spero di no..
No, è il
nome del Form principale, cioè il Form di avvio.
Se dal file di Progettazione clicco F7, mi appare il codice:
Imports ...
Public Class FormMain
Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
...
End Class
Ma FormMain è il form di avvio, per cui anche il nome della Classe del Form di avvio della applicazione.
Se è questo che intendi.
----------------------------------------------------------------------------------------------------------------------------------------------------------
Ora pazienta un attimo e leggi: ti sto spiegando la logica seguita per determinate iterazioni da parte dell'utente
----------------------------------------------------------------------------------------------------------------------------------------------------------
Il componente CefSharp visualizza una mappa (utilizzo Leaflet fare per ciò) e visualizza svariati dati (come aeroporti, navaids, aerei, pianificatore di volo, ..). Inoltre permette di fare interagire l'utente con il programma stesso che può creare piani di volo, visualizzare informazioni, .. non mi divulgo ulteriormente.
MA TI FA CAPIRE che l'utente può fare tante cose sulla mappa. E per fare ciò utilizza sia il click destro che sinistro del mouse.
Quando ad esempio clicca con il mouse destro su un aeroporto deve essere eseguito una serie di azioni.
Se clicca su uno spazio aereo deve essere eseguito altre serie di azioni.
Ecc.. ecc..
Per cui abbiamo, appunto, l'evento JavascriptMessageReceived. Questo evento dice: << eih, è stato cliccato sulla mappa. Questi sono i dati: {svariati dati} >>
Ecco che nasce, a mio avviso, la necessità di un modulo su cui posso lavorarci anche in futuro senza toccarmi il form principale.
E non occorre scomodare una classe: tanto non devo istanziare niente.
Per cui l'evento CefSharp chiamerà la Sub che si trova nel modulo. Segue la vera SUB.
Private Sub wwMap_JavascriptMessageReceived(sender As Object, e As JavascriptMessageReceivedEventArgs) Handles wwMap.JavascriptMessageReceived
mMapInit.jsMessageReceived(e)
End Sub
Noterai che nel codice qua sopra non c'è Thread2, mentre negli esempi iniziali di questo PM c'è: è un test per capire come si aggiorna la GUI quando sono in un altro thread. Sono alle "prime" armi per cui devo capire.
Nel Modulo ho:
Public Sub jsMessageReceived(e As JavascriptMessageReceivedEventArgs)
Qua devo controllare cosa desidera fare l'utente: ho "Select Case" annidati perché le possibilità sono molteplici (circa 20+ possibili decisioni dell'utente)
End Sub
A sua volta i Case richiamano altre Sub che eseguono le azioni che si necessitano.
Il concetto è semplice. Ci vuole più a spiegarlo che programmarlo.
Per quanto riguarda il modulo: mi serve per lasciare il più pulito il Form di avvio oltre a facilitarmi le future modifiche.
ADESSO NON MOLLARE e continua a leggere :
In questo messaggio (questo PM nel forum), si parla in specifico di un
Select Case message(1)
Case 0, 1
Per facilitarti, "Case 0, 1" leggilo così: Case Noaa
Noaa è un server ufficiale del governo degli Stati Uniti che ha anche una funzione di calcolo del geomagnetismo: gli si passa la latitudine, longitudine, ecc.. ed il server Noaa ritorna dei dati.
QUESTI DATI DI RITORNO LI DEVO VISUALIZZARE NELLA TEXTRICHBOX.
A questo punto la logica vuole che aggiorni il TextRichBox all'interno di questo Select Case (sempre da Module, non dimenticare)
e non dal Form principale (cioè FormMain) da dove l'evento è partito (da CefSharp ? JavascriptMessageReceived) !
Per cui se da questo Select Case faccio semplicemente
FormMain.rtbNoaa.Text = "..datiFromNoaa.."
non visualizza un bel niente nella RichTextBox.
Ecco perché utilizzo FormMain.rtbNoaa.InvokeRequired : forse il controllo non fa parte della thread UI.
Ma ironia della sorte, se seguo step by step il codice WriteTextSafe mi accorgo che InvokeRequired da come risultato false, ed esegue subito: FormMain.rtbNoaa.Text = "..text.." ma non visualizza appunto nulla nella RichTextBox !
Ora sono stato esaustivo, no ?