Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.083 c
14-1097177417
KilkennyCat
2004-10-07 23:30
2004.10.31
Деньги


1-1098105257
BFG9k
2004-10-18 17:14
2004.10.31
Модальный InputQuery


1-1098121425
focor
2004-10-18 21:43
2004.10.31
HTMLtoFILE


4-1095319848
Чапаев
2004-09-16 11:30
2004.10.31
MailSlots


10-1054713801
OlegL
2003-06-04 12:03
2004.10.31
Методы COM object-а





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский