Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 797

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
Нужно записать в ini файл название цвета из ColorComboBox и при повторном запуске программы изменить цвет формы на цвет, записанный в ini файл. Как преобразовать тип TColor в строку и наоборот?

Евгений Eklmn Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Евгений Eklmn (статус: Посетитель)
Вопрос отправлен: 28 июля 2007, 09:45
Состояние вопроса: открыт, ответов: 5.

Ответ #1. Отвечает эксперт: Dron

Здравствуйте, Трофимов Евгений!
TColor свободно конвертируется в Integer, поэтому можно напрямую использовать WriteInteger() и ReadInteger() - работать будет прекрасно.

Ответ отправил: Dron (статус: Студент)
Время отправки: 28 июля 2007, 09:52

Ответ #2. Отвечает эксперт: Градов Ю.М.

Здравствуйте, Трофимов Евгений!
Можно так IntToHex(ColorDialog1.Color,8)

Ответ отправил: Градов Ю.М. (статус: 8-ой класс)
Время отправки: 28 июля 2007, 10:05

Ответ #3. Отвечает эксперт: mvp

Здравствуйте, Трофимов Евгений!
По сути Вам уже ответили. В приложении ф-ии StrToColor (не чуствительная к регистру) и ColorToStr.
Когда-то давно писал эти ф-ии - сейчас сделал бы проще - через массивы и один цыкл. Ну, если захотите - переделаете

Приложение:
  1. uses Graphics;
  2. function StrToColor(name : String) : tcolor;
  3. var _: String;
  4. begin
  5. _:= LowerCase(name);
  6. if _= 'black' then Result := clBlack else if _= 'maroon' then Result := clMaroon else if _= 'green' then Result := clGreen else if _= 'olive' then Result := clOlive else if _= 'navy' then Result := clNavy else if _= 'purple' then result := clPurple else if _= 'teal' then Result := clTeal else if _= 'gray' then result := clGray else if _= 'silver' then result := clSilver else if _='red' then result := clRed else if _= 'lime' then Result := clLime else if _= 'yellow' then Result := clYellow else if _= 'blue' then result := clBlue else if _= 'fuchsia' then result := clFuchsia else if _= 'aqua' then result := clAqua else if _= 'white' then Result := clWhite else if _= 'moneygreen' then result := clMoneyGreen else if _= 'skyblue' then Result := clSkyBlue else if _= 'cream' then Result := clCream else if _= 'medgray' then result := clMedGray else if _= 'none' then result := clNone else if _= 'default' then result := clDefault
  7. else if _= 'scrollbar' then Result := clScrollBar else if _= 'background' then Result := clBackground else if _= 'activecaption' then Result := clActiveCaption else if _= 'inactivecaption' then result := clInactiveCaption else if _= 'menu' then result := clMenu else if _= 'window' then Result := clWindow else if _= 'windowframe' then result := clWindowFrame else if _= 'menutext' then result := clMenuText else if _= 'windowtext' then result := clWindowText else if _= 'activeborder' then result := clActiveBorder else if _= 'appworkspace' then Result := clAppWorkSpace else if _= 'highlight' then result := clHighlight else if _= 'btnface' then Result := clBtnFace else if _= 'btnshadow' then result := clBtnShadow else if _= 'graytext' then result := clGrayText else if _= 'btntext' then result := clBtnText else if _='inactivecaptiontext' then result := clInactiveCaptionText else if _='btnhighlight' then Result := clBtnHighlight else if _= '3ddkshadow' then result := cl3DDkShadow else if _= '3dlight' then
  8. result := cl3DLight else if _= 'infotext' then Result := clInfoText else if _= 'infobk' then result := clInfoBk else if _= 'gradientactivecaption' then Result := clGradientActiveCaption else if _= 'gradientinactivecaption' then result := clGradientInactiveCaption else result := clNone
  9. end;
  10. //------------------------------------------------------------------------------
  11. function ColorToStr(color : TColor);
  12. begin
  13. case color of
  14. clBlack : Result := 'Black';
  15. clMaroon : Result := 'Maroon';
  16. clGreen : Result := 'Green';
  17. clOlive : Result := 'Olive';
  18. clNavy : Result := 'Navy';
  19. clPurple : Result := 'Purple';
  20. clTeal : Result := 'Teal';
  21. clGray : Result := 'Gray';
  22. clSilver : Result := 'Silver';
  23. clRed : Result := 'Red';
  24. clLime : Result := 'Lime';
  25. clYellow : Result := 'Yellow';
  26. clBlue : Result := 'Blue';
  27. clFuchsia : Result := 'Fuchsia';
  28. clAqua : Result := 'Aqua';
  29. clWhite : Result := 'White';
  30. clMoneyGreen : Result := 'MoneyGreen';
  31. clSkyBlue : Result := 'SkyBlue';
  32. clCream : Result := 'Cream';
  33. clMedGray : Result := 'MedGray';
  34. clNone : Result := 'None';
  35. clDefault : Result := 'Default';
  36. clScrollBar : Result := 'ScrollBar';
  37. clBackground : Result := 'BackGround';
  38. clActiveCaption : Result := 'ActiveCaption';
  39. clInactiveCaption : Result := 'InActiveCaption';
  40. clMenu : Result := 'Menu';
  41. clWindow : Result := 'Window';
  42. clWindowFrame : Result := 'WindowFrame';
  43. clGradientInactiveCaption : Result := 'GradientInactiveCaption';
  44. clMenuText : Result := 'MenuText';
  45. clWindowText : Result := 'WindowText';
  46. clActiveBorder : Result := 'ActiveBorder';
  47. clAppWorkSpace : Result := 'AppWorkSpace';
  48. clHighlight : Result := 'HighLight';
  49. clBtnFace : Result := 'BtnFace';
  50. clBtnShadow : Result := 'BtnShadow';
  51. clGrayText : Result := 'GrayText';
  52. clBtnText : Result := 'BtnText';
  53. clInactiveCaptionText : Result := 'InActiveCaptionText';
  54. clBtnHighlight : Result := 'BtnHighLight';
  55. cl3DDkShadow : Result := '3DDkShadow';
  56. cl3DLight : Result := '3DLight';
  57. clInfoText : Result := 'InfoText';
  58. clInfoBk : Result := 'InfoBk';
  59. clGradientActiveCaption : Result := 'GradientActiveCaption'
  60. else REsult := 'None'
  61. end
  62. end;


Ответ отправил: mvp (статус: 4-ый класс)
Время отправки: 28 июля 2007, 14:48

Ответ #4. Отвечает эксперт: Вадим К

Здравствуйте, Трофимов Евгений!
to Градов Ю.М.:
А наоборот? отвечу сам c:=StrToInt(\'$\'+s);

To mvp:
Зачем изобретать велосипед? Ведь есть готовые функции в модуле Graphics. Называются IdentToColor и ColorToIdent.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 июля 2007, 15:24

Ответ #5. Отвечает эксперт: Дима Гусаков

Здравствуйте, Трофимов Евгений!
Тип TColor преобразуется в строку функцией olorToString(Color: TColor): string, а обратно StringToColor(const S: string): TColor;

Приложение:
  1. var
  2. Vars: TIniFile;
  3. ...
  4.  
  5. Vars:=TiniFile.Create(extractfilepath(paramstr(0))+'\vars.ini');
  6. Vars.WriteString('Form', 'Color', ColorToString(Form1.Color));
  7. Vars.Free;
  8.  
  9.  
  10. procedure TForm1.FormCreate(Sender: TObject);
  11. begin
  12. Vars:=TiniFile.Create(extractfilepath(paramstr(0))+'\vars.ini');
  13. Form1.Color := StringToColor(Vars.ReadString('Form', 'Color', 'clRed'));
  14. Vars.Free;
  15. end;


Ответ отправил: Дима Гусаков (статус: 2-ой класс)
Время отправки: 28 июля 2007, 16:01


Мини-форум вопроса

Всего сообщений: 13; последнее сообщение — 30 июля 2007, 10:32; участников в обсуждении: 4.
Dron

Dron (статус: Студент), 28 июля 2007, 16:44 [#1]:

Вопрос ко всем: зачем конвертировать цвет в строку, если и запись и чтение с TColor элементарно делается как с обычным числом? Заставить машину побольше поработать?
С уважением.
mvp

mvp (статус: 4-ый класс), 28 июля 2007, 17:15 [#2]:

2Вадим К.
Кажется в Delphi 6 такой ф-ии не было, хотя могу и ошибаться - в любом случае ничего страшного в том, что умеешь обойтись без стандартных.
2Dron
Ну, например, есть приложение, которое настраевается вручную через ini-файл (линуксоиды любят) - и что человек должен вспоминать, какое число значит фиалетовый цвет? Мне такое приходилось писать. Другими словами, понадобиться может даже то, что кажется не очевидным. Но всё-таки, в данном вопросе согласен - достаточно сохранить число
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 28 июля 2007, 17:40 [#3]:

To Вадим К.
По требованию заказчика: "Как преобразовать тип TColor в строку и наоборот?" А про велосипед, это точно.
Dron

Dron (статус: Студент), 28 июля 2007, 17:43 [#4]:

Цитата:

> По требованию заказчика: "Как преобразовать тип TColor в строку и наоборот?"

Да, но возможно человек просто не знал, что с TColor можно обращаться как с числом...
Так что все варианты правильны, имхо :-)
С уважением.
mvp

mvp (статус: 4-ый класс), 28 июля 2007, 18:01 [#5]:

Да ладно, - пристали со своим велосипедом :))) Лучше скажите, были ли эти ф-ии в 6-й Делфи (сейчас у меня 7)?
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 28 июля 2007, 22:47 [#6]:

Я из Delphi6 и отвечал
mvp

mvp (статус: 4-ый класс), 28 июля 2007, 23:49 [#7]:

Значит таки действительно велосипед :)
Вадим К

Вадим К (статус: Академик), 29 июля 2007, 01:50 [#8]:

Цитата:


вспоминать, какое число значит фиалетовый цвет

Ну для начала фиолетовый
А во вторых можно и проще. Когда мне пришлось делать подобное, я сделал вначале попытку преобразовать цвет с естественной записи, и если это не получилось, то с шестнадцатеричного. в коде это выглядело где то так
var c:TColor;
s:string;
begin
s = введёная строка
try
if not IdentToColor(\'cl\'+s,c) and not IdentToColor(s,c)then
  c:=StrToInt(\'$\'+s);
except
  c:=0;
  ShowMessage(\'Цвет задан некорректно. Принят чёрный\');
end;
В таком виде для задания красного можно юзать следующие конструкции Red, clRed, FF0000
Галочка "подтверждения прочтения" - вселенское зло.
mvp

mvp (статус: 4-ый класс), 29 июля 2007, 12:25 [#9]:

2Вадим К:
А мне фиАлетово как пишется фиОлетово, т. к.:
1) я знаю и без всяких умников, как оно пишется;
2) русский язык - не мой родной (как впрочем и твой);
3) мы не на форуме по русскому языку;
4) посмотри, например на свой ответ в вопросе 792 - сразу несколько ошибок (классика прям: "Что делатЬ?", "Что делает?")
5) Соринку в чужом глазе видно сразу, а в своём хоть бревно :)

P. S. Ещё надо было проверить, а вдруг цвет задан в двоичной, 8-, 10-ричной или вообще в любой возможной системе счисления
Вадим К

Вадим К (статус: Академик), 29 июля 2007, 14:27 [#10]:

Стараюсь за своими ошибками следить. И Админ постоянно поправляет.

Цитата:


я знаю и без всяких умников, как оно пишется

Ок, а почему не пишем?
По поводу восмеричной системы. о ней знают немногие, а используют и то меньше. В моей программе было указано варианты, как задаётся цвет.
Галочка "подтверждения прочтения" - вселенское зло.
mvp

mvp (статус: 4-ый класс), 29 июля 2007, 15:08 [#11]:

Всё Вадим, проехали - давай не будем ссориться. Если обидел - извени.
Мой ответ был неудачным, но это не значит, что его нельзя использовать.
Думаю, вопрос закрыт
Градов Ю.М.

Градов Ю.М. (статус: 8-ой класс), 29 июля 2007, 22:50 [#12]:

Это надо же так поцапаться из-за цвета, а если бы спросили перевести пиксели в метры?
Вадим К

Вадим К (статус: Академик), 30 июля 2007, 10:32 [#13]:

Ну тут вообще ничего сложного. Главное DPI знать...
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:30
Выполнено за 0.02 сек.