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

Вниз

При перехвате сообщения WMEraseBkgnd получаю HDC больше Integer   Найти похожие ветки 

 
Valera   (2005-07-19 19:09) [0]

Не могу справиться с этой ошибкой. Использую процедуру
procedure WMEraseBkgnd( var Msg: TWMEraseBkgnd ); message wm_EraseBkgnd; для получения HDC контекста и в дальнейшем использую его в процедуре Control.Parent.Perform( wm_EraseBkgnd, DC, 0 ); Все получается до определенного момента, но когда HDC больше Integer выскакивает ошибка. Подскажите пожалуста как избежать этого.


 
Керк   (2005-07-19 19:43) [1]

Valera   (19.07.05 19:09)
получаю HDC больше Integer


Это как?


 
Fay ©   (2005-07-19 19:44) [2]

HDC = type LongWord;


 
Valera   (2005-07-19 19:52) [3]

Ошибка происходит при передачи HDC процедуре Perform или SendMessage, при подсветки определения процедур указывается, что WParam и LParam соответствуют длинне Integer. В помощи Longint, что в принципе одно и тоже. Как мне обойти тот случай, когда HDC больше Integer, у меня не получается корректно сделать прорисовку компонента.


 
Valera   (2005-07-19 20:06) [4]

сразу прошу извинения за неправильно поставленный вопрос


 
alpet ©   (2005-07-19 21:00) [5]

Valera   (19.07.05 20:06) [4]
Можешь представить значение валидного DC, что у тебя ошибку вызывает?


 
Valera   (2005-07-19 21:30) [6]

Не знаю меняется ли он или нет, отловить трудно потому что ошибка происходит не постоянно. После 10 минут мучений с компонентом HDC получился 3120630617.


 
Valera   (2005-07-20 00:53) [7]

Значения DC всегда разные. Я выкладываю кусок кода, если кто подскажет ошибку буду блогадарен.

procedure TDzTrackBar.WMEraseBkgnd( var Msg: TWMEraseBkgnd );
begin
 if FTransparent then
 begin
   DrawParentImage( Self, Msg.DC, True );
   Msg.Result := 1;
 end
 else
   inherited;
end;

procedure TDzTrackBar.DrawParentImage(Control: TControl; DC: HDC;
 InvalidateParent: Boolean);
var
 SaveIndex: Integer;
 P: TPoint;
begin
 if Control.Parent = nil then
   Exit;
 SaveIndex := SaveDC( DC );
 GetViewportOrgEx( DC, P );

 SetViewportOrgEx( DC, P.X - Control.Left, P.Y - Control.Top, nil );
 IntersectClipRect( DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight );

 if not ( csDesigning in Control.ComponentState ) then
 begin
Ошибка -    Control.Parent.Perform( wm_EraseBkgnd, DC, 0 );
   Control.Parent.Perform( wm_Paint, DC, 0 );
 end
 else
 begin
   // Wrapping the following calls in a try..except is necessary to prevent cascading access violations in the Form
   // Designer (and ultimately the shutting down of the IDE) in the Form Designer under the following specific condition:
   //   1. Control on Form Designer supports Transparency (thus this procedure is called).
   //   2. Control is selected in the Form Designer such that grab handles are visible.
   //   3. User selects File|Close All Files, or Creates a New Application (i.e. Anything that closes the current
   //      project).
   //   4. Cascading access violations are created inside the IDE Form Designer.
   //
   // The same problem also occurs in Delphi 7 under Windows XP if you add a Delphi32.exe.manifest to the Delphi\Bin
   // folder. This will cause controls such as TPanel to appear transparent when on the Form Designer. Repeating the
   // steps above, will result in the cascading access violations as described above.

   try
     Control.Parent.Perform( wm_EraseBkgnd, DC, 0 );
     Control.Parent.Perform( wm_Paint, DC, 0 );
   except
   end;
 end;

 RestoreDC( DC, SaveIndex );

 if InvalidateParent then
 begin
   if not ( Control.Parent is TCustomControl ) and
      not ( Control.Parent is TCustomForm ) and
      not ( csDesigning in Control.ComponentState ) then
   begin
     Control.Parent.Invalidate;
   end;
 end;
end;


 
alpet ©   (2005-07-20 07:58) [8]

Трассировать код VCL Control.Parent.Perform( wm_EraseBkgnd, DC, 0 ); ты пробывал, может ошибка не из-за DC? Очень не похоже чтобы подобное значение могло привести к проблемам.


 
Elifan   (2005-08-26 11:12) [9]

Ребята, та же проблема при использовании TChart (без изменений, все как есть в Delphi 7).
Несколько графиков на форме, тоже раз в 10-20 минут при перерисовке может возникнуть AV или Canvas overflow...
Почему именно возникает, и какая зависимость я так и не смог понять....
Единственно что при дебаге выяснил что ошибка возникает в модуле Controls.pas, при RestoreDC(DC, SaveIndex);
Возможно что это та же проблема!?!
С уважением, Elifan



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

Форум: "WinAPI";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.037 c
10-1106204537
Vlash
2005-01-20 10:02
2005.10.30
Продолжение работы COM-сервера после закрытия клиента


1-1128429401
tw
2005-10-04 16:36
2005.10.30
Уменьшение размера приложения


3-1127292171
Каспер
2005-09-21 12:42
2005.10.30
Обработчик AfterScroll, в ADOQuery


2-1128877637
intel
2005-10-09 21:07
2005.10.30
модули


14-1128662254
syte_ser78
2005-10-07 09:17
2005.10.30
аналог Автосхемы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский