![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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, который не поддерживает коректно темы ХР ?