Имя: Пароль:
1C
 
Delphi (С++) Наличие флага в комбинации.
0 H A D G E H O G s
 
21.10.14
15:41
Дня доброго.

Для winapi, в функциях используется параметры типа DWORD, который является комбинацией байтовых флагов, например:
http://msdn.microsoft.com/en-us/library/dd162845(v=vs.85).aspx

Attributes

The printer attributes. This member can be any reasonable combination of the following values.

PRINTER_ATTRIBUTE_DIRECT
PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST,
и.т.д.

Как собрать комбинацию - понятно.

value:= PRINTER_ATTRIBUTE_DIRECT or PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST;

А вот как проверить наличие флага PRINTER_ATTRIBUTE_DIRECT в существующей комбинации?

От противного?
FlagEnabled:=(value and PRINTER_ATTRIBUTE_DIRECT)<>0;
1 DmitrO
 
21.10.14
15:43
if (value && PRINTER_ATTRIBUTE_DIRECT)
{

};
2 H A D G E H O G s
 
21.10.14
15:43
Ахтунг!
Флаги - байтовые!, не путайте.
3 H A D G E H O G s
 
21.10.14
15:44
(1) && - что это?
4 supremum
 
21.10.14
15:45
5 supremum
 
21.10.14
15:47
Флаги там битовые:
http://msdn.microsoft.com/en-us/library/cc244854.aspx
6 H A D G E H O G s
 
21.10.14
15:48
(4) Ясно.
(1) И вернуть оно должно 0 - если флага нет и значение флага, если флаг есть.
7 DmitrO
 
21.10.14
15:48
туплю, в с++ такой оператор побитного И:
if (value & PRINTER_ATTRIBUTE_DIRECT)
{

};
8 H A D G E H O G s
 
21.10.14
15:49
(7) Все таки побитовые, иначе комбинацию не вернуть в исходное состояние?
9 DmitrO
 
21.10.14
15:51
конечно побитовое, тебе же надо проверить наличие определенных битов?
10 H A D G E H O G s
 
21.10.14
15:52
(9) Да, все верно, я ступил. Разобрался.
11 supremum
 
21.10.14
15:52
Можно еще команду Test на ассемблере применить:
http://www.kolasc.net.ru/cdo/programmes/assembler/test.html
12 DmitrO
 
21.10.14
15:53
например чтобы проверить наличие обоих битов в value, то так:
if (value & (PRINTER_ATTRIBUTE_DIRECT|PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST))
{

};
13 H A D G E H O G s
 
21.10.14
15:54
(12) Что вернет это выражение
value & (PRINTER_ATTRIBUTE_DIRECT|PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST)

?
14 supremum
 
21.10.14
15:56
(13) Ноль, если эти два атрибута не установлены. Не ноль, если хоть один атрибут установлен.
15 supremum
 
21.10.14
15:57
a | b - побитовое ИЛИ
16 DmitrO
 
21.10.14
15:57
DWORD c установленными в нем битами из числа PRINTER_ATTRIBUTE_DIRECT и PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST, но только те которые были в value.
17 H A D G E H O G s
 
21.10.14
15:57
(16) Ясно.
18 DmitrO
 
21.10.14
15:59
ну на самом деле не обязательно DWORD, а максимально широкий тип из всех операндов.
19 DmitrO
 
21.10.14
16:01
бросай ты свой Delphi, иди к нам на с++, у нас есть печеньки :)
20 H A D G E H O G s
 
21.10.14
16:07
(19) У вас в этом вашем C++ загогулина & может иметь до 3-х вариантов использования.

В нашем Дельфи все четко - AND и для логики и для битов и никаких этих ваших &. :-)
21 H A D G E H O G s
 
21.10.14
16:08
Мы красиво приводим типы

PPrinterInfo2(RawData)^.dmDeviceName
22 H A D G E H O G s
 
21.10.14
16:09
И у нас нет вот этого кровавого звиздеца

=     Прямое присваивание
+=     Присваивание со сложением
-=     Присваивание с вычитанием
*=     Присваивание с умножением
/=     Присваивание с делением
%=     Присваивание с взятием остатка от деления
<<=     Присваивание с побитовым сдвигом влево
>>=     Присваивание с побитовым сдвигом вправо
&=     Присваивание с побитовым И
^=     Присваивание с побитовым XOR
|=     Присваивание с побитовым OR
23 НафНаф
 
21.10.14
16:13
(22) в делфях нет оператора ? :
24 supremum
 
21.10.14
16:14
На ассемблере еще проще и прозрачнее.
25 DmitrO
 
21.10.14
16:14
ну когда я смотрю на арабскую вязь, мне тоже кажется что за адские узоры, как это можно читать.. а на с++ все понятно
26 supremum
 
21.10.14
16:15
Там каждый бит в каждом регистре под контролем.
27 НафНаф
 
21.10.14
16:15
(20) и логический И в сях может проверят оба условия & или только первое (если оно ложное) &&
В делфях надо директивами управлять
28 DmitrO
 
21.10.14
16:18
все всегда изначально пишется на с/с++ все остальное - это уже сверху надстройки, баловство.
29 SUA
 
21.10.14
16:21
(22)это нямка
кровавый звиздец идет позже после переопределения этих методов
30 DmitrO
 
21.10.14
16:21
в дельфях много чего нет: множественного наследования и шаблонов (полиморфизма времени компиляции).
31 НафНаф
 
21.10.14
16:21
(28) то есть проектов на делфях не бывает?
32 NS
 
21.10.14
16:24
(31) Навалом. Даже на акцессе навалом дорогих проектов.
33 DmitrO
 
21.10.14
16:25
(31) я немного не про то, сейчас никто не пишет "программы", сейчас все пишут "приложения", т.е. практически любой проект работает на базе какой-то среды, ОС, а то еще и кучу библиотек использует, так вот интерфейс ОС он всегда на С, и библиотеки тоже в первую очередь сишные
34 НафНаф
 
21.10.14
16:30
(33) а че не на ассемблере то? ))
35 NS
 
21.10.14
16:34
(33) А какая разница на чем он? Используя WinApi разработчику нет смысла задумываться на чем написано.
36 DmitrO
 
21.10.14
16:34
(34) нет смысла для общих задач, и еще раз (33) перечитай
37 DmitrO
 
21.10.14
16:38
(35) например чтобы использовать винапи из обджект паскаля проделана адская работа по перекладыванию заголовочных файлов windows на на собственно язык понятный компилятору (обджект паскаль). А для си их просто MS выпускает сразу.
38 Serginio1
 
21.10.14
16:42
(37) Ну для Net тоже наверное MS interopы делает например
http://msdn.microsoft.com/ru-ru/library/system.windows.interop(v=vs.110).aspx
39 DmitrO
 
21.10.14
16:46
(38) Net это вообще отдельная история :)
мой бог плачет, когда смотрит на это насилие над мозгом :))
40 НафНаф
 
21.10.14
16:48
(39) раскрой тему
41 H A D G E H O G s
 
21.10.14
16:49
(37) Ну так это не мы делаем :-)
42 vde69
 
21.10.14
16:51
давно не брал в руки сабж, но вроде в дельфи все зависит от деректив компиляции, по умолчанию старший и младший байт идут в порядке обратном плюсам... но там есть директива и специальное резервное слова для передачи параметров в процедуры плюсов...
43 DmitrO
 
21.10.14
16:52
Net хорош когда в проекте только Net, но такого практически не бывает, как только появляется IDisposable (а он всегда появляется), все танцуем..
..хотя для современных компов и большинства задач не чувствуется, осталось память не освобожденной какая фигня, у нас ее теперь много..
44 vde69
 
21.10.14
16:52
(42) по этому все вызовы апи и обернуты своими обработчиками :)
45 Serginio1
 
21.10.14
17:12
(43) Используй юсинги. И проблема  IDisposable  не в памяти, а в том, что ресурсы (файлы, соккеты итд) остаются открытыми.
46 NS
 
21.10.14
17:14
(36) Да какая разница на чем написаны?
В любом случае я их могу спокойно использовать в Делфи, если речь не идет о всяких MFC.
47 DmitrO
 
21.10.14
23:30
(45) да да, юзинг в юзинг в юзинг при использовании трех объектов работающих с неуправляемыми ресурсами. Посмотрите как наш код красив.
48 DmitrO
 
21.10.14
23:34
(45) не только файлы и сокеты, а окна, все объекты гди, все дескрипторы ОС.
49 NS
 
22.10.14
00:53
(47)(48) Ничего не понял. Кто мешает мне в Делфи работать с окнами через WinApi? Доступ ровно такой-же как и в С/С++.
50 Sasha_Rapira
 
22.10.14
01:06
(19) Delphi для элиты, С++ и у бомжа есть
51 Sasha_Rapira
 
22.10.14
01:09
(0) на чем работаешь? я дельфи отдал 10 лет. Щас думать опять вспомнить было, скачал топовую программу Embarcadero Delphi XE7
52 H A D G E H O G s
 
22.10.14
01:58
(51) XE6 для релиза, XE5 для отладки (eureka пока только для этой версии есть).
53 Serginio1
 
22.10.14
10:29
(48) Ну это лучще чем городить Try Finally городить.
Меня это лично никак не напрягает. И поверь на C# значительно приятнее писать чем на C++. Delphi кстати ближе к C#.