Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 15:46   #1
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
По умолчанию Как сделать особый стиль для части текста

Опишу задание. Я делаю программку своей знакомой, которая учится на педагога. Программа учебная, предназначена для детей. Это нужно ей к диплому. В общем, задание такое. На экране текст. Заранее в тексте должны быть предусмотрены слова-существительные для которых ученик будет определять падеж. Загорается одно слово жёлтым. Ученик выбирает к какому падежу оно относится (нажимает соответствующую кнопку). Если правильно нажал, цвет слова меняется на зелёный, если нет - красный. Далее выделяется следующее слово жёлтым и т.д.

Проблема у меня заключается в том, что я не могу отдельному слову присвоить какой-то идентификатор (например, цифровой, когда каждое существительное имеет свою цифру 1,2,3... и т.д.), чтобы потом задав цикл тупо красить эти слова цветом, проверяя выполнение условий через if. Получается, что мне нужно под каждое такое слово выделять отдельный Label или Edit, и для КАЖДОГО этого компонента прописывать условия. Это нереально просто, т.к. это не по программистски, да и вообще запутаться можно даже если небольшой текст разбирать.

В Дельфи я не силён, раньше увлекался, потом забросил, а теперь приходится вспоминать...

Подскажите, есть ли какая альтернатива? Можно ли словам текста назначать что-то типа тегов HTML или других идентификаторов, чтобы потом ими оперировать?
delphyok вне форума Ответить с цитированием
Старый 26.06.2012, 16:24   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Проблема у меня заключается в том, что я не могу отдельному слову присвоить какой-то идентификатор (например, цифровой, когда каждое существительное имеет свою цифру 1,2,3... и т.д.)
Если разделить два разных понятия
1. ввод(считывание) текста и
2. отображение текста для теста
то все получится.

Текст для считывания
Цитата:
Проблема[1:И] у меня заключается в том, что я не могу отдельному слову[2:Д] присвоить какой-то идентификатор[3:И] (например, цифровой, когда каждое существительное[4:И] имеет свою цифру[5:В] 1,2,3... и т.д.)
читаем текст, анализируем то что в []
выводим в нужном виде (убираем лишнее, раскрашиваем,...)
задаем вопрос, анализируем ответ. при анализе используем данные из [].

P.S. можете придумать и свой язык разметки (приближенный к предметной области)
Цитата:
своей знакомой, которая учится на педагога
НТМL это тоже самое.
1.Считывание текста с тегами, и
2. отображение в соответствии с ними (но не их самих).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.06.2012, 16:48   #3
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
читаем текст, анализируем то что в []
выводим в нужном виде (убираем лишнее, раскрашиваем,...)
задаем вопрос, анализируем ответ. при анализе используем данные из [].

P.S. можете придумать и свой язык разметки (приближенный к предметной области)
НТМL это тоже самое.
1.Считывание текста с тегами, и
2. отображение в соответствии с ними (но не их самих).
Примерно так я и хотел сделать - создать массив существительных, обозначить их координаты и верные значения падежей. Но у меня проблема скорее в том, как реализовать, т.е. какими компонентами воспользоваться для выделения текста? Label, Edit, Memo, если я не ошибаюсь, то не имеют возможностей для выделения частей текста, которые в них находятся. А значит мне нужно помещать текст не в одном компоненте, а каждый кусок в разные. Но тогда программа разрастается неадекватно своему содержанию. Т.е. как вы и сказали нужен язык разметки и чтобы он мог работать с каким-нибудь готовым компонентом. Но я даже примерно не знаю как это реализовать... Язык разметки я придумаю, а вот как компоненты будут с ним работать не представляю.

Вот к примеру поместил я текст в Label. Я могу изменить цвет всего текста в Label, а изменить цвет отдельного слова не могу...

Последний раз редактировалось delphyok; 26.06.2012 в 16:51.
delphyok вне форума Ответить с цитированием
Старый 26.06.2012, 17:01   #4
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Тоже сразу html пришло в голову. Способов много: вывод на канве (изврат, но способ), WebBrowser и т.д. Наверное, есть готовые решения, не сталкивался с ними - не было нужды.
Из стандартных решений можно также предложить, например, RichEdit (можно ещё и RxLib) глянуть.
Код:
uses
  Windows, Messages, ..., RichEdit;
...
procedure TMainForm.Button1Click(Sender: TObject);
procedure SelectWord(s: string; col: Tcolor);
var
  Format: CHARFORMAT2;
  i: integer;
begin
  //тут ещё и диапазон поиска задать можно, если одинаковых слов несколько и т.п.
  i := RichEdit1.FindText(s, 0, maxint, [stMatchCase]);
  RichEdit1.SelStart := i;
  RichEdit1.SelLength := length(s);
  FillChar(Format, SizeOf(Format), 0);
  with Format do begin
    cbSize := SizeOf(Format);
    dwMask := CFM_COLOR;
    crTextColor := col
  end;
  Richedit1.Perform(EM_SETCHARFORMAT, SCF_SELECTION, Longint(@Format));
end;
begin
  RichEdit1.Lines.Clear;
  RichEdit1.Lines.Add('red green yellow');
  SelectWord('red', clGreen);
  SelectWord('green', clYellow);
  SelectWord('yellow', clRed);
end;
eoln вне форума Ответить с цитированием
Старый 26.06.2012, 17:02   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Но у меня проблема скорее в том, как реализовать, т.е. какими компонентами воспользоваться для выделения текста?
вкладка / компонент
Win32 / RichEdit
Internet / WebBrowser
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 26.06.2012, 17:24   #6
delphyok
Пользователь
 
Регистрация: 22.02.2009
Сообщений: 19
По умолчанию

TWebBrowser пробовал. Такой вариант кода был:
Код:
procedure ShowHTML(const HTML: string; AWebBrowser: TWebBrowser);
var HtmlText: OLEVariant;
begin
  HtmlText := 'about:'+HTML;
  AWebBrowser.Navigate2(HtmlText);
end;

ShowHTML('<head></head><body><h1>Hello, World!</h1></body>',WebBrowser1);
Но, почему-то если задать в строку-параметр HTML текст больше определённого количества, то встроенный браузер пишет, что невозможно отобразить страницу. Я и явно указывал текст в качестве параметра, и считывал его из файла, потом в переменную, а потом её в качестве параметра указывал - нифига. И даже не знаю в чём причина. Причём специально порциями текст отсекал, после чего всё начинало работать... И полоса прокрутки сбоку лишняя, тоже не понял как её убрать.

А вот вариант с RichEdit похож на решение проблемы:
Цитата:
Компонент RichEdit является средством редактирования текстов, которое позволяет работать с форматом .rtf, т.е. дает возможность выбрать различные существенные свойства объекта форматирования для всевозможных фрагментов текста. Это является основным отличием RichEdit от компонента Memo, у которого имеющиеся атрибуты форматирования станут одинаковыми для всего текста.
Прямо то что надо судя по описанию, осталось только разобраться как им пользоваться. Спасибо из информацию!
delphyok вне форума Ответить с цитированием
Старый 26.06.2012, 21:34   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Я как-то писал, старался сделать относительно универсальную функцию
Код:
procedure ColorText(RichEdit: TRichEdit; AddStr: string; Samples:
  array of string; Colors: array of Tcolor);
var
  startpos, Position, endpos, i: Integer;
begin
  with RichEdit do
  begin
    startpos := Length(Text);
    endpos := startpos + Length(addstr);
    Lines.BeginUpdate;
    SetFocus;
    Lines.Add(addstr);
    for i := low(Samples) to High(Samples) do
    begin
      position := startpos;
      while Position <> -1 do
      begin
        Position := FindText(samples[i], position, endpos, [stMatchCase]);
        if Position = -1 then
          Continue;
        SelStart := Position;
        SelLength := Length(samples[i]);
        SelAttributes.Color := colors[i];
        Position := Position + SelLength;
      end;
    end;
    SelStart := endpos;
    Lines.EndUpdate;
  end;
end;
Вызов
Код:
ColorText(RichEdit1,  AddStr {строка которую добавляем в ричэдит}, 
Samples{массив слов, которые надо красить, можно передавать по переменной, 
либо сразу формировать с помощью скобок [] }, 
Colors{массив цветов которым красить каждое слово, 
размер такой же как у предыдущего массива, передавать аналогично любым способом});
Замечу, что добавляется только 1 строка (возможно могут быть проблемы с многострочным текстом, просто в том проекте, где написал это, нужны были именно одинарные строки) и именно в этой добавляемой строке все слова из массива семплов красятся соответствующими цветами.
Могу попробовать ещё пооптимайзить для многострочного текста
Также можно попробовать сделать раскрашивание только 1 слова (сейчас если есть 2+ одинаковых слова в строке, и само слово есть в семплах, то все будут краситься, Вам же вроде надо только одно какое-то)
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать скриншот определенной части экрана? JonMagon Помощь студентам 11 13.05.2011 09:45
Стиль текста MyLastHit Общие вопросы Delphi 4 02.12.2010 14:22
как сделать загрузку части страницы? Virus191288 Общие вопросы Delphi 0 06.07.2009 20:23
Как задать стиль для title гиперссылки Romms HTML и CSS 2 26.04.2009 22:07
Как сделать стиль CSS Dimos33 HTML и CSS 2 27.10.2007 19:08