Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.09.21;
Скачать: CL | DM;

Вниз

предопределенные константы в DrawFrameControl   Найти похожие ветки 

 
dis12345 ©   (2013-10-20 13:20) [0]

Написал програмку, в ней есть чекбокс в 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 надо установить для работы? Подскажите плиз....


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

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

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

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

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

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

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

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

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

> read at 000000000

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


 
dis12345 ©   (2013-10-20 15:20) [2]

Спасибо!
Стало чуть яснее. Значит я могу использовать эти константы без объявления.
Прочитал в 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 это нормально?
плоский чекбокс чекнутый
плоский чекбокс нечектутый


 
Inovet ©   (2013-10-20 15:28) [3]

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

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


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

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

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


 
dis12345 ©   (2013-10-20 16:07) [5]

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


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

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

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


 
dis12345 ©   (2013-10-20 16:27) [7]

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



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

Текущий архив: 2014.09.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.008 c
15-1392323403
Юрий
2014-02-14 00:30
2014.09.21
С днем рождения ! 14 февраля 2014 пятница


15-1392274278
KSergey
2014-02-13 10:51
2014.09.21
Системы ведения изменяющихся документов


2-1382012973
Андрей Темкин
2013-10-17 16:29
2014.09.21
Сколько строк можно загрузить в TStringList?


4-1264472887
SPeller
2010-01-26 05:28
2014.09.21
Проблема с Read/WriteProcessMemory из разных модулей


15-1390288445
JohnKorsh
2014-01-21 11:14
2014.09.21
Не по Delphi (поиск алгорима)