Помогите чайнику разобраться с выбором цвета.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Захарик
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 10.07.2006 (Пн) 22:44
Откуда: Россия

Помогите чайнику разобраться с выбором цвета.

Сообщение Захарик » 13.07.2006 (Чт) 21:53

Есть проблема. Пишу маленькую программку - html-редактор для создания специализированных сайтов для партнёрской программы.
Для выбора пользователем цвета шрифта различных элементов будущего сайта, попробывал использовать ComboBox. Однако в Visual Basic цвет имеет многозначное представление,в то время, как в html - шестнадцатиричное восьмизначное.
Как осуществить перевод выбранного пользователе :roll: м цвета в программе в близкий ему цвет в html-документе.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.07.2006 (Чт) 22:18

Код: Выделить всё


Function RGB2Hex(ByVal Color as long)
bgrhex="000000"
RSet bgrhex = Hex(Color)
bgrhex = Replace(bgrhex, " ", "0")
RGB2Hex = "#" + Mid$(bgrhex, 5,2) + Mid$(bgrhex, 3,2) +Mid$(bgrhex, 5,2)
End Function


Используется так
Код: Выделить всё
MsgBox RGB2Hex( RGB( 32, 20, 256)) ' Выдаст #2014FF
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 13.07.2006 (Чт) 22:26

На форуме где-то было разложение цвета в VB по трем составляющим: красный, синий, зелёный.
Алгоритм такой: определяешь, сколько в выбранном тобой цвете красного, сколько зелёного и соотвветственно синего, затем переводишь эти значения в HEX (получится три строки). Получить цвет для HTML кода можно, соединив эти три строки в порядке HEX_RED + HEX_GREEN + HEX_BLUE.

[ADDED]Упс... Опоздал немного... :oops:
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 13.07.2006 (Чт) 22:41

Lumen. Мне этот способ жутко не нравится, по сравнению с тем, который я предложил.

Но у автора вопроса должно быть право выбора поэтому вот:

Код: Выделить всё
Function RGB2Hex(ByVal Color as long)
Dim bRed   As Byte
Dim bGreen As Byte
Dim bBlue  As Byte

bRed = (Color And vbRed)
bGreen = (Color And vbGreen) \ 255
bBlue = (Color And vbBlue) \ 255 \ 255

RGB2Hex = "#" + CStr(bRed) + CStr(bGreen) + CStr(bBlue)
End Function


использование функции такое же
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Захарик
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 10.07.2006 (Пн) 22:44
Откуда: Россия

Сообщение Захарик » 14.07.2006 (Пт) 23:03

Пока сбасибо. Сейчас попробую въехать, опробовать и всё такое...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.07.2006 (Сб) 20:06

Хакер
Твой последний вариант выдаст, при RGB2Hex(RGB(100, 250, 200)):
#100250201 :lol:
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.07.2006 (Сб) 20:17

И ещё... У тебя он заторможенный... Вот, сравни скорость:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Код: Выделить всё
Sub main()
Dim tk As Long, n As Long, result As String
tk = GetTickCount
For n = 0 To 599999
result = RGB2Hex2(&HA0D0F0)
Next
MsgBox "Мой вариант за " & (GetTickCount - tk) & " миллисекунд выполнился 50000 раз"

tk = GetTickCount
For n = 0 To 599999
result = RGB2Hex(&HA0D0F0)
Next
MsgBox "Твой первый вариант за " & (GetTickCount - tk) & " миллисекунд выполнился 50000 раз"

End Sub

Function RGB2Hex2(ByVal Color As Long) As String
RGB2Hex2 = "#" + Hex$((Color And vbRed)) + Hex$((Color And vbGreen) \ 255) + Hex$((Color And vbBlue) \ 255 \ 255)
End Function


Function RGB2Hex(ByVal Color As Long)
bgrhex = "000000"
RSet bgrhex = Hex(Color)
bgrhex = Replace(bgrhex, " ", "0")
RGB2Hex = "#" + Mid$(bgrhex, 5, 2) + Mid$(bgrhex, 3, 2) + Mid$(bgrhex, 5, 2)
End Function
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.07.2006 (Сб) 20:29

keks-n писал(а):...Мой вариант за ...


Во блин, а чем это он твой :twisted:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 15.07.2006 (Сб) 20:34

Хакер
Я вообще-то скопировал с модуля, написанного года 2 назад... Это так... К сведению.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.07.2006 (Сб) 21:31

keks-n писал(а):
Код: Выделить всё
Function RGB2Hex2(ByVal Color As Long) As String
RGB2Hex2 = "#" + Hex$((Color And vbRed)) + Hex$((Color And vbGreen) \ 255) + Hex$((Color And vbBlue) \ 255 \ 255)
End Function

Хоть бы проверял код, прежде чем постить? :-|
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 15.07.2006 (Сб) 21:38

угу.

особено RGB(255,0,255)

ЗЫ. А почему у тебя интересно также \ всесто / хотя там всегда целый резульатат. И также \255\255 а не \ 65025

странные совпадения, не правда ли?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 0:28

Ну, ладно, преувеличил... Та почти такой же код.
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.07.2006 (Вс) 7:26

Так что? Работающую версию RGB2Hex2 запостите, или это будет задача для самостоятельного решения?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.07.2006 (Вс) 9:18

А чё тут думать то

Код: Выделить всё
Function RGB2Hex(ByVal Color as long)
RGB2Hex = "#" + Format$(Hex$(Color And vbRed) , "00") + _
Format$(Hex$((Color And vbGreen) \ 255),"00") + _
Format$(Hex$((Color And vbBlue) \ 65025), "00")
End Function


Добавлено:

вот ещё 1 вариант:

Код: Выделить всё
Function RGB2Hex(ByVal Color As Long)
Dim hexval As String * 6
RSet hexval = Hex$(RGB((Color And vbBlue) \ 65025, (Color And vbGreen) \ 255, (Color And vbRed)))
RGB2Hex = "#" + Replace(hexval, " ", "0")
End Function
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.07.2006 (Вс) 9:48

Теперь RGB2Hex(RGB(255, 0, 255)) возвращает "#FF00101".
Тебя это устраивает?
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.07.2006 (Вс) 10:12

Нифига. Только что проверил. #FF00FF.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 16.07.2006 (Вс) 10:20

Да не может твоя функция возвращать #FF00FF, потому что там две ошибки. Точнее полторы, потому что вторая вытекает из первой.
Хакер писал(а):И также \255\255 а не \ 65025
странные совпадения, не правда ли?
Как там у нас в бриллиантовой руке... Странные, если не сказать больше :lol:
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 16.07.2006 (Вс) 10:30

И зачем вообще извращаться, если можно написать
Код: Выделить всё
Private Function RGB2Hex(ByVal Color As Long) As String
    RGB2Hex = "#" & Format$(Hex$(Color), "000000")
End Function
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 11:11

vvs_adm
Скорость... Строковые операции выполняются медленнее.
Изображение

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 16.07.2006 (Вс) 11:21

keks-n писал(а):vvs_adm
Скорость... Строковые операции выполняются медленнее.
Т.е. твой неработающий код с тремя хексами и тройным сложением строк работает быстрее моего "со строковыми операциями"? :shock: Надо проверить :)

P.S. ну вообще проверка показала, что
Код: Выделить всё
Right$("000000" & Hex$(Color),6)
гораздо быстрее, чем format$ и в пару раз быстрее, чем твой неработающий код. А что касается кода Хакера, то даже не надо проверять, что format$ вместо right$ всё таки, по идее, быстрее, чем три формата. :)
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 11:46

Убедил... Кстати, нашёл тот модуль о котором говорил... Там использовалась такая конструкция:
Код: Выделить всё
Function RGB2Hex(color As Long) As String
RGB2Hex = "#" + Hex$(color And &HFF) + Hex$((color And &HFF00) / &H100 And &HFF) + Hex$((color And &HFF0000) / &H10000)
End Function

Которая таки медленнее...
Изображение

Захарик
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 10.07.2006 (Пн) 22:44
Откуда: Россия

Сообщение Захарик » 16.07.2006 (Вс) 17:38

Хакер писал(а):Lumen. Мне этот способ жутко не нравится, по сравнению с тем, который я предложил.

Но у автора вопроса должно быть право выбора поэтому вот:

Код: Выделить всё
Function RGB2Hex(ByVal Color as long)
Dim bRed   As Byte
Dim bGreen As Byte
Dim bBlue  As Byte

bRed = (Color And vbRed)
bGreen = (Color And vbGreen) \ 255
bBlue = (Color And vbBlue) \ 255 \ 255

RGB2Hex = "#" + CStr(bRed) + CStr(bGreen) + CStr(bBlue)
End Function


использование функции такое же


Всё Огромноре спасибо. Получил, что хотел. Программа работает..

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 17:43

Захарик
Юзай вариант от vvs_adm-он быстрее и компактнее.
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.07.2006 (Вс) 17:43

vvs_adm писал(а):И зачем вообще извращаться, если можно написать
Код: Выделить всё
Private Function RGB2Hex(ByVal Color As Long) As String
    RGB2Hex = "#" & Format$(Hex$(Color), "000000")
End Function


Круто, вот только функцию переименуй в BGR... :x
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.07.2006 (Вс) 17:53

:twisted:

Покажите мне хоть один рабочий вариант от vss_adm
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 16.07.2006 (Вс) 18:02

Так вот зачем извращаться :) А я проверил, как Тёмыч и просил, на RGB(255, 0, 255) :) Ну тогда все равно формат замени на Right$, но самое главное - 255 на 256 :wink: :lol:
Последний раз редактировалось vvs_adm 16.07.2006 (Вс) 19:12, всего редактировалось 1 раз.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 16.07.2006 (Вс) 18:07

Гы... Не проверял. Но моя конструкция, по сравнению с тем, что выбрал Захарик на 11.5% быстрее

Код: Выделить всё
Option Explicit
Private Declare Function GetTickCount Lib "kernel32" () As Long

Sub main()
Dim tk As Long, n As Long, result As String
tk = GetTickCount()
For n = 0 To 599999
result = RGB2Hex2(&HA0D0F0)
Next
MsgBox "Ìîé âàðèàíò çà " & (GetTickCount - tk) & " ìèëëèñåêóíä âûïîëíèëñÿ 50000 ðàç"

tk = GetTickCount
For n = 0 To 599999
result = RGB2Hex(&HA0D0F0)
Next
MsgBox "Òâîé âàðèàíò çà " & (GetTickCount - tk) & " ìèëëèñåêóíä âûïîëíèëñÿ 50000 ðàç"

End Sub

Function RGB2Hex2(color As Long) As String
RGB2Hex2 = "#" + Hex$(color And &HFF) + Hex$((color And &HFF00) / &H100 And &HFF) + Hex$((color And &HFF0000) / &H10000)
End Function

Function RGB2Hex(ByVal color As Long)
Dim bRed   As Byte
Dim bGreen As Byte
Dim bBlue  As Byte

bRed = (color And vbRed)
bGreen = (color And vbGreen) \ 255
bBlue = (color And vbBlue) \ 255 \ 255

RGB2Hex = "#" + CStr(bRed) + CStr(bGreen) + CStr(bBlue)
End Function
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.07.2006 (Вс) 18:12

Вот блин народ. Вот, суммарный код:

Код: Выделить всё
Function RGB2Hex(ByVal Color As Long)
RGB2Hex = "#" + Right$("000000" + Hex$(RGB((Color And vbBlue) \ 65536, (Color And vbGreen) \ 256, (Color And vbRed))), 6)
End Function


И нафиг тут мерить скорость. Если это делается только при List1_Click.

Ну нафиг здесь скорости вы мне объясните.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

vvs_adm
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1492
Зарегистрирован: 03.02.2005 (Чт) 3:45
Откуда: оттуда ;)

Сообщение vvs_adm » 16.07.2006 (Вс) 18:14

keks-n да неправильно они у тебя склеиваются!!! У тебя RGB(5,17,5) вернет 5115, а должна 051105.
Никогда не откладывай на завтра то, что можно ... отложить на послезавтра!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.07.2006 (Вс) 18:15

Нет, ну Хакеру трое показывали на 65025 в коде, который он выдавал за рабочий, а он потом ещё возмущается.
:roll: :roll:
Изображение

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 109

    TopList