02. oktober 2002 - 15:45Der er
22 kommentarer og 4 løsninger
Skal bruge hex farvekode
Jeg skal bruge en eller anden funktion, så når man vælger en farve i en farvebox (CommonDialog1.ShowColor), dertil prøvede jeg først med denne:
Text1.Text = Hex(Form1.CD1.Color)
Men hvis man så vælger fx en rød, vil resultatet blive FF (kan ikke lige huske om farven passer til koden, men hvis i kan forstå princippet), så prøvede jeg med:
Text1.Text = Hex(Form1.CD1.Color) & "000000"
Men det fandt jeg så ud af at det vil heller ikke virke, for hvis man vælger fx blå er koden 0000FF, men den udskrives FF og så adder jeg automatisk resten af nullerne, atlså FF0000 (i stedet for 0000FF) så farven bliver rød.
Så mit spørgsmål er, hvordan retter jeg det, så den kan skrive hele farvekoden ud, med 0'er og det hele?
(PS, jeg bruger Maxlength = 6, så det aldrig ville kunne blive en større kode, end på 6 tegn)
Hvis du har en commondialog1, command1 og en text1 på din form, virker følgende:
Private Sub Command1_Click() Dim i As Integer On Error GoTo No_Color_Chosen CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Text1.BackColor = CommonDialog1.Color Exit Sub No_Color_Chosen: Exit Sub End Sub
Det er jo bare det samme som det jeg skrev, bare mere kode, hvis den skal kunne virke nogenlunde ordentligt for mig skulle den se sådan ud:
Private Sub Command1_Click() Dim i As Integer On Error GoTo No_Color_Chosen CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Text1.BackColor = CommonDialog1.Color Text1.Text = Hex(CommonDialog1.Color) Exit Sub No_Color_Chosen: Exit Sub End Sub
Men Text1.Text vil stadig bare være 0 hvis man vælger sort den skal være 000000... osv. som jeg startede med at skrive
Dim i As Integer Dim strExNull As String On Error GoTo No_Color_Chosen CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Text1.Text = Hex(CommonDialog1.Color) strExNull = IIf(Len(Text1.Text) = 2, "000000", "") Text1.Text = strExNull & Text1.Text Exit Sub No_Color_Chosen: Exit Sub End Sub
FF er præcis det samme som 000000FF, men FF er ikke det samme som FF000000
Hvis du får et hexidecimaltal smidt tilbage fra HEX-funktionen, og antallet af cifre er mindre end 8, kan du bare proppe de "manglende" nuller foran.
Derfor: Få HEX-koden som du gør (Rød = FF). Læs længden på HEX-koden (rød har koden FF som har 2 cifre) smid (8-2) nuller foran HEX-koden, og alle er glade.
Private Sub Command1_Click()
CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Dim strColor As String Dim HEXKode As String Dim Nuller As String
HEXKode = Hex(CommonDialog1.Color) Dim i As Byte If Len(HEXKode) < 8 Then For i = 1 To 8 - Len(HEXKode) Nuller = Nuller & "0" Next i End If Text1.Text = Nuller & HEXKode End Sub
Jeg skrev mit svar mens du skrev dit, så jeg kunne ikke se dit svar da jeg selv svarede - det sker tit: Man kommer med et svar, og ser, at der pludseligt er en masse der har svaret før en selv... Så må ducks jo vælge hvem han vil give point :o)
Jeg ville nu have forstået spørgsmålet bedre, hvis han havde spurgt: "Hvordan får man det svar man får fra HEX()-kommandoen lavet om til et 8-cifret Hexidecimalt tal?"
Alt det der med commondialog osv. forvirrede mig ;o)
Private Sub Command1_Click() CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Dim strColor As String Dim HEXKode As String Dim Nuller As String
HEXKode = Hex(CommonDialog1.Color) Dim i As Byte If Len(HEXKode) < 6 Then For i = 1 To 6 - Len(HEXKode) Nuller = Nuller & "0" Next i End If Text1.Text = Nuller & HEXKode End Sub
Men når man vælger at lave en rød bliver den blå og omvendt ?
Private Declare Sub CopyMemory Lib "kernel32" Alias _ "RtlMoveMemory" (Destination As Any, _ Source As Any, ByVal Length As Long)
Public Function LNGtoHEX(ByVal LngColor As Long) As String Dim i As Integer Dim bytRGB(2) As Byte Dim sHex As String CopyMemory bytRGB(0), LngColor, 3 For i = 0 To 2 sHex = sHex & IIf(bytRGB(i) < 16, "0", "") & Hex$(bytRGB(i)) Next LNGtoHEX = sHex End Function
Private Sub Command1_Click() CommonDialog1.Flags = cdlCCFullOpen Or cdlCCPreventFullOpen CommonDialog1.ShowColor Text1.Text = "#" & LNGtoHEX(CommonDialog1.Color) End Sub
Hvorfor er det det lige i vil have så meget kode til sådan et lille problem :) ? Ville nu være nemmere sådan her: Text1.Text = Right("000000" & Hex(Form1.CD1.Color), 6)
Hehe, håber det hjælper dig - virker i hvert fald so mdet skal her...
Øhh - den kode jeg har givet dig i ovenstående giver altid den rigtige 8-cifrede hex-kode, efter den farve du har valgt i din commondialog. Men spørgsmålet er stadig åbent, så hvad er det du ikke kan få til at virke?
Undskyld, men har i overhovedet testet mit forslag :) ?
Jeg kan da godt lige komme med en forklaring hvis det hjælper: Text1.Text = Right("000000" & Hex(Form1.CD1.Color), 6) Bliver f.eks. til: Text1.Text = Right("000000" & "FF0000", 6) Det bliver til: Text1.Text = Right("000000FF0000", 6) Så resultatet er altså de 6 sidste cifre.... FF0000 Også her så sandelig også: Text1.Text = Right("000000" & "FF", 6) 'FF svarer til 0000FF Text1.Text = Right("000000FF", 6) Altså reulstatet er stadig som det skal være : 0000FF
sjh: Hvilke HTML-hex-colors giver den ikke korrekt da?
ducks: "allanmc, det vil aldrig virke, hvis man vælger en farve som hedder FF0000 bliver den lavet om til 0000FF" Sjovt nok, hvis jeg med min kode vælger "FF0000" som CD1's color, så bliver resultatet sjovt nok også "FF0000", og ikke "0000FF".... Nok bare min computer det er screwed up ;] Men plz prøv da i det mindste at teste det... ?
Kan da godt være jeg har misforstået et eller andet, men jeg gerne vide hvad...
Åhh sorry kan godt se hvad du mener;] Men hvordan kan det være at farvekoden f.eks. "&H000000FF&" i DC1, ikke svarer til 0000FF, men istedet FF0000hvordan er det lige de har opstilt farvekoderne i den?
Nu er jeg lost :/
Men anyway når det nu engang hænger sådan sammen, skal outputet fra min kode jo bare vendes, så min kode kommer til at se sådan ud:
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.