Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Buongiorno non so so se il problema sia stato già affrontato o meno, in caso mi passerete i link..
Ad ogni modo sto riscontrando questa problematica.
In una applicazione, in via di sviluppo con VB2012, ho la necessità di assegnare un certo colore alla proprietà backcolor di una textbox. Il colore è memorizzato in decimale in un certo campo di una tabella del db in sql. Ad esempio posso trovare il valore 255 oppure 65535, etc...
Ora questi valori non so come fare per passarli alla proprietà backcolor di una text box....
Ho provato a trasformarli in esadecimale 255--> #FF e quindi a passarli così:
Il codice che hai proposto non può passare il nome di un colore e il valore arbitrario ricavato va ad impostare il canale alpha, non supportato dalla proprietà backColor di una textBox.
Se nel tuo DB hai dei colori in un range 0...65535, bisogna sapere come sono implementati, presupponendo che siano RGB565, è sufficiente scrivere una funzione che passato DBColor restituisca i rispettivi RGB a 8 bit come vuole VB .Net
Codice sorgente - presumibilmente VB.NET
Dim DBColor AsInteger=255' letto da db
TxtInfo.BackColor= ConvertDecColor(DBColor)
PublicFunction ConvertDecColor(decColor AsInteger)As Color
' Estrarre i bit per ogni componente
Dim r AsInteger=(decColor >> 11)And&H1F ' 5 bit per il rosso
Dim g AsInteger=(decColor >> 5)And&H3F ' 6 bit per il verde
Dim b AsInteger= decColor And&H1F ' 5 bit per il blu
' Convertire da 5/6 bit a 8 bit (0-255)
r =CInt((r / 31.0)* 255)
g =CInt((g / 63.0)* 255)
b =CInt((b /31.0)*255)
' Restituire il colore come un oggetto Color
Return Color.FromArgb(r, g, b)
EndFunction
Controlla se hai corrispondenza, altrimenti i bit sono usati in modo diverso, per esempio se i colori nel DB hanno un range 0...16777215, allora RGB è a 8 bit e tutto è più facile.
Per risalire alla codifica sarebbe facile se si sapesse quanto vale bianco, nero, rosso, verde e blu.
in allegato i 65536 colori rappresentabili in RGB565, ricavati con due cicli 256x256
Non sapendo esattamente un valore, e difficile aiutarti.
hai detto che hai valori decimali ma nel tuo esempio hai scritto: 65535
in questo caso penso bisogna fare uno shift di 8 bit.
tenendo presente che ogni colore è formato da 24bit.
Per quanto riguarda al colore trasparente, una normale TextBox non supporta di default il colore trasparente come backcolor.
nemmeno applicando lo stile al costruttore avendo ereditato la classe
esempio:
BackColor = Color.Transparent; // Non funzionerà sulla TextBox
}
}
Consiglio invece di accedere alla proprietà Parent per ottenere il BackColor del controllo contenitore.
Si può costruire una TextBox con backColor Trasparente, ma è un operazione abbastanza lunga da scrivere e da fare.
Niente chiamate api ecc. ecc. ma si deve ricostruire completamente il controllo.
Ora non ricordo più nemmeno una virgola del vb.net (anche se iniziai proprio da quello )
Quindi non ho testato il metodo di carlo, Ma penso che carlo non spara baggianate e sà quel che fà.
Dovrebbe funzionare anche se usa un metodo diverso dal mio.
Infatti avevo anticipato che se la conversione è per colori con un range 0...16777215, tutto è più facile.
Codice sorgente - presumibilmente VB.NET
PublicFunction Convert24bitColor(decColor AsInteger)As Color
' Estrarre i bit per ogni componente
Dim r AsInteger=(decColor >> 16)And&HFF ' 8 bit per il rosso
Dim g AsInteger=(decColor >> 8)And&HFF ' 8 bit per il verde
Dim b AsInteger= decColor And&HFF ' 8 bit per il blu
' Restituire il colore come un oggetto Color
Return Color.FromArgb(r, g, b)
EndFunction
Per comprendere il codice è sufficiente sapere che i 16 milioni di colori sono rappresentati da 24 bit. RRRRRRRRGGGGGGGGBBBBBBBB Per estrarre il colore rosso rappresentato dagli 8 bit a sinistra, si fa scorrere tutti i bit di 16 posizioni a destra in modo che gli 8 bit a sinistra vanno tutti a destra 0000000000000000RRRRRRRR a quel punto con And &HFF si catturano 8 bit a destra.
Per estrarre il colore verde rappresentato dagli 8 bit centrali, si fa scorrere tutti i bit di 8 posizioni a destra in modo che gli 8 bit centrali vanno tutti a destra 00000000RRRRRRRRGGGGGGGG a quel punto con And &HFF si catturano 8 bit a destra.
Per estrarre il colore blu rappresentato dagli 8 bit a destra, RRRRRRRRGGGGGGGGBBBBBBBB con And &HFF si catturano 8 bit a destra.
La stessa tecnica è usata nel codice precedente ma per un valore in ingresso che rappresenta lo spazio colore a 16 bit (RGB565) RRRRRGGGGGGBBBBB, per quello prima scorro 11 bit poi 5 e maschero con &H1F (5Bit &B11111) e &H3F (6Bit &B111111)
Ultima modifica effettuata da Carlo il 13/06/2024 alle 1:56
Ho provato entrambe le routine sia quella convertdeccolor, sia convert24bitcolor....
Risultati: ovviamente l'errore non si verifica più, ma i colori ottenuti non sono quelli sperati.
Intanto preciso che bachcolor del form in cui sono le tre textbox è settato, a livello di progetto, a white... mentre il forecolor delle textbox è settato a blu...
I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:
255 per vbRed -> 0xFF0000 ' rosso
33023 -> 0xFF8000 ' una sfumatara di arancione
65535 per vbYellow -> 0xFFFF00 ' giallo
65408 -> 0x80FF00 ' una sfumatura di verde
Ora passando questi valori decimali ottengo (riporto i risultati per rosso e giallo in particolare, per gli altri due il colore visibile):
Dalla routine convert24bitcolor ottengo i seguenti valori:
per 255 il colore ARGB: 255,0,0,255 (che è un blu scuro) invece di: 255,255,0,0 (il valore del rosso color.red)
per 65535 ho: 255,0,255,255 invece di 255,255,255,0 (il valore del giallo color.yellow)
per 33023 (sfumatura di arancione in access) mi restituisce una specie di celestino
per 65408 (sfumatura di verde in access) mi restituisce un verde chiaro
Invece dalla routine convertdeccolor ottengo i seguenti valori:
per 255 il colore ARGB: 255,0,28,255 (che è un blu scuro) invece di: 255,255,0,0 (il valore del rosso color.red)
per 65535 ho: 255,255,255,255 invece di 255,255,255,0 (il valore del giallo color.yellow)
per 33023 (sfumatura di arancione in access) mi restituisce una specie di lilla
per 65408 (sfumatura di verde in access) mi restituisce una sfumatura di giallo.
Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..
Ultima modifica effettuata da alip1 il 13/06/2024 alle 12:09
I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:
255 per vbRed -> 0xFF0000 ' rosso
33023 -> 0xFF8000 ' una sfumatara di arancione
65535 per vbYellow -> 0xFFFF00 ' giallo
65408 -> 0x80FF00 ' una sfumatura di verde
Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..
I colori in VBA sono a 24 bit memorizzati: BBBBBBBBGGGGGGGGRRRRRRRR
La funzione diventa:
Codice sorgente - presumibilmente VB.NET
PublicFunction Convert24bitColor(decColor AsInteger)As Color
' Estrarre i bit per ogni componente
Dim b AsInteger=(decColor >> 16)And&HFF ' 8 bit per il blu
Dim g AsInteger=(decColor >> 8)And&HFF ' 8 bit per il verde
Dim r AsInteger= decColor And&HFF ' 8 bit per il rosso
' Restituire il colore come un oggetto Color
Return Color.FromArgb(r, g, b)
EndFunction
I valori sono sempre e solo rappresentati in bit, come li visualizzi nel codice: esadecimale, decimale o quello che vuoi è ininfluente.
La funzione lavora sui bit senza passaggi intermedi, ma restituisce i valori decimali in RGB accettati dall'oggetto Color di VB .Net
Chi è Marco??
Ultima modifica effettuata da Carlo il 13/06/2024 alle 14:49
I colori nella tabella config sono settati da una semplice app scritta in access per cui setta i colori con il valore delle costanti di colore in vba... e sono memorizzati in decimali.
Per ora nel db mi ritrovo con tre rec che hanno nel campo specifico questi colori:
255 per vbRed -> 0xFF0000 ' rosso
33023 -> 0xFF8000 ' una sfumatara di arancione
65535 per vbYellow -> 0xFFFF00 ' giallo
65408 -> 0x80FF00 ' una sfumatura di verde
Da quando osservato credo che probabilmente nelle routine c'è qualcosa che non va...forse il valore decimale sarebbe meglio convertirlo in esadecimale?
Cosa ne pensi Marco?? Grazie non riesco a venirne a capo..
I colori in VBA sono a 24 bit memorizzati: BBBBBBBBGGGGGGGGRRRRRRRR
La funzione diventa:
Codice sorgente - presumibilmente VB.NET
PublicFunction Convert24bitColor(decColor AsInteger)As Color
' Estrarre i bit per ogni componente
Dim b AsInteger=(decColor >> 16)And&HFF ' 8 bit per il blu
Dim g AsInteger=(decColor >> 8)And&HFF ' 8 bit per il verde
Dim r AsInteger= decColor And&HFF ' 8 bit per il rosso
' Restituire il colore come un oggetto Color
Return Color.FromArgb(r, g, b)
EndFunction
I valori sono sempre e solo rappresentati in bit, come li visualizzi nel codice: esadecimale, decimale o quello che vuoi è ininfluente.
La funzione lavora sui bit senza passaggi intermedi, ma restituisce i valori decimali in RGB accettati dall'oggetto Color di VB .Net
Chi è Marco??
Grazie Carlo, come sempre notevole le tue competenze sono uniche, grazie ancora una volta funziona alla perfezione....
P:S: Scusa mio genero si chiama Marco, mi sono sbagliato...
Buongiorno Carlo.
Solo una domanda di curiosita': dove è possibile apprendere che il formato in bit dei colori in vba ha quello da te correttamente indicato 8b8g8r? Grazie