Newsgroup: it.comp.lang.visual-basic
Titolo: Modificare il testo della label

Ho già postato una domanta riguardante questo problema senza ottenere nulla.
Nel frattempo ho fatto altre prove...
Con questo codice, assegno il nuovo nome alla Label1 ma visibilmente non 
cambia nulla (rimane sempre la scritta originale label1.
formAvvio.Label1.Text = "operazione avvenuta"
A questo punto, per vedere se la label1 ha acquisito il nuovo testo, ho 
aggiunto anche un msgbox subito dopo l'assegnazione (formAvvio.Label1.Text = 
"operazione avvenuta")
msgbox(formAvvio.Label1.Text)
Stranamente, msgbox mostra il nuovo testo della label1 anche se a vista è 
rimasto con il vecchio testo.
Perchè avviene l'assegnazione ma visualmente non cambia nulla?
ciao
nero23
N.B. Microstation è un programma cad
-----------------------------
Imports MicroStationDGN
Public Class Form1
Public ustn As New MicroStationDGN.Application()
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
ustn.CommandState.StartLocate(New classe1)
End Sub
End Class
Public Class classe1
Implements MicroStationDGN.ILocateCommandEvents
Public ustn As New MicroStationDGN.Application()
Private SelElement As Element
Public Sub Accept(ByVal Element As MicroStationDGN._Element, ByRef Point As 
Point3d, ByVal View As View) Implements 
MicroStationDGN.ILocateCommandEvents.Accept
End Sub
Private Sub ILocateCommandEvents_Cleanup() Implements 
MicroStationDGN.ILocateCommandEvents.Cleanup
End Sub
Private Sub Dynamics(ByRef Point As Point3d, ByVal View As View, ByVal 
DrawMode As MsdDrawingMode) Implements 
MicroStationDGN.ILocateCommandEvents.Dynamics
End Sub
Private Sub ILocateCommandEvents_LocateFailed() Implements 
MicroStationDGN.ILocateCommandEvents.LocateFailed
If SelElement Is Nothing = False Then
ustn.ActiveModelReference.UnselectAllElements()
SelElement = Nothing
End If
End Sub
Public Sub LocateFilter(ByVal Element As _Element, ByRef Point As Point3d, 
ByRef Accepted As Boolean) Implements 
MicroStationDGN.ILocateCommandEvents.LocateFilter
Accepted = False
Dim elemText As TextElement
If Element.IsTextElement = True Then
elemText = Element
elemText.Redraw(MsdDrawingMode.msdDrawingModeErase)
elemText.Text = UCase(elemText.Text)
elemText.Redraw(MsdDrawingMode.msdDrawingModeNormal)
elemText.Rewrite()
ustn.ActiveModelReference.UnselectAllElements()
End If
Dim formAvvio As New Form1
formAvvio.Label1.Text = "operazione avvenuta"
msgbox(formAvvio.Label1.Text)
End Sub
Private Sub ILocateCommandEvents_LocateReset() Implements 
ILocateCommandEvents.LocateReset
ustn.CommandState.StartDefaultCommand()
End Sub
Private Sub ILocateCommandEvents_Start() Implements 
ILocateCommandEvents.Start
End Sub
End Class


zac
Io a questo punto mi arrendo...se non sai come funziona un linguaggio
di programmazione...fatti fare un programma da qualcun altro!
Ma perchè ti ostini in una strada che non sboccherà mai in nulla di
buono?
A Roma direbbero
"Te devi da studià!"
A Prato
"Studia ciuco!"
provo a farti ragionare...ma per l'ultima volta (t'ho dato link
suggerito possibili soluzioni....te ne freghi vuoi la pappa
scodellata...e quindi è il mio ultimo aiuto!)
1)..In NET tutto è un oggetto.....
2)...una classe è il codice che net sceglie per descrivere un oggetto
3) L'istanza è l'esecuzione della classe (del codice) che di fatto
crea  l'oggetto
detto questo
A)
Dim formAvvio As New Form1
...cosa fà?
->Recupera il codice per creare la classe Form1
->lo esegue
->assegna il riferimento all'oggetto creato alla variabile formAvvio
B)
formAvvio.Label1.Text = "operazione avvenuta"
...cosa fà?
-> Tramite la variabile di riferimento accede all'oggetto definito
dalla classe Form1 e cerca un oggetto chiamato Label1
-> Se questo oggetto Label1 c'è, va a cercare la proprietà Text di
questo oggetto e la imposta al valore che hai definito
C)
msgbox(formAvvio.Label1.Text)
...cosa fà?
In pratica l'inverso di B
-> Cerca sempre tramite la variabile di riferimento un oggetto Label e
legge il valore della proprietà Text
-> Ti visualizza questo valore!
Tutto corretto....e tutto funzionante!
Ci arrivi da te adesso?
No?
ok.....
APPUNTO
msgbox c'è per compatibilità con il passato
c'è l'oggetto MessageBox assai più versatile da usare con NET!
INDIZIO
Se tu usassi MessageBox avresti già risolto il tuo problema!
Infatti....hai creato l'oggetto Form1...si dice "Hai istanziato
Form1"....
MA
...dove gli hai detto che vuoi visualizzarlo?
in NET
Istanziare NON E' sinonimo di visualizzare
ed infatti manca il comando per visualizzare una finestra
ce ne hai 2
sono metodi della classe form
Show
ShowDialog
ovviamente l'uno o l'altro non sono uguali e cambia parecchio
....
ma la fatica di schiacciare F1 e cercare questi 2 metodi....la fai tu
vero?
Ti rimarra chiaro adesso che usare NET non è cosa da "spaghetti code":
un po di codice di quà...un po di là....una shakerata e oplà il
programma!
E' molto diverso da vb6!
Ti ci vuole una base....e ti consiglio LA SOLITA (gratis scaricabile
chiara) guida di totems lair (che alla fine se non mi pagano da bere
sono degli impuniti!)
http://totemslair.org/guide/vb.php
Saluti
...buono studio (speriamo! ...anche se ne dubito!)

Perchè avviene l'assegnazione ma visualmente non cambia nulla?
...
Immagino quindi che tu stia visualizzando un'altra istanza di Form1.
Se cosi' fosse, e' normale che cambiando la proprieta' Text della label su 
una istanza (quella da te chiamata "formAvvio"), il valore visualizzato 
dalla label esistente sull'altra istanza di Form1 non cambi.
Ci ho preso?
ciao


Premetto che sono un bricoleur che "se l'è studiata" ma non abbastanza.
Per mostrare la label modificata ho trovato (ed usato) i seguenti metodi:
formAvvio.Refresh()=>Determina l'invalidazione dell'area client del controllo e il nuovo disegno di quest'ultimo e degli eventuali controlli 
figlio. (Ereditato da Control)
formAvvio.Update() =>Determina il nuovo disegno delle aree invalidate del controllo all'interno della relativa area client.  (Ereditato da Control)
Mi sfugge la differenza fra i due, ma ai fini dell'utilizzo che ne faccio io il risultato è lo stesso.
-- 
Ciao, Adriano
----------------------------------
Togli "rosso" per contatto privato

 zac
[CUT]
Calmati, alla tua età :D Ci si rivede...come va? Ora ti stano nei giorni 
a venire hiihi. Buona serata!

 faccio io il risultato è lo stesso.
non conosco .net ma leggendo con un po' di attenzione si evince che nel 
secondo caso tu ridisegni solo parti dell'intera area client, mentre nel 
primo caso ridisegni l'intera area client.
In pratica, immaginiamo un rettangolo con dentro dei cerchi, nel primo 
caso aggiorniamo rettangolo e cerchi, nel secondo caso solo i cerchi.
Poi magari ho capito male eh.
ciao
stefano



Spiegata così sembra comprensibile.
Quindi, se è efficace, quest'ultimo dovrebbe essere più leggero/veloce e quindi preferibile.


< Infatti....hai creato l'oggetto Form1...si dice "Hai istanziato
< Form1"....
< MA
< ...dove gli hai detto che vuoi visualizzarlo?
La Form1 è già visibile (contiene il pulsante che avvia tutto il processo).
Se utilizzo il metodo Show, mi apre un'altra form1 (in questo caso, il testo 
della Label è aggiornato).

 della Label è aggiornato).
Ma è così difficile da capire? :-)
Con Dim formAvvio As New Form1 tu hai creato un'altra istanza della 
classe Form1, che è diversa da quella che hai già.
Cambia il testo della label sul form che hai già, non crearne un altro.
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Scarica "OpenOffice.org 3: Soluzioni a raccolta", molto più di semplici 
FAQ! 
http://it.openoffice.org/doc/manuali/

Ho fatto un esempio con un'altro codice escludendo ogni riferimento a 
Microstation.
Il testo della label1, presente sulla form1, cambia senza alcun problema 
(senza utilizzare il metodo Show).
A quanto pare, la mancata visualizzazione del testo sul codice precedente, è 
da ricercare nella classe-Microstation.
Ho l'impressione che, dopo aver pigliato il pulsante, si "blocca".
Credo di aver capito quanto mi è stato detto precedentemente da voi, 
funziona tutto tranne se la classe fa riferimento a Microstation.
Ringrazio tutti per la pazienza
nero23 


La Form1 è già visibile (contiene il pulsante che avvia tutto il processo).
[...]
Dim formAvvio As New Form1
formAvvio.Label1.Text = "operazione avvenuta"
...
Se avessi capito cosa ti e' stato risposto, avresti anche capito che la 
Form1 che e' gia' visibile *NON* e' la stessa cosa di formAvvio, sono due 
istanze diverse di una stessa classe, tant'e' che quando dichiari formAvvio, 
fai un New; cioe' stai creando una nuova istanza di una classe, classe che 
si chiama Form1, e a questa istanza stai dando il nome formAvvio. 

 Ciao,
è inutile.....
questo è il "lato oscuro della forza"....
Il Basic ha parole chiave e struttura sintattica così semplice che
qualsiasi bischero si crede un programmatore!
Se Microstation avesse reso disponibile come linguaggio di scripting
Perl (per dirne uno) post simili sarebbero a zero!
Nello specifico l'amico non conosce come funziona una classe..che è
una istanza...che cosa una interfaccia.
Non sà come implementare una classe che deriva da Microstation!
semplicemente...
sta spippolando a caso!
probabilmente è a casa malato...ed invece che giocare alla
playstation ...sta spippolando con un programmillo scaricato da emule!
detto fra noi: spero che sia così! Perchè se è un professionista che
vuole fare qualcosa di produttivo...la vedo dura assai!
Mettere 2 istruzioni in croce in Basic è facile (in Perl no!)
CAPIRE che sono quelle giuste per fare QUELLO CHE VOGLIO....è
difficile come in tutti gli altri linguaggi!...e richiede
studio!...senza sconti!
Saluti!
p.s.
scrivere
(cito)
"
...
Dim formAvvio As New Form1
formAvvio.Label1.Text = "operazione avvenuta"
msgbox(formAvvio.Label1.Text)
..."
e poi argomentare (ri-cito: io cito tu jane)
"...
La Form1 già visibile (contiene il pulsante che avvia tutto il
processo).
Se utilizzo il metodo Show, mi apre un'altra form1 (in questo caso, il
testo
della Label aggiornato).
..."
è degno del mio vecchio bestiario dei lamer
prima o poi lo riattivo sul sito !!!

� degno del mio vecchio bestiario dei lamer
prima o poi lo riattivo sul sito !!!
...
Ti prego, fallo....
ricordo delle belle risate, con quella roba :-)

 formAvvio.
imports MicrostationDGN  ' Riferimento a Microstation
...
...
Il codice della  mia primissima prova è:
Form1.Label1.Text = "NUOVO TESTO"
...
...
senza impiegare New, Show  ecc. ecc. perchè la form1 e la label1 sono già 
visibile sul video (la form1 è di avvio e contiene il pulsante di 
"collegamento alla classe1).
Non funzionando, qualcuno ha incominciato a parlare di visibilità, istanza 
ecc. (successivamente ho utilizzato Dim formAvvio As New form1 ...ecc.).
lo stesso codice
...
...
Form1.Label1.Text = "NUOVO TESTO"
 l'ho utilizzato con un'altra classe e tutto funziona (naturalmente sempre 
senza utilizzare New, Show ecc.).
...
...
La classe   che fa riferimento a MicrostationDGN  ha lo scopo di attivare 
alcune funzionalità, e funziona perfettamente, sia con il primissimo codice, 
che con l'inserimento di "... New Form1"  ecc.
Perchè funziona con una classe e non con l'altra??
abbiata pazienza, è Natale
Ciao
nero23

 wrote:
...probabilmente perchè non è ancora visualizzata in una classe!
prova con un form1.refresh
Comunque...non me ne frega nulal di Microstation...però per curiosità
ho cercato un po con google.
Risulterebbe....che questo namespace è un wrapper che usa interop per
agganciarsi alla dll COM di sto coso...e che quindi tutta
l'interazione non sia altro che una forma di chiamata api continua!
Stante così non è immediato far nulla e leggersi la documentazione è
duopo!
comunque
QUI SPIEGA molte cose
http://www.sumbera.com/ustation/articles/Interop/Interop2.htm
qui fa un esempio di labels ruotate
http://www.markstefanchuk.com/cad/smartLabels.pdf
ANZI questo signore c'ha un sacco di tutorial
in vba per microstation
http://www.markstefanchuk.com/
...non c'è verso che non trovi risposte!!!Basta mettersi li e provare
dal primo all'ultimo esempio...alla fine sei pratico!
Ma perchè invece di usare NET non usi davvero VBA?
Almeno tutta la parte OOP che ti crea confusione la elimini!!!
VBA come linguaggio di scripting di una applicazione è molto più
facile per un principiante!

 wrote:
zac
dimenticavo...anche questo
questo è in .NET
http://www.la-solutions.co.uk/content/DotNet/DotNetDevelopmentEnvironment.htm

Ma perchè invece di usare NET non usi davvero VBA?
Almeno tutta la parte OOP che ti crea confusione la elimini!!!
VBA come linguaggio di scripting di una applicazione è molto più
facile per un principiante!
Con VBA funziona tutto perfettamente ed è anche molto veloce.
L'idea di riscrivere il codice in VB.net è solo curiosità.
Dato che il progetto in VBA è molto complesso e, gran parte del codice l'ho 
già convertito in VB.net, non voglio mollare adesso.
Grazie per la prolungata pazienza che mi stai dimostrando.
ciao
nero23 

 Ma perch invece di usare NET non usi davvero VBA?
San Pancrazio da Pinerolo
Se hai da farli in NET ed è un progetto "complesso"....a maggior
ragione non puoi spippolare a cazzo di cane!
Spippoli a cazzo di cane perchè? Perchè ho voglia di insultarti?
NO! ...lungi da me...lo dico perchè davvero lo fai!
Me lo hai confermato ora : in VBA funziona!!!
E allora anche per sfizio....
ti sei letto i 2 link che ti ho dato?
Codesto cavolo di Microstation espone un oggetto COM (probabilmente
anche piùdi uno)
in NET una cosa del genere è possibile tramite Interop...
se leggi uno dei link che ti ho dato ad esempio
http://www.markstefanchuk.com/cad/v8vba.pdf
vedi che in vba tutti si riduce ad importare il rierimento del
progetto giusto!
In NET
devi fare lo stesso...andando in riferimenti del progetto e impostando
cosa?
lo stesso ma poi usare una libreria particolare che fa da wrapper alle
varie API di Microstation....
una spiegazione passo passo
http://communities.bentley.com/products/microstation/microstation_v8i/microstation_v8i_programming/f/19569/p/62037/151647.aspx
Se fai tutto corretto...NON dovrebbe apparirti quelo popò di errori
sulle interfacce...che  questo punto presumo ti abbia fatto incartare
non poco!
Però....tutto sto lavoro lo potevi fare da te con San Google sapendo
cosa spippolare....quindi
tieniti vba!
Che motivo c'è di mettere di mezzo dotNet?
Solo "moda"?
Saluti!
p.s.
La fattura di consulenza a chi la faccio?
costo poco: 80 euro l'ora!
;)

Me lo hai confermato ora : in VBA funziona!!!
E allora anche per sfizio....
ti sei letto i 2 link che ti ho dato?
Codesto cavolo di Microstation espone un oggetto COM (probabilmente
I tuoi link li avevo  letti  (tranne uno) e la conversione da VBA a 
VB.NET
 � 
stato molto semplice, tranne la parte in discussione.
Per�....tutto sto lavoro lo potevi fare da te con San Google sapendo
cosa spippolare....quindi
tieniti vba!
Che motivo c'� di mettere di mezzo dotNet?
Solo "moda"?
Come dicevo precedentemente, solo curiosit�. Ora, per testardagine, desidero 
capire dove sta il problema.
Saluti!
p.s.
La fattura di consulenza a chi la faccio?
costo poco: 80 euro l'ora!
;)
Ok, ti mando le prime 80 euro via e-mail
:)
ancora grazie
ciao

In tutti questi post, ho dimenticato di scrivere che il codice in 
vb.net
 
funziona perfettamente.
Per essere più preciso, quando clicco sul pulsante Button1 (presente sulla 
Form1) e successivamente seleziono un testo sul file microstation 
(Microstation è un programma cad come  Autocad), il testo viene convertito 
da minuscolo a maiuscolo.
Tutto questo funziona perfettamente sia con  VBA di Microstation sia con 
VB.Net.
Successivamente mi è venuta l'idea di far apparire  un messaggio che mi 
avvisasse che il cambio testo, da minuscolo a maiuscolo, era stato 
modificato. Da qui, l'idea di aggiungere la label1 sulla form1.
Di conseguenza, ho pensato di aggiungere  form1.label1.text ="operazione 
avvenuta"  nel codice della classe1.
Dato per scontato che la funzione "modifica testo selezionato da minuscolo a 
maiuscolo" continua a funzionare perfettamente anche dopo aver inserito il 
pezzettino del codice aggiuntivo  (form1.label1.text ="operazione 
avvenuta" ), la modifica del testo alla label non avviene.
Ciao a tutti
nero23