Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.18;
Скачать: CL | DM;

Вниз

Ручная отрисовка ячеек TListView, позиция текста.   Найти похожие ветки 

 
Kolan ©   (2008-11-17 09:02) [0]

Здравствуйте,
 Мне нужно получить ЛистВью с высокими строками, но с мелким шрифтом внутри.

Для этого я задал ему шрифт 22 пункта, а в OnCustomDrawItem устанавливаю более мелкий шрифт.

 with Sender.Canvas do
 begin
   Font.Size := 12;

В результате я получаю почти то, что надо, но только текст находится в верхнем левом углу ячеек. Как изменить позицию текста? Можно было бы вручную отрисоавть надпись, но в событие не передается Rect и я не знаю как это сделать без него.

Вполне возможно, что я вообще пошел по неверному пути, может есть способ лучше?


 
AIK ©   (2008-11-17 09:22) [1]


> Здравствуйте,  Мне нужно получить ЛистВью с высокими строками,
>  но с мелким шрифтом внутри.


Что за ячейки у T TListView? Как понять: с высокими строками, но с мелким шрифтом внутри.


> В результате я получаю почти то, что надо, но только текст
> находится в верхнем левом углу ячеек. Как изменить позицию
> текста? Можно было бы вручную отрисоавть надпись, но в событие
> не передается Rect и я не знаю как это сделать без него.
>


Как я понял текст через канву хочешь выводить canvas.TextOut(x, y, ‘TEXT’) – где x позиция текста по горизонтали, где y по вертикали


> Вполне возможно, что я вообще пошел по неверному пути, может
> есть способ лучше?


Да, вопрос надо было в "Начинающим" задовать


 
Kolan ©   (2008-11-17 09:26) [2]

> Как понять: с высокими строками, но с мелким шрифтом внутри.

http://www.ksoftware.ru/files/other/ListView.gif

>Да, вопрос надо было в "Начинающим" задовать
Случайно ошибся форумом, туда и хотел.


 
AIK ©   (2008-11-17 09:48) [3]


> canvas.TextOut(x, y, ‘TEXT’) – где x позиция текста по горизонтали,
>  где y по вертикали


Так это тебе неподходит чтоли?
если через Rect: TRect

canvas.TextOut(Rect.Left, Rect.Top, ‘TEXT’)


 
Kolan ©   (2008-11-17 10:06) [4]

У ЛисьВью в событие Rect не передается

procedure TCalibrationScreen.CalibrationListViewCustomDrawItem(
 Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
 var DefaultDraw: Boolean);


 
Kolan ©   (2008-11-17 14:54) [5]

Я, честно не понимаю как эделать сабж.

ЗЫ
 Перенестие в Начинающие.


 
Dimka Maslov ©   (2008-11-17 15:57) [6]

Когда я обошёлся написанием собственного компонента-аналога, в котором можно было изголяться как попало при отрисовке элементов.


 
Leonid Troyanovsky ©   (2008-11-17 16:18) [7]


> Kolan ©   (17.11.08 10:06) [4]

> У ЛисьВью в событие Rect не передается

Item.DisplayRect?

--
Regards, LVT.


 
Kolan ©   (2008-11-18 16:25) [8]

Спасибо Леонид, откуда брать рект понятно.

Все равно что-то не получается. Я использую одну функцию для двух обработчиков.

Вот так выглядит вызов:
procedure TCalibrationScreen.CalibrationListViewCustomDrawItem(
 Sender: TCustomListView; Item: TListItem; State: TCustomDrawState;
 var DefaultDraw: Boolean);
begin
 inherited;
 DrawCalibrationListViewItems(Sender, Item);
end;

procedure TCalibrationScreen.CalibrationListViewCustomDrawSubItem(
 Sender: TCustomListView; Item: TListItem; SubItem: Integer;
 State: TCustomDrawState; var DefaultDraw: Boolean);
begin
 inherited;
 DrawCalibrationListViewItems(Sender, Item, SubItem);
end;


Вот сама функция отрисовки.
procedure DrawCalibrationListViewItems(Sender: TCustomListView;
 Item: TListItem; SubItemIndex: Integer);
var
 Measurement: TCalibrationMeasurement;
 Rect: TRect;
 S: string;
begin
 with Sender.Canvas do
 begin
   if TObject(Item.Data) is TCalibrationMeasurement then
   begin
     Measurement := TCalibrationMeasurement(Item.Data);
     if Assigned(Measurement) then
     begin
       if Measurement.Measurement.ID = -1 then
       begin
         Font.Color := clBlack
       end
       else
         if Measurement.Measurement.DefectDescription <> "" then
           Font.Color := clRed
         else
           Font.Color := clGreen;
     end;
   end;

   Rect := Item.DisplayRect(drBounds);
   if (SubItemIndex < 0) or (SubItemIndex > (Item.SubItems.Count-1)) then
     S := Item.Caption
   else
     S := Item.SubItems[SubItemIndex];

   Font.Size := 10;
   FillRect(Rect);
   TextOut(Rect.Left+20, Rect.Top+20, S);

 end;
end;


Результат (http://www.ksoftware.ru/files/other/ListView2.gif) странный. Как видите, сместилася текст только первой колонки, то есть самого айтима. Суб айтимы не отрисовались все кроме последнего. Хотя я, в отладчике, виже, что в S попадаеют нужные строки.


 
Leonid Troyanovsky ©   (2008-11-19 19:47) [9]


> Kolan ©   (18.11.08 16:25) [8]

> Все равно что-то не получается. Я использую одну функцию

В demos есть пара примеров с TListView, в т.ч. и с виртуальным.
Если не сумеешь разобраться, то настаивай на перемещение
к "Начинающим", или в "Основную" -
вдруг там есть эксперт по этому вопросу ;)

--
Regards, LVT.



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

Текущий архив: 2009.01.18;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
2-1228150306
Макс123
2008-12-01 19:51
2009.01.18
Загрузка в TImage


2-1228284286
Степа
2008-12-03 09:04
2009.01.18
Процессы Windows


15-1227442297
Slider007
2008-11-23 15:11
2009.01.18
С днем рождения ! 23 ноября 2008 воскресенье


1-1196766772
Alexx1524
2007-12-04 14:12
2009.01.18
Плагины


15-1227639224
Footballer
2008-11-25 21:53
2009.01.18
Проект информационной безопасности