Тернарные операции GDI

Все особенности программирования под платформу Wintel
Ответить
ilyasuhih
Сообщения: 4
Зарегистрирован: 12 дек 2012, 23:46

12 дек 2012, 23:49

ребят.подскажите как осуществить,как реализовать хоть одну тернарную операцию в Делфи. ну вся инфа на СИ,СИ++. ничего по Делфи нет. у меня препод сам не знает. а модуль написать нужно.хоть кто нибудь слышал про их существование в Делфи??
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

13 дек 2012, 17:24

Нету. Пиши if true then x:=1 else x:=0; то же самое по сути..
[syntax=Delphi] [/syntax]
ilyasuhih
Сообщения: 4
Зарегистрирован: 12 дек 2012, 23:46

13 дек 2012, 18:29

дааа....влип я....мне их и нужно осуществить.а с помощью простых конструкторов делать нельзя
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

13 дек 2012, 20:49

Я не знаю как такое сделать, первое что приходит на ум как-то влезать в компилятор или использовать функцию Min := IfThen(A < B, A, B); она объявлена в Math и StrUtils и они слегка разные..
[syntax=Delphi] [/syntax]
ilyasuhih
Сообщения: 4
Зарегистрирован: 12 дек 2012, 23:46

14 дек 2012, 18:01

есть вариант перепечатать СИшный код в Делфи.но эт труба. изучить Си за 14 дней я не смогу. И все через IfThen это тоже какой то ужас...даже сделать несколько операций будет оч трудно
Аватара пользователя
AiK
Сообщения: 2273
Зарегистрирован: 13 фев 2004, 18:14
Откуда: СПб
Контактная информация:

14 дек 2012, 19:08

А переопределение операторов не поможет?
Конкретно можно реализовать:

Код: Выделить всё

    class operator Implicit( a: String): TMyCoolClass;
И тогда обращение к тернарной операции будет примерно такое:

Код: Выделить всё

 var a:TMyCoolClass;
a:='(a < b) ? a : b';
И вся задача сведётся к разделению строки на 3 части и вызову IfThen
Не?
Даже самый дурацкий замысел можно воплотить мастерски
ilyasuhih
Сообщения: 4
Зарегистрирован: 12 дек 2012, 23:46

14 дек 2012, 19:46

это неплохая мысль...но чет все равно не представляю как это осуществить. мне например нужно окрасить обычную картинку в эффект серого цвета.такая тернарная операция есть.код ее есть.на СИ. вот гляньте
//Создание изображения в оттенках серого(DIB-секции)
//по одному каналуRGBвDIB
HBITMAPChannelSplittconstBITMAPINFO*pBMI.constvoid
COLORREFMask.HDChMemDC)
pBits.
typedefstruct{BITMAPINFOHEADERbmiHeader;
RGBQUADbmiColor[256]:
}BMI8BPP;
intwidth=pBMI->bmiHeader.biWidth;
intheight-pBMI->bmiHeader.biHeight:
BMI8BPPbmi8bpp;
memsetUbmiSbpp,0 ,sizeof(bmi8bpp)):
bmi8bpp.bmiHeader.biSize
bmiSbpp.bmiHeader.biWidth
bmi8bpp.bmiHeader.biHeight
bmi8bpp.bmiHeader.biPlanes
bmi8bpp.bmiHeader.biBitCount
=Sizeof(BITMAPINFOHEADER);
-width:
-height:
-1:
-8;
bmiSbpp.bmiHeader.biCompression-BI_RGB:
fo r(inti-0 ;i<256 :1++ )//Цветовая таблица одного из каналовRGB
}
bmi8bpp.bmiColor.rgbRed= i&GetRValue(Mask):
bmi8bpp.bmiColor.rgbGreen=i&GetGValue(Mask):
bmi8bpp.bmiCo1or.rgbBlue- i&GetBValue(Mask);
HBITMAPhRslt=CreateDIBSection(NULL,(BITMAPINFO*)&bmiSbpp.
NULL.DIB_RGB_COLORS.NULL.NULL):
if(hRs1t==NULL)
returnNULL;
SelectObjectthMemDC.hRslt);
HBRUSHhBrush=CreateSolidBrush(Mask);//Однородный красный.
//зеленый или синий цвет
HGDIOBJhOld-SelectObjectdiMemDC.hBrush);
StretchDIBits(hMemDC.0.0.width,height.0.0.width,height.
pBits,pBMI,DIB_RGB_COLORS.MERGECOPY);
fo r(i-0 :i<256 ;i++)//Перейти к настоящей цветовой таблице
//оттенковсерогоцвета
bmiSbpp.bmiColor.rgbRed
bmiSbpp.bmiColor.rgbGreen
bmi8bpp.bmiColor.rgbBlue
;
SetDIBColorTable(hMemDC.0.256 .bmiSbpp.bmiColor);
SelectObject(hMemDC.hOld):
DeleteObject(hBrush);
returnhRslt;
}
Ответить