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