Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Вниз

ListView   Найти похожие ветки 

 
elserpiente   (2008-02-01 23:16) [0]

Ребята, как в ListView в ячейке отобразить обычный шрифт с перемешкой с жирным шрифтом


 
DVM ©   (2008-02-01 23:43) [1]

OwnerDraw


 
korneley ©   (2008-02-02 02:29) [2]

С ListView, если пользоваться TCanvas, TPen, TFont, e.t.c., случаются неожиданности. Обычно, при повторном изменении атрибутов рисования. Поэтому, если надо "шрифт с перемешкой с жирным шрифтом", то рекомендую рисовать через API/GDI, благо DC (Canvas.Handle) уже есть.  Как рисовать:
http://www.delphikingdom.com/asp/viewitem.asp?catalogid=452


 
KilkennyCat ©   (2008-02-02 05:49) [3]

> [2] korneley ©   (02.02.08 02:29)
> С ListView, если пользоваться TCanvas, TPen, TFont, e.t.c.,
> случаются неожиданности.


неожиданности случаются у детей.


 
korneley ©   (2008-02-02 10:11) [4]


> KilkennyCat ©   (02.02.08 05:49) [3]
> неожиданности случаются у детей.
Детские - да. Если в хэлпе написано, к примеру, что при смене Canvas.Font.Style в ListView.OnDrawItems, должен измениться шрифт, а он, после первой перемены, отказывается меняться, это что, ожидаемое явление? Ну, назовите по другому: "баг", "глюк", "фича" в конце-концов... Суть не изменится. Всё равно несколько строк/символов разными шрифтами (в TListVIew, если он "репорт") через API выводить придётся. :)


 
elserpiente   (2008-02-02 11:33) [5]

2 korneley: есть пример кода в OnDrawItems ???


 
ketmar ©   (2008-02-02 12:13) [6]

>[4] korneley©(02.02.08 10:11)
это как «отказывается»? код в студию.


 
DVM ©   (2008-02-02 13:16) [7]

Если использовать именно OwnerDraw то никаких неожиданностей не случается.


 
elserpiente   (2008-02-02 13:30) [8]

а почему при Canvas.Font.style := [fsItalic]  
Canvas.TextWidth(aText[I]) возращает неверную ширину символа?


 
ketmar ©   (2008-02-02 13:33) [9]

>[8] elserpiente (02.02.08 13:30)
код?

кстати, не забываем, например, про страшное слово «кернинг». не забыли?


 
korneley ©   (2008-02-02 14:31) [10]


> ketmar ©   (02.02.08 12:13) [6]
> >[4] korneley©(02.02.08 10:11)это как «отказывается»? код
> в студию.

Вот:
const
   BoldStr   : string = "Bold";
   NormalStr : string = "Normal";

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
var i : integer;
   r : TRect;
begin
 with Sender.Canvas do begin
   r := Item.DisplayRect(drLabel);
   r.Left := 0;
   for i := 0 to subitem - 1 do
     inc(r.Left, TListView(Sender).Columns[i].Width);
   r.Right:= r.Left + TListView(Sender).Columns[SubItem].Width;

   FillRect(r);

   Font.Style := Font.Style + [fsBold];
   TextOut( r.Left + 1, r.Top +1, BoldStr);

   r.Left := r.Left + TextWidth(BoldStr);

   Font.Style := Font.Style - [fsBold];
   TextRect(r, r.Left + 1,r.Top +1, NormalStr);

   DefaultDraw := false;
 end;
end;

Получаем ВСЁ болдом, невзирая на второе болда "откл." (Font.Style := Font.Style - [fsBold]) Стандартный ListView, ViewStyle = vsReport


 
korneley ©   (2008-02-02 15:01) [11]

Или с цветом:

const
   BlueStr   : string = "Blue";
   BlackStr  : string = "Black";

procedure TForm1.ListView1CustomDrawSubItemAPI(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
var i : integer;
   r : TRect;
begin
 with Sender.Canvas do begin
   r := Item.DisplayRect(drLabel);
   r.Left := 0;
   for i := 0 to subitem - 1 do
     inc(r.Left, TListView(Sender).Columns[i].Width);
   r.Right:= r.Left + TListView(Sender).Columns[SubItem].Width;

   FillRect(r);

//    Font.color := clBlue;
//    TextOut( r.Left + 1, r.Top +1, BlueStr);
   SetTextColor(Sender.Canvas.Handle, clBlue);
   ExtTextOut(Handle, r.Left + 1, r.Top + 1,
              0, nil, PChar(BlueStr), length(BlueStr), nil);

   r.Left := r.Left + TextWidth(BlueStr);

//    Font.color := clBlack;
//    TextRect(r, r.Left + 1,r.Top +1, BlackStr);
   SetTextColor(Sender.Canvas.Handle, clBlack);
   ExtTextOut(Handle, r.Left + 1, r.Top + 1,
              0, nil, PChar(BlackStr), length(BlackStr), nil);

   DefaultDraw := false;
 end;
end;

Так работает, а если разкоментировать Дельфийские строки, а GDI, наоборот, закоментировать - получите полный clBlue, т.е. первую перемену и навсегда...


 
korneley ©   (2008-02-02 15:15) [12]

Да, и вдогонку, в OnDrawItem те же дела. Одним словом: взялись рисовать - рисуйте по-полной!


 
elserpiente   (2008-02-02 15:22) [13]

дык, а вопрос был про жирный текст. Как сделать в перемешку?


 
Жуков Олег   (2008-02-02 19:55) [14]

Между изменениями свойств канваса вставьте Canvas.Refresh();


 
{RASkov} ©   (2008-02-02 20:44) [15]

> вставьте Canvas.Refresh();

Да помоему будет достаточно в последний момент обработчика xxxDrawXxx
вставить:
with Sender.Canvas do
 if Assigned(Font.OnChange) then Font.OnChange(Font);


 
korneley ©   (2008-02-02 21:03) [16]

Проверил [14] - работает! А я, до этого, шрифты плодил/удалял... :( Но, вообще, это нестандарт. И нигде описание данной нестандартности найти не удалось.


 
elserpiente   (2008-02-04 09:48) [17]

Ребята а как изменить высоту строки в режиме vsReport


 
korneley ©   (2008-02-05 00:07) [18]


> Ребята а как изменить высоту строки в режиме vsReport

Чё-то с ходу, получилось, что никак... У меня везде, где хотелось высоту строки изменить - TStringGrid.


 
{RASkov} ©   (2008-02-05 00:42) [19]

> [17] elserpiente   (04.02.08 09:48)

Как вариант:
ListView.StateImages.Height
т.е. ЛистВью в StateImages устанавливаем ImageList у которого выставляем Height...
Не совсем может "красиво", но может пойдет...


 
elserpiente   (2008-02-05 10:01) [20]

Спасибо, спас VirtualTreeView ;)



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2008.11.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.008 c
15-1221060690
keymaster
2008-09-10 19:31
2008.11.02
как избавиться от хинта?


2-1222019809
Сергей
2008-09-21 21:56
2008.11.02
Алгорит записей в БД накладных...


11-1193854855
mdw
2007-10-31 21:20
2008.11.02
Lazarus+WinCE


2-1222063453
Sarton
2008-09-22 10:04
2008.11.02
Delphi 2009 юникод


15-1221108426
Cyrax
2008-09-11 08:47
2008.11.02
Терминатор 2 3D - Битва сквозь время: фрагмент с T1000000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский