Newsgroup: it.comp.lang.visual-basic
Titolo: [concatenazione Stringa] uso del  "-"  .  Problemini

Devo costruire una Label con 
in mezzo il trattino;
ma il trattino è adiacente tra due cifre
e VB mi fa purtroppo la sottrazione!
Come si può fare?
---------------
Es:
dim strTxt1 as string
dim strTxt2 as string
strVar1="-"
strVar2="-"
e poi
dim lngVal1 
dim lngVal2 
lngVal1 = Hex (blah, blah...)
lngVal2 = Hex (blah, blah...)
se faccio: 
Label1 = strVar1 &  lngVal1 & strVar2 &  lngVal2
non riesco ad ottenere questo:
Label1=  -125-246
-------------

 Label1=  -125-246
Perchè lngVal1 e 2 sono variant e in quel contesto contengono numeri.
Usa cstr per convertire in stringa (oltre a dichiararle long, come già 
detto).
 > Label1 = strVar1 &  cstr(lngVal1) & strVar2 & cstr(lngVal2)
Io consiglio di non usare le proprietà predefinite. Meglio:
Label1.Caption = ...
Ciao!
Marco / iw2nzm

 Label1=  -125-246
A parte che da questa riga non si capisce se dovrebbe scrivere nella label 
"-125-246" o -371, è impossibile.
Anche considerando il fatto che in lngVal1 e lngVal2 non hai dei numeri 
(dato che escono da Hex(), e se le avessi tipizzate te ne saresti accorto) e 
che sarebbe corretto un Label1.Caption = ...
Ciao 

In verità la cosa è leggermente più complessa,
ma credo di avere scoperto a cosa si deve il problema.
Seguitemi e non ve ne pentirete!
--------------------
Innanzitutto premetto che 
se al posto del trattino ("-") uso per esempio 
uno slah ("/") o una lettera qualsiasi del'alfabeto ("q")
il problema non si verifica,
quindi qualcosa ci deve essere nel trattino.
Come dicevo, però, è una cosa un pochino più complessa.
In verità infatti la variabile trattino 
(che ho dichiarato come Stringa),
la tiro fuori al volo dal Registro un attimo prima di usarla.
Per fare questo uso l'Api 'QueryValueEx' che, come si sa, 
prima di restituire qulacosa,
fa passare tale cosa per un attimo in un suo buffer 
per poi andare a riempire la variabile di destinazione (una.
Stringa nel mio caso).
Attenzione però, perchè il buffer va dimensionato a priori.
E qui c'è l'anomalia (penso di ritenere), perchè
anche se il buffer è dimensionato male (cioè per eccesso),
ad esempio è dimensionato per 10 caratteri, 
quando ovviamente in questo caso ne serve solo uno e non di più,
se dal Registro per esempio ad uscire deve essere
una "q" oppure uno "/",
dietro alla "q" o allo "/" nella variabile Stringa di destinazione
comunque non vi è nulla di fastidioso
e tali caratteri "q" e "/"
vengono restituiti puliti, pronti all'uso.
Se invece ad uscire deve essere un "-",
purtroppo ad uscire è il  "-" 
con dietro però ben 10 spazi vuoti, 
cioè così:    "-          "  .
Tale coda fastidiosa tra l'altro non è fatta neanche
di innocui spazi bianchi 
(quelli per intenderci della barra spaziatrice),
ma di altri caratteri (che non ho identificato).
E sono diciamo bastarducci; per esempio nella concatenazione di stringhe
fanno casini...
---------------
Potevo risolvere andando a dimensionare correttamente
preventivamente il buffer,
ma ho fatto in un altro modo.
Tale stringa bastarda   "-         "   
la faccio passare per un attimo 
su una TextBox nascosta e la riprendo subito,
e quella che vado a riprendere mi ritorna perfettamente pulita,
cioè così:  "-"  .
Evidentemente la Textbox purifica!
Questi sono i passaggi reali:
    Dim str1 as String
    Dim str1Buff as String
    Dim dimensione As Long
    str1Buff = Space$(10)
    dimensione = Len(str1Buff)
 
    r = RegQueryValueEx(HKey, "IlTesoroèQui", 0, REG_SZ, ByVal str1Buff ,
dimensione)
 
    Text1.Text = str1Buff 
    str1 = Text1.Text
    'ora il concatenamento riesce
    Label1 = str1 & (10263708 And &HFF&)
-----------------
Il perchè del trattino briccone 
e della TextBox purificatrice 
non li ho però capiti.
Comunque pare però che alla fine
il modo per fare funzionare il tutto
l'abbia trovato.
----------------
Se avete commenti su questa fantastica avventura
saranno i benvenuti!


 Seguitemi e non ve ne pentirete!
[snippone]
Avevi ragione, non me ne sono pentito: un po' di buonumore ogni tanto ci 
vuole. :)
Mi pare di leggere le spiegazioni di alcuni colleghi quando mi spiegano 
perchè per moltiplicare un numero per 1 devono collegarsi al sito della 
nasa, controllare le coordinate geostazionarie del satellite di sky ottenere 
la frequenza di trasmissione e calcolarne il logaritmo in un loop da uno a p 
greco arrotondato per eccesso.
Che senso ha tutto questo?
Non lo sa nessuno, ma funziona... per oggi, e poi è semplice da implementare 
e da spostare con dei copia-incolla.
Non ti è venuto il dubbio su cosa sia l'ultimo parametro di QueryValueEx?
Call RegQueryValueEx(hOpenKey, KeyName, 0&, REG_SZ, lpReturn, lpLen)
KeyValue = Left$(lpReturn, lpLen - 1)
Non è il "-", è che le funzioni API funzionano così!
Non usa stringe VB, ma buffer già dimensionati, e in un buffer non puoi mai 
sapere cosa c'è oltre al dato.
Se con "/" funziona è semplicemente perchè ti va di culo.
Ciao 

KeyValue = Left$(lpReturn, lpLen - 1)
Ma questa è una soluzione piatta,
non hai il senso dell'avventura!

 Call RegQueryValueEx(hOpenKey, KeyName, 0&, REG_SZ, lpReturn, lpLen)
[snippetto]
Non c'entra nulla, ma è una cosa che mi son sempre chiesto...
Quando si chiama una funzione che richiede parametri si fa:
Risultato=Funzione(Parametro1,Parametro2)
Se il risultato non serve (o se la procedura da chiamare è una Sub e non 
una Function), si può scrivere indifferentemente
Call Funzione(Parametro1,Parametro2)
oppure
Funzione Parametro1,Parametro2
c'è qualche differenza pratica o è solo questione di stile?
...grazie!
    Michele


Se sei in debug il primo sistema ti permette una valutazione di 
Funzione(Parametro1,Parametro2) senza doverla riscrivere nella finestra 
immediata.
Con VB.Net hanno risolto elegantemente il problema: l'unica forma valida è 
comunque
Funzione(Parametro1,Parametro2)
Ciao