Форум: "Основная";
Текущий архив: 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
endunit 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