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

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

TXPManifest уличен во вредительстве


Мирон ©   (2004-10-15 23:54:00) 

Это даже не вопрос, а так, к сведению...
Ручками делал отрисовку TListView в режиме vsReport. Довел до ума, занялся основной логикой программы (еще несколько модулей и пара форм - тестировал и отлаживал отдельно). По отдельности все работало как надо. Собрал вместе - и вот тут начались проблемы. "Взбесился" тот самый первый ListView. При запуске проги он отрисовывался правильно, но, стоило только подвести мышиный курсор к какой-либо не пустой строке и задержать на секунду, весь ListView перерисовывался так, как будто выполнялось только написанное в
его OnCustomDraw. И все... Содержимое становилось не видно.

За два дня весь извелся, пытаясь понять почему.  В момент этого глюка для ListView не наступало никакихVCL-событий, но вид он имел как после выполнения OnCustomDraw. Перерыл исходники предков - нифига... Сегодня с горя стал из проекта удалять по-одному подключенные модули и смотреть, что получилось, а потом из найденного модуля также по-одному сносить компоненты. Оказалось, что это TXPManifest, зараза, расположенный черт знает где на форме, которая, при надобности, создавалась динамически, да и то очень редко...

Столько нервов потрачено...


DVM   (2004-10-16 12:14:00) [1]

Хотите еще один баг SysListView32? Баг, который не заметили даже MS при написании эксплорера. Попробуйте выключить "Отображать содержимое окон при перетаскивании" и перетащить значок на рабочем столе - надпись либо пропадает либо съезжает вправо, фон значка - мусор. Проявляется при включенных темах/манифесте в любых других программах где есть ListView и перетаскивание его итемов. ListView неправильно формирует образ перетаскиваемого итема при включенных темах для передачи его в ImageList, который рисует из него полупрозрачное изображение летящего значка.


Gero   (2004-10-16 12:06:00) [2]


Экспериментатор   (16.10.04 11:34)
> Этот баг уже давно описан.

А ссылочку можно?


Экспериментатор   (2004-10-16 11:34:00) [3]

Этот баг уже давно описан.
Он есть и все. От него никуда не деться.


Cobalt   (2004-10-16 11:22:00) [4]

Действительно - глюк есть такой.


Мирон   (2004-10-16 02:03:00) [5]


> Проверь, будет ли все нормально без LVCustomDraw и
> LVCustomDrawItem (с манифестом, ессно).

Ясен пончик, что без них глюков нету. В том и проблема, что нужен не стандартный вид ListView. Да и проблемы то теперь как таковой нет, раз достаточно убрать манифест. Просто без него на другой форме придется кое-какие контролы тоже ручками дорисовывать.


Gero   (2004-10-16 01:51:00) [6]


> ComCtrls не я пмсал...

А я уже было подумал, что ты.


Мирон   (2004-10-16 01:50:00) [7]


> Скорее всего, баг в твоем коде.


ComCtrls не я пмсал...


Gero   (2004-10-16 01:50:00) [8]

У меня сейчас делфи под рукой нет, так что проверить ничего не могу.
Проверь, будет ли все нормально без LVCustomDraw и LVCustomDrawItem (с манифестом, ессно).


Мирон   (2004-10-16 01:46:00) [9]


>> Где ошибки?
>
>> uses
> > ... ComCtrls;


Дык это... Никак без него...


Gero   (2004-10-16 01:33:00) [10]


> Где ошибки?

> uses
> ... ComCtrls;


Мирон   (2004-10-16 00:35:00) [11]


> В Delphi 7 вроде бы исправлены все ошибки с
>манифестом, и ошибка с ListView тоже.
> Скорее всего, баг в твоем коде.


Простой пример:

object Form1: TForm1
 Left = 250
 Top = 171
 Width = 550
 Height = 418
 Caption = 'Form1'
 Color = clBtnFace
 Font.Charset = DEFAULT_CHARSET
 Font.Color = clWindowText
 Font.Height = -11
 Font.Name = 'MS Sans Serif'
 Font.Style = []
 OldCreateOrder = False
 OnCreate = FormCreate
 PixelsPerInch = 96
 TextHeight = 13
 object LV: TListView
   Left = 8
   Top = 16
   Width = 521
   Height = 305
   Columns = <
     item
       Width = 200
     end
     item
       Width = 200
     end>
   GridLines = True
   TabOrder = 0
   ViewStyle = vsReport
   OnCustomDraw = LVCustomDraw
   OnCustomDrawItem = LVCustomDrawItem
 end
end


unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   LV: TListView;
   procedure FormCreate(Sender: TObject);
   procedure LVCustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);
   procedure LVCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   LV.Items.Add.Caption := 'FirstItem';
   LV.Items.Add.Caption := 'SecondItem';
end;

procedure TForm1.LVCustomDraw(Sender: TCustomListView; const ARect: TRect; var DefaultDraw: Boolean);
begin
   Sender.Canvas.Brush.Color := clLime;
   Sender.Canvas.FillRect(ARect);
end;

procedure TForm1.LVCustomDrawItem(Sender: TCustomListView; Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
var
   R: TRect;
begin
   R := Item.DisplayRect(drBounds);
   Sender.Canvas.Brush.Color := clLime;
   Sender.Canvas.FillRect(R);
   SetBkMode(Canvas.Handle, Transparent);
   Sender.Canvas.TextOut(R.Left + 2, R.Top, Item.Caption);
   DefaultDraw := False;
end;

end.


Запускаем, смотрим - все нормально. Закрываем прогу. Кидаем на форму манифест. Запускаем, любуемся результатом. Где ошибки?


Gero   (2004-10-16 00:26:00) [12]


> И темы ХР тут ни причем

Ошибаешься.

> Я думаю делался манифест для изменения вида компонентов

Нет. Для того, чтобы приложение использовало ComCtl32.dll 6-ой версии.

В Delphi 7 вроде бы исправлены все ошибки с манифестом, и ошибка с ListView тоже.
Скорее всего, баг в твоем коде.


Мирон   (2004-10-16 00:15:00) [13]

У меня D7. И темыХР тут ни причем. Я ж говорю: вызывалась "лишняя" перерисовка фона, за которой не следовало отрисовки содержимого. Удалил манифеста - все как рукой сняло!

Зато в модуле "XPMan" есть такое дело:

unit XPMan;
{$WEAKPACKAGEUNIT ON}
interface

uses
 SysUtils, Classes;

type
 TXPManifest = class(TComponent)
 end;

{$R WindowsXP.res}

implementation

end.


То есть линкуется какой-то хитрый "WindowsXP.res". И еще я где-то читал что этот самый манифест содержит какие-то XML-данные, отвечающие за перерисовку компонентов в стиле XP.


> TListView, который не поддерживает коректно темы ХР

Я думаю делался манифест для изменения вида компонентов, а не компоненты, чтобы было на чем посмотреть работу манифеста. Следовательно, манифест и виноват...


Gero   (2004-10-16 00:03:00) [14]

TManifest кода не содержит и вредить не может.
Скорее всего, ошибка в твоем коде, если делфи <=6, то ошибка есть еще и в коде ComCtrls.pas.


GuAV   (2004-10-15 23:59:00) [15]

А может дело было не в TXPManifest а в TListView, который не поддерживает коректно темы ХР ?


Наверх

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