Avatar billede ducks Nybegynder
02. oktober 2002 - 15:45 Der 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)

-Ducks
Avatar billede martin_moth Mester
02. oktober 2002 - 15:54 #1
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
Avatar billede ducks Nybegynder
02. oktober 2002 - 16:02 #2
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
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:16 #3
Brug :
Text1.Text = Format(Hex(CommonDialog1.Color),"00000000")

, eller det format du nu ønsker...

Mvh
Martin
Avatar billede martin_moth Mester
02. oktober 2002 - 16:19 #4
> Ducks: Sorry, misforstod spørgsmålet
> Brobaek - din løsning giver også bare "FF" ved valg af rød :o(
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:25 #5
Dough - min fejl...
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:29 #6
Med lidt spaghetti kodning kan man så bruge evt. vha. if-sætning og Len-funktionen kan man gøre det...
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:31 #7
Private Sub Command1_Click()

  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
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:32 #8
Tilsv. skal laves for len(...)=3,4...,7
Avatar billede martin_moth Mester
02. oktober 2002 - 16:33 #9
Lidt om Hexidecimale til.

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
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:33 #10
Hehe... Martin, din kode er lidt smukkere ;-)
Avatar billede martin_moth Mester
02. oktober 2002 - 16:40 #11
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)
Avatar billede brobaek Nybegynder
02. oktober 2002 - 16:44 #12
Det var egentlig ment somt ros, idet din null-funktion er pænere end 5 iif sætninger...
Avatar billede martin_moth Mester
02. oktober 2002 - 16:45 #13
Sådan blev det også opfattet - og det kan gøres endnu pænere - men finpudsningen må ducks om ;o)
Avatar billede ducks Nybegynder
02. oktober 2002 - 17:17 #14
Nu ser koden indtil videre sådan ud:

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 ?
Avatar billede martin_moth Mester
02. oktober 2002 - 19:58 #15
Hvad bliver rød? Eller blå?
Avatar billede sjh Nybegynder
02. oktober 2002 - 21:51 #16
Prøv sådan:

Option Explicit

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
Avatar billede allanmc Nybegynder
03. oktober 2002 - 22:26 #17
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...
Avatar billede sjh Nybegynder
03. oktober 2002 - 23:01 #18
allanmc >Det giver ikke HTML-hex-color på alle farver
Avatar billede sjh Nybegynder
03. oktober 2002 - 23:04 #19
prøv at vælge farven gul og sette den ind i et html-doc

<font color="#FFFF00">GUL</font>
Avatar billede ducks Nybegynder
04. oktober 2002 - 09:47 #20
allanmc, det vil aldrig virke, hvis man vælger en farve som hedder FF0000 bliver den lavet om til 0000FF
Avatar billede martin_moth Mester
04. oktober 2002 - 10:49 #21
Ø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?
Avatar billede allanmc Nybegynder
04. oktober 2002 - 22:11 #22
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...
Avatar billede sjh Nybegynder
05. oktober 2002 - 03:16 #23
prøv at vælge farven gul og sette den ind i et html-doc

gul = #FFFF00
<font color="#FFFF00">GUL</font>
Avatar billede sjh Nybegynder
05. oktober 2002 - 03:17 #24
og jeg har testet din kode
Avatar billede sjh Nybegynder
05. oktober 2002 - 03:18 #25
dov i vb5 men det skulle ikke gøre den store forskel
Avatar billede allanmc Nybegynder
05. oktober 2002 - 14:23 #26
Å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:

Dim TempStr As String
TempStr = Right("000000" & Hex(Form1.CD1.Color), 6)
MsgBox Mid(TempStr, 5, 2) & Mid(TempStr, 3, 2) & Mid(TempStr, 1, 2)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester