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

Вниз

Почему происходит глюк с отрисовкой в TListView?   Найти похожие ветки 

 
MegaVolt ©   (2006-10-11 17:44) [0]

Вот код который глючит.
Оббязательным условием глюка является наличие назначенного события ListView1CustomDrawSubItem пусть и пустого. При отсутствии обработчика глюка нет.

вот код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, ComCtrls;

type
 TForm1 = class(TForm)
   ListView1: TListView;
   procedure FormCreate(Sender: TObject);
   procedure ListView1Data(Sender: TObject; Item: TListItem);
   procedure ListView1CustomDrawItem(Sender: TCustomListView;
     Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
   procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
     Item: TListItem; SubItem: Integer; State: TCustomDrawState;
     var DefaultDraw: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 with ListView1 do
   begin
     ViewStyle:=vsReport;
     OwnerData:=true;
     Columns.Add;
     Columns.Add;
     Columns.Add;
     Items.Count:=10;
     GridLines:=true;
   end;
end;

procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
 Item.Caption:="один";
 Item.SubItems.Add("два");
 Item.SubItems.Add("три");
end;

procedure TForm1.ListView1CustomDrawItem(Sender: TCustomListView;
 Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
 r1:TRect;
begin
 Sender.Canvas.Font.Color:=$0000FF;
 R1:=Item.DisplayRect(drBounds);
 Sender.Canvas.FillRect(R1);
end;

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
begin
 //
end;

end.


 
MegaVolt ©   (2006-10-12 10:50) [1]

Никто не смог повторить или неизвесно что с этим делать и откуда берётся?


 
clickmaker ©   (2006-10-12 11:40) [2]


> MegaVolt ©   (12.10.06 10:50)

и в чем глюк?


 
MegaVolt ©   (2006-10-12 11:47) [3]

В одном случае надписи отображаются как положено во втором шрифт становится от чего то жирным надписи сползают вниз. Повторяемость хорошая на win98 и на winXP.

Повторить легко. Кидаем на форму ListView добавляем три обработчика и заменяем оригинальный модуль тем что я привёл. Запускаем наблюдаем :(


 
Elen ©   (2006-10-12 12:07) [4]


> MegaVolt

А ты не ставь этот обработчик без надобности.


 
clickmaker ©   (2006-10-12 12:09) [5]

а зачем вот это?
Sender.Canvas.FillRect(R1);


 
MegaVolt ©   (2006-10-12 12:12) [6]

>А ты не ставь этот обработчик без надобности.

Надобность его как раз есть. Просто я для обсуждения выкинул всё что к багу отношения не имеет.

>а зачем вот это?
>Sender.Canvas.FillRect(R1);

Это пример любой операции с канвой. Реально у меня стоит отрисовка чекбокса. Без этого бага нет. Опять же закрашивание квадрата взято для простоты реализации примера.


 
Elen ©   (2006-10-12 12:19) [7]


> MegaVolt

заремь  Sender.Canvas.FillRect(R1);


 
clickmaker ©   (2006-10-12 12:33) [8]

procedure TForm1.ListView1CustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
begin
 Sender.Canvas.Font.Color := clRed;
 ...
end;


 
MegaVolt ©   (2006-10-12 12:42) [9]

>заремь  Sender.Canvas.FillRect(R1);

повторяю это эквивалент НУЖНОЙ мне функции рисующей что либо

>clickmaker помогло. А почему? Что такого делала пустая функция что менялась отрисовка? Или ты это нашел методом научного тыка?


 
MetalFan ©   (2006-10-12 12:50) [10]

хм... вылечил так
procedure TForm1.ListViewCustomDrawSubItem(Sender: TCustomListView;
 Item: TListItem; SubItem: Integer; State: TCustomDrawState;
 var DefaultDraw: Boolean);
begin
 Sender.Canvas.Font.Color:=$0000FF;
end;

почему происходит что-то и сам не понял %)


 
MetalFan ©   (2006-10-12 12:54) [11]

ыть, опередили


 
clickmaker ©   (2006-10-12 13:06) [12]


>  Или ты это нашел методом научного тыка?

почти )
все дело похоже в этом куске кода из ComCtrls.pas

else if FCanvasChanged then
                 begin
                   FCanvasChanged := False;
                   FCanvas.Font.OnChange := nil;
                   FCanvas.Brush.OnChange := nil;
                   with PNMLVCustomDraw(NMHdr)^ do
                   begin
                     clrText := ColorToRGB(FCanvas.Font.Color);
                     clrTextBk := ColorToRGB(FCanvas.Brush.Color);
                     if GetObject(FCanvas.Font.Handle, SizeOf(LogFont), @LogFont) <> 0 then
                     begin
                       FCanvas.Handle := 0;  // disconnect from hdc
                       // don"t delete the stock font
                       FOurFont := CreateFontIndirect(LogFont);
                       FStockFont := SelectObject(hdc, FOurFont);
                       Result := Result or CDRF_NEWFONT;
                     end;
                   end;
                 end;


 
MegaVolt ©   (2006-10-12 13:20) [13]

А что тут криминального?


 
clickmaker ©   (2006-10-12 13:21) [14]


> А что тут криминального?

жирным шрифтом


 
MegaVolt ©   (2006-10-12 13:29) [15]

Я не так хорошо знаком с внутренностями ComCtrls.pas поэтому мне выделенное ничего не говорит.

Но учитывая что без изменения канвы текст рисуется с глюками  FCanvasChanged при глюках находится в false и вся эта ветка по идее при глюках как раз не выполняется а строка Sender.Canvas.Font.Color:=$0000FF; как раз вносит изменения и ветка выполняется.



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

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

Наверх




Память: 0.51 MB
Время: 0.028 c
15-1162755155
Cerberus
2006-11-05 22:32
2006.11.26
Installer программы для создания установки.


15-1162630178
Loginov Dmitry
2006-11-04 11:49
2006.11.26
Задачка :)


2-1162985489
Lesorub
2006-11-08 14:31
2006.11.26
Помогите, плз, вопрос о типе TStrings


15-1162088852
Копир
2006-10-29 05:27
2006.11.26
Здравствуйте мои дорогие друзья!


15-1163041746
Flash3
2006-11-09 06:09
2006.11.26
Кто нибудь знает альтернативу AcrobatReader у ?