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

Вниз

TXPManifest уличен во вредительстве   Найти похожие ветки 

 
Мирон ©   (2004-10-15 23:54) [0]

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

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

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


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

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


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

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


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

У меня 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:26) [4]


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

Ошибаешься.

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

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

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


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


> В 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 01:33) [6]


> Где ошибки?

> uses
> ... ComCtrls;


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


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


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


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


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


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


 
Gero ©   (2004-10-16 01:50) [9]

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


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


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

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


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


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

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


 
Cobalt ©   (2004-10-16 11:22) [12]

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


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

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


 
Gero ©   (2004-10-16 12:06) [14]


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

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


 
DVM ©   (2004-10-16 12:14) [15]

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



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

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

Наверх




Память: 0.51 MB
Время: 0.024 c
14-1097664594
Demetrius2003
2004-10-13 14:49
2004.10.31
Исходник joiner a


1-1098173227
xman
2004-10-19 12:07
2004.10.31
Не отображать Hint`ы в TreeView над объектами


1-1098179031
Ega23
2004-10-19 13:43
2004.10.31
Ico2Bmp


3-1096970244
funtik123
2004-10-05 13:57
2004.10.31
Количсетво записей


14-1097723477
Новенький
2004-10-14 07:11
2004.10.31
Помогите с установкой винды