Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

предопределенные константы в DrawFrameControl [D7, XP, 2003]


dis12345 ©   (2013-10-20 13:20:00) 

Написал програмку, в ней есть чекбокс в StringGride, реализовал по широко известным примерам из инета:

procedure TFormSettings.StringGridUsersDrawCell(Sender: TObject; ACol,
 ARow: Integer; Rect: TRect; State: TGridDrawState);
const
Flags: array[Boolean] of DWORD = (0, DFCS_CHECKED);
begin

with StringGridUsers, Canvas do begin
   IF Acol = 4 THEN begin
   IF Arow >= 1 THEN begin
       InflateRect(Rect, -2, -2);
       DrawFrameControl(Canvas.Handle,
       Rect,
        DFC_BUTTON,
        DFCS_FLAT or DFCS_BUTTONCHECK or  Flags[Boolean(UserYN[Arow-1] )]);
   END;
   END;
END
end;

У меня все работает замечательно и правильно, но при тиражировании проги на некоторых компах на этой процедуре вываливается с runtime ошибкой read at 000000000. На подопытном свежеустановленном win2003 ошибка есть, после установки всех обновлений винды исчезла, на ХР как повезет иногда пропадает, иногда нет. Грешу на параметры DFC_BUTTON, DFCS_FLAT, DFCS_BUTTONCHECK  . Не знаю что это такое и где они предопределяются. Мой массив галок UserYN нормальный. Может какой package надо установить для работы? Подскажите плиз....


dis12345   (2013-10-20 16:27:00) [1]

Всем спасибо за помощь!


Юрий Зотов   (2013-10-20 16:17:00) [2]

> dis12345 ©   (20.10.13 16:07) [5]

Это битовые флаги. Объединяются через OR.


dis12345   (2013-10-20 16:07:00) [3]

Может их тогда надо объединять при помощи AND а не OR ?


Inovet   (2013-10-20 15:30:00) [4]

> [2] dis12345 ©   (20.10.13 15:20)
> нечектутый

и не надо тогда ничего писать


Inovet   (2013-10-20 15:28:00) [5]

> [2] dis12345 ©   (20.10.13 15:20)
> через OR это нормально

Ну а как их ещё объеденить? Можно +, но имхо некрасиво он так.


dis12345   (2013-10-20 15:20:00) [6]

Спасибо!
Стало чуть яснее. Значит я могу использовать эти константы без объявления.
Прочитал в win32.hlp про DrawFrameControl
BOOL DrawFrameControl(

   HDC hdc,  // handle to device context
   LPRECT lprc, // pointer to bounding rectangle
   UINT uType, // frame-control type
   UINT uState // frame-control state
  );

а то что в последнем параметре несколько не взаимоисключающих параметров идут через OR это нормально?
плоский чекбокс чекнутый
плоский чекбокс нечектутый


Юрий Зотов   (2013-10-20 14:48:00) [7]

> Грешу на параметры DFC_BUTTON, DFCS_FLAT, DFCS_BUTTONCHECK
Зря грешите. Они здесь точно ни при чем.

>  Не знаю что это такое
Это всего лишь целые числа. Именованные константы. Определяют, что и как надо рисовать.

DFC_BUTTON - рисовать контрол класса Button (чекбоксы тоже относятся к этому классу).

DFCS_FLAT - рисовать в плоском стиле.

DFCS_BUTTONCHECK - рисовать чекбокс.

DFCS_CHECKED - рисовать птичку (состояние Checked).

> и где они предопределяются
Изначально - в заголовочных файлах Windows. А в Delphi - в модуле Windows.

------------------------------

> read at 000000000

Похоже на обращение к непроинициализированному указателю или к несозданному объекту (что одно и то же). Вряд ли в этом виновата система - скорее что-то не так в программе, только проявляется не всегда. Воспроизведите ошибку и на брейкпойнте проверьте значения всех указателей на nil (включая ссылки объекты).


Наверх

Титульная страница Поиск, карта сайта Написать письмо