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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 16:25   #1
rota
 
Регистрация: 26.02.2012
Сообщений: 6
Радость Разные стили в одной строке ListBox

Здравствуйте уважаемые форумчане. Подскажите пожалуйста можно ли сделать разные стили написания текста в одной строке элемента ListBox.
В ListBox будет выводиться список файлов в директории: хочу чтобы путь отображался обычным, а имя файла - жирным.
Или возможно подскажите какие-то другие решения.

Спасибо.
rota вне форума Ответить с цитированием
Старый 26.02.2012, 16:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

см. событие OnDrawItem
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 26.02.2012, 16:42   #3
rota
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

А можно поподробнее? Видел реализацию разного цвета целой строки или даже картинки в строке, а как задать разные стили для участков текста?
rota вне форума Ответить с цитированием
Старый 26.02.2012, 16:58   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Помещать куски текста на канву в разном стиле. Вычислять сколько пикселей займет кусок текста можно, например, с помощью GetTextExtentPoint32

ADD

Простейший приём вычисления пикселей текста - невидимый Label с AutoSize=True, того же фонта, что и ListBox, в него текст и смотрим Width
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.02.2012 в 17:11.
Аватар вне форума Ответить с цитированием
Старый 26.02.2012, 18:34   #5
rota
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Аватар Спасибо, получилось.

Кто задаётся подобным вопросом, код
Код:
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  C: TCanvas;
  filename: TStringList;
  x:integer;
  CurrentDir: string;
begin
  C := TListBox(Control).Canvas;

  filename:= TStringList.Create;
  filename.StrictDelimiter := True;
  filename.Delimiter:= '\';
  filename.DelimitedText := TListBox(Control).Items[index];
  CurrentDir:=GetCurrentDir+'\';
  x:=Rect.Left;
  C.TextOut(Rect.Left,rect.Top, CurrentDir);
  C.Font.Style := [fsBold];

  Inc(X, GetPWithStr(CurrentDir));
  C.TextOut(X,rect.Top, filename[filename.count-1]);
  filename.Free;
end;

function TForm1.GetPWithStr(str:string): integer;
var
DC : HDC;
size : TSize;
SaveFont : HFONT;
begin

DC:=GetDC(0);
SaveFont:=SelectObject(DC,ListBox1.Font.Handle);
GetTextExtentPoint32(DC,PChar(str),Length(str),size);
SelectObject(DC,SaveFont);
ReleaseDC(0,DC);
result:=size.cx;
end;
P.S. Только почему-то процедура ListBox1DrawItem отрабатывает несколько раз, можно можно как-то подправить?

Последний раз редактировалось rota; 26.02.2012 в 18:39.
rota вне форума Ответить с цитированием
Старый 26.02.2012, 18:41   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
P.S. Только почему-то процедура ListBox1DrawItem отрабатывает несколько раз, можно можно как-то подправить?
она срабатывает при рисовании каждого итема.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2012, 18:52   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

И каким то уж сложным путем пошли для парсинга строк ListBox-а. Чем Pos не угодил? Или ExtractFileName если там полное имя файла?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 26.02.2012 в 18:55.
Аватар вне форума Ответить с цитированием
Старый 26.02.2012, 18:53   #8
rota
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
она срабатывает при рисовании каждого итема.
Я немножко потестил - походу она срабатывает при каждой прорисовке итема - при выделении итема, если верхнее окно перекрыло листбокс, при сворачивании-разворачивании окна.

Кстати выделение итема работает, но отображается как-то коряво

Цитата:
Сообщение от Аватар Посмотреть сообщение
И каким то уж сложным путем пошли для парсинга строк ListBox-а. Чем Pos не угодил?
Я новичок, это как?))
rota вне форума Ответить с цитированием
Старый 26.02.2012, 18:54   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

оно срабывает при каждой перерисовке итема.(будь то перерисовка(и с выделением тоже) или первй раз рисуете)
выделеный итем тоже вы должны отрисовывать поидее(аргумент State).
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.02.2012, 19:05   #10
rota
 
Регистрация: 26.02.2012
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
оно срабывает при каждой перерисовке итема.(будь то перерисовка(и с выделением тоже) или первй раз рисуете)
выделеный итем тоже вы должны отрисовывать поидее(аргумент State).
А State можно изменить чтобы не всегда срабатывала?
Можно вообще чтобы один раз при старте сработала и всё, или так не получится?
rota вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование данных из одной книги в другую в разные столбцы. kipish_lp Microsoft Office Excel 15 15.07.2015 07:27
Как разделить данные из одной ячейки и разнести их в разные, через обычные формулы Vasilev Microsoft Office Excel 15 24.09.2014 10:49
Ввод и вывод в одной строке sparksurgeon Паскаль, Turbo Pascal, PascalABC.NET 1 21.12.2011 01:57
ИЗ ОДНОЙ ОБЩЕЙ В ТРИ РАЗНЫЕ spburger Microsoft Office Excel 1 30.11.2009 19:29
Подскажите как организовать поиск в строке, с возможностью вставлять разные фильтры ну по типу Wadimka Общие вопросы Delphi 2 18.05.2009 17:03