Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ListView [D7, WinXP]


elserpiente ©   (2008-02-01 23:16:00) 

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


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

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


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

> [17] elserpiente   (04.02.08 09:48)

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


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


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

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


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

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


korneley   (2008-02-02 21:03:00) [5]

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


{RASkov}   (2008-02-02 20:44:00) [6]

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

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


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

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


elserpiente   (2008-02-02 15:22:00) [8]

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


korneley   (2008-02-02 15:15:00) [9]

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


korneley   (2008-02-02 15:01:00) [10]

Или с цветом:

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 14:31:00) [11]


> 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


ketmar   (2008-02-02 13:33:00) [12]

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

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


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

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


DVM   (2008-02-02 13:16:00) [14]

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


ketmar   (2008-02-02 12:13:00) [15]

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


elserpiente   (2008-02-02 11:33:00) [16]

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


korneley   (2008-02-02 10:11:00) [17]


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


KilkennyCat   (2008-02-02 05:49:00) [18]

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


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


korneley   (2008-02-02 02:29:00) [19]

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


DVM   (2008-02-01 23:43:00) [20]

OwnerDraw


Наверх

Титульная страница Поиск, карта сайта Написать письмо