Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 17
1

В ListView раскрасить слово из предложения

27.07.2015, 00:57. Просмотров 678. Ответов 4
Метки нет (Все метки)

Добрых суток!

Пожалуйста если не затруднит помогите написать программный код, что бы можно было в ListView у которого есть несколько Colums, сделать так, что бы заданное слово было выделено жирным шрифтом или любым другим цветом от основного.

Во вложенном файле например слово "Привет".

Заранее спасибо!
0
Миниатюры
В ListView раскрасить слово из предложения  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2015, 00:57
Ответы с готовыми решениями:

Как раскрасить в цвета элементы ListView
Как раскрасить в цвета элементы ListView

Вывести слово с номером K заданного предложения, считая с конца предложения
Вывести слово с номером K заданного предложения, считая с конца предложения. Приблизительное...

Определить, имеется ли в заданном тексте слово первого предложения, которое входит в последующие предложения
НЕ работает Здача: Определить, есть ли слово первого предложения, которое входит в...

Напечатать все слова заданного предложения, состоящие из тех же букв, что и первое слово предложения
Напечатать все слова заданного предложения (слова разделены пробелами), состоящие из тех же букв,...

4
пофигист широкого профиля
3966 / 2636 / 743
Регистрация: 15.07.2013
Сообщений: 15,393
27.07.2015, 01:42 2
Цитата Сообщение от ParserCap Посмотреть сообщение
Пожалуйста если не затруднит помогите написать программный код
Имхо, никак не получится. В айтемах и сабайтемах листвью содержит просто текст. А поскольку это контрол от MS Windows, то Дельфи тут курит в сторонке.

Добавлено через 39 минут
Насчёт "никак" я не прав.
0
20 / 20 / 7
Регистрация: 08.07.2015
Сообщений: 176
27.07.2015, 09:05 3
Если ловить событие отрисовки ListView, искать в строке слово и задавать для него стиль, не выйдет?
0
241 / 191 / 94
Регистрация: 01.05.2015
Сообщений: 732
27.07.2015, 15:36 4
ParserCap, вот вам пример как можно сделать. Пр создании формы
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.FormCreate(Sender: TObject);
var SI: TListItem; I:Integer;
begin
lv1.OwnerDraw := True; // рисуем сами
for I:=0 to 3 do
 begin  // добавляем несколько элементов
  SI := lv1.Items.Add; // для примера
  SI.Caption := '№'+IntToStr(I+1); // задаем имя и текст
  SI.SubItems.Add('Какой-то текст с выделенным словом');
 end;
end;
Соответсвенно, раз рисуем сами, то
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
procedure TForm1.lv1AdvancedCustomDrawSubItem(Sender: TCustomListView;
  Item: TListItem; SubItem: Integer; State: TCustomDrawState;
  Stage: TCustomDrawStage; var DefaultDraw: Boolean);
var I: Integer; R: TRect;
begin // получаем область в которой будем рисовать
R := Item.DisplayRect(drLabel);  // сдвигаемся к позиции элемента
for I:=0 to SubItem-1 do Inc(R.Left, Sender.Column[i].Width);
R.Right := R.Left+Sender.Column[SubItem].Width; // задаем конец области
 DrawTextEx(Sender.Canvas.Handle,PChar(Item.SubItems[SubItem-1]),
 -1,R,DT_SINGLELINE or DT_WORD_ELLIPSIS,nil); // выводим текст
end;
 
procedure TForm1.lv1AdvancedCustomDrawItem(Sender: TCustomListView;
  Item: TListItem; State: TCustomDrawState; Stage: TCustomDrawStage;
  var DefaultDraw: Boolean);
var I: Integer;
begin // рисуем все элементы
 for I:=1 to Item.SubItems.Count do
  TListView(Sender).OnAdvancedCustomDrawSubItem(Sender,Item,I,State,
                                                 Stage,DefaultDraw);
end;
Теперь можно и самим выделением слова заняться
Delphi
1
2
3
4
5
procedure TForm1.DrawSelectText(Text: string; R: TRect);
begin // выводим текст в указанной области
 DrawTextEx(lv1.Canvas.Handle,PChar(Text),
  -1,R,DT_SINGLELINE or DT_RIGHT or DT_BOTTOM or DT_WORD_ELLIPSIS,nil);
end;
Делать это будем по нажатию на кнопку
Delphi
1
2
3
4
5
6
7
procedure TForm1.btn1Click(Sender: TObject);
var I: Integer;
begin // будем выделять слово цветом
lv1.Canvas.Font.Color := clRed;
for I:=0 to lv1.Items.Count-1 do // выделяем во всех строках
 DrawSelectText('выделенным', GetWordRect(I,0,'выделенным'));
end;
Получать область, где находится слово будем так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function TForm1.GetWordRect(ItemIndex, SubItem: Integer; FWord: string): TRect;
var I, WordPosition, WordWidth, TextWidth, ColW: Integer; SubItemText: string;
begin // нет области для рисования, размер колонки( для удобства)
Result := Rect(0,0,0,0); ColW := lv1.Columns[SubItem+1].Width;
// если указанный элемент не существует, то выходим
if (ItemIndex>=lv1.Items.Count) or (FWord='') then Exit;
// получаем область для рисования
Result := lv1.Items[ItemIndex].DisplayRect(drLabel);
// смещаемся на позицию элемента
for I:=0 to SubItem do Inc(Result.Left, lv1.Column[I].Width);
// задаем конечную границу справа
Result.Right := Result.Left + lv1.Columns[SubItem+1].Width;
WordWidth := lv1.Canvas.TextWidth(FWord); // размер слова
SubItemText := lv1.Items[ItemIndex].SubItems[SubItem]; // текст элемента
WordPosition := Pos(FWord, SubItemText); // позиция слова в тексте
// если не найдена, то выходим
if (WordPosition=0) then begin Result := Rect(0,0,0,0); Exit; end;
// получаем размер текста
TextWidth := lv1.Canvas.TextWidth(Copy(SubItemText,1,WordPosition-1));
// если нужное слово за границами видимости, то выходим
if TextWidth>=ColW then begin Result := Rect(0,0,0,0); Exit; end;
// если слово видно целиком, то
if TextWidth+WordWidth<=ColW then // возвращаем его область
 Result := Rect(Result.Left+TextWidth,
                Result.Top,
                Result.Left+TextWidth+WordWidth,
                Result.Bottom-1) else // если нет, то рисуем до конца колнки
 Result := Rect(Result.Left+TextWidth,
                Result.Top,
                Result.Right,
                Result.Bottom-1);
end;
Вот вобщем то и все. Может конечно есть способ и проще, но я не знаю такого...
Если только вставлять RichEdit( к примеру) в ListView...
0
0 / 0 / 0
Регистрация: 07.01.2014
Сообщений: 17
27.07.2015, 15:56  [ТС] 5
Спасибо большое за ответ! Буду реализовать !
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.07.2015, 15:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Clojure Напечатать все слова из заданного предложения, состоящие из тех же букв, что и первое слово предложения
Помогите, пожалуйста, с задачей. Напечатать все слова из заданного предложения, состоящие из тех...

Перечислить все слова заданного предложения, которые состоят из тех же букв, что и первое слово предложения
Здравствуйте! Помогите, пожалуйста решить задачку: &quot;Перечислить все слова заданного...

В текстовом файле построчно записаны предложения. Записать во второй текстовый файл первое слово последнего предложения
В текстовом файле построчно записаны предложения. Записать во второй текстовый файл первое слово...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.