Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.05.2009, 20:08
Рената Литвинова Рената Литвинова вне форума
Прохожий
 
Регистрация: 24.05.2009
Сообщения: 7
Репутация: 10
По умолчанию Вставка шестнадцатеричного кода цвета в редактор - как?

И снова это я)
Редактор дописан, все работает, хотелось бы еще прикрутить к нему среди прочих функций быстрой вставки тегов функцию вставки шестнадцатеричного кода выбранного цвета, как это реализовано во многих коммерческих редакторах, например, в Blumental's HTML Pad (скрин).
Можно ли (и как) реализовать что-то подобное средствами Делфи? TColorDialog подойдет ли для этого? И как тогда заставить выполнять его именно эту функцию? Нужна только вставка кода в поле редактора в формате "#HHHHHH" и ничего более. Если это возможно, помогите каким-нибудь примером или исходником, пожалуйста.
Ответить с цитированием
  #2  
Старый 26.05.2009, 20:26
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Думается надо разложить значение цвета в RGB, потом каждый байт перевести в 16-ричный вид, записать попорядку и вставить в начале решетку. Смотри GetRValue, GetGValue, GetBValue, IntToHex.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 26.05.2009, 21:14
Рената Литвинова Рената Литвинова вне форума
Прохожий
 
Регистрация: 24.05.2009
Сообщения: 7
Репутация: 10
По умолчанию

Aristarh Dark, о боже... попроще и попримитивнее способа нет, наверное? =(
Ответить с цитированием
  #4  
Старый 26.05.2009, 21:29
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

А это сложный способ????
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #5  
Старый 26.05.2009, 21:51
Рената Литвинова Рената Литвинова вне форума
Прохожий
 
Регистрация: 24.05.2009
Сообщения: 7
Репутация: 10
По умолчанию

Aristarh Dark, я ламер =( Для меня пока сложный(
Ответить с цитированием
  #6  
Старый 26.05.2009, 23:25
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Есть способ проще и менее культурный. Правда, непонятно зачем, когда можно сделать нормально... =)
Код:
function GetHexColor: string;
begin
  Result := '#000000';
  if not ColorDialog1.Execute then Exit;
  Result := IntToHex(ColorDialog1.Color, 6);
  Result := '#' + Copy(Result, 5, 2) + Copy (Result, 3, 2) + Copy(Result, 1, 2);
end;

А вот "нормальный" способ:
Код:
function GetHexColor: string;
var
 hex: Cardinal;
 clrR, clrG, clrB: Byte;
begin
  Result := '#000000';
  if not ColorDialog1.Execute then Exit;
  clrR := GetRValue(ColorDialog1.Color);
  clrG := GetGValue(ColorDialog1.Color);
  clrB := GetBValue(ColorDialog1.Color);
  hex := clrB or (clrG shl 8) or (clrR shl 16);
  Result := '#' + IntToHex(hex, 6);
end;
Ответить с цитированием
  #7  
Старый 27.05.2009, 00:39
Рената Литвинова Рената Литвинова вне форума
Прохожий
 
Регистрация: 24.05.2009
Сообщения: 7
Репутация: 10
По умолчанию

Nyctos Kasignete, спасибо, что помогаете!
Программа работает... и вставка цвета работает... правда, через задницу, из которой мои руки выросли

Компилятор злостно ругается на строку
Код:
 if not ColorDialog1.Execute then Exit;
, но если ее убрать - все нормально.

А дальше... В общем, вот что я делаю:

Код:
function GetHexColor: string;
var
 hex: Cardinal;
 clrR, clrG, clrB: Byte;
 ColorDialog1: TColorDialog;
begin
  Result := '#000000';
 // if not ColorDialog1.Execute then Exit;
  clrR := GetRValue(ColorDialog1.Color );
  clrG := GetGValue(ColorDialog1.Color);
  clrB := GetBValue(ColorDialog1.Color);
  hex := clrB or (clrG shl 8) or (clrR shl 16);
  Result := '#' + IntToHex(hex, 6);
  col:=Result;
end;
...
Код:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
ColorDialog1.Execute;
end;

procedure TfrmMain.ColorDialog1Close(Sender: TObject);
begin
GetHexColor;
SynEdit1.SelText:=col;
end;

При этом вставка вроде работает... Но вставляет один и тот же цвет - #56E8B6. Пробую пальцем в небо - переношу вызов функции в процедуру Button1Click - вставляет цвет #0F0FB7. Снова один и тот же.
Где я туплю?

PS: Да, и поскольку строку "if not ColorDialog1.Execute then Exit" приходится убрать (компилятор что-то ругаться перестал, но программа при нажатии Canсуд в диалоге выбора цвета выдает ошибку), при нажатии Отмена цвет тоже вставляется...

Последний раз редактировалось Рената Литвинова, 27.05.2009 в 01:16.
Ответить с цитированием
  #8  
Старый 27.05.2009, 10:05
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Есть готовая функция. Подставляй значения.
Код:
color := RGB($FF,$AC,$00);
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #9  
Старый 27.05.2009, 13:24
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Рената Литвинова, немного странный способ вызова диалога выбора цвета... Писать обработчик события OnClose диалога необязательно. Всё можно сделать за один присест: вызвать диалог (модальное окно!) и по закрытии его изменить цвет.
Функцию-то написанную вы вызываете, а возвращаемое ею значение (самое главное) нигде не используеуте. Предлагаю вам убрать процедуру ColorDialog1Close совсем, а в обработчике события OnClick кнопки написать так:
Код:
procedure TfrmMain.Button1Click(Sender: TObject);
begin
  SynEdit1.SelText := GetHexColor;
end;
Строчку, которую вы закомментировали в функции, раскомментируйте. Ошибка была из-за того, по-видимому, что производилась повторная попытка открыть окно диалога (уже открытое).
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:15.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter