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

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

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

Delphi.int.ru Expert

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

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

#   

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


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

Подробнее »



Вопрос # 2 844

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

Здравствуйте, уважаемые эксперты!
Я работаю над написанием простого html-редактора. Редактор дописан, все работает, хотелось бы еще прикрутить к нему среди прочих функций быстрой вставки тегов функцию вставки шестнадцатеричного кода выбранного цвета, как это реализовано во многих коммерческих редакторах, например, в Blumental's HTML Pad (скриншот для примера в приложении).
Можно ли (и как) реализовать что-то подобное средствами Делфи? TColorDialog подойдет ли для этого? И как тогда заставить выполнять его именно эту функцию? Нужна только вставка кода в поле редактора в формате "#HHHHHH" и ничего более. Если это возможно, помогите каким-нибудь примером или исходником, пожалуйста.

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Приложение:
  1.  


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

Вопрос задала: Roxanne (статус: Посетитель)
Вопрос отправлен: 26 мая 2009, 20:12
Состояние вопроса: открыт, ответов: 1.

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

Здравствуйте, Roxanne!
Можно, всё можно. К сожалению, Вы не написали, что вы используете для редактора, поэтому я применяю мемо. Но для других компонентов это будет работать с минимальными переделками. Для начала понадобиться функция для вставки текста в редактор. Она будет выглядеть так

procedure TForm1.InsText(s: string);
var i:integer;
begin
  i := Memo1.SelStart;//запомним где курсор
  Memo1.SelText:= s;//собственно вставка
  Memo1.SelStart:= length(s)+i;//разместим курсор за тектом
  Memo1.SetFocus;//и передадим фокус в мемо
end;
Теперь достаточно для кнопки написать код InsText(''); и будет вставлен нужный тег. Но есть несколько недочетов. Например, хотелось бы, что бы если текст был выделенный, то обрамлять его. Сделаем такую процедуру (я разбил её на две).
procedure TForm1.decorate(start, stop: string);
var i:integer;
    s:string;
    b:boolean;
begin
  b := Memo1.SelLength <> 0;
  i := Memo1.SelStart;
  s := start + Memo1.SelText + stop;
  Memo1.SelText := s;
  if b then
     Memo1.SelStart:= length(s)+i
  else
     Memo1.SelStart := i + length(start);
  Memo1.SetFocus;
end;
 
procedure TForm1.addtag(atag: string);
begin
  decorate('<'+atag+'>','</'+atag+'>');
end;
теперь можно спокойно вызывать addtag('b') и выделенный текст будет завернут в тег b. Если текст не выделен - то просто будет вставлен тег.
Понятное дело, что в случае, если выделенного текста нет, то курсор лучше оставить между тегами - и наша процедура умеет это делать. Теперь реализовать много функций будет очень просто.

Теперь вторая часть - вставка цвета. Это просто
if ColorDialog1.Execute then
    InsText('#'+IntToHex(ColorDialog1.Color, 6));
По поводу приведённого скриншота. Разработчики программы создали свою форму. Вы тоже можете.
Дерзайте:)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 26 мая 2009, 23:31
Оценка за ответ: 5

Комментарий к оценке: Спасибо, Вы мне очень помогли!

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

Всего сообщений: 1; последнее сообщение — 27 мая 2009, 00:01; участников в обсуждении: 1.
Roxanne

Roxanne (статус: Посетитель), 27 мая 2009, 00:01 [#1]:

Благодарю Вас, Вадим! Для написания я использовала SynEdit, но ничего, постараюсь это перекроить под него. Спасибо за подробное объяснение!

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

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