Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: Odysseos
Дата сообщения: 12.03.2010 11:09
Man Without Face

Момент первый. В запросе имеет смысл фильтровать значения по заданным датам, а не выбирать всю историю - и трафик меньше, и выбранных данных на клиента (= занятый объем памяти на клиенте) меньше, и работать с ними легче.

Момент второй - как я понимаю, в запросе мы получаем данные сразу по всем резервуарам - тоже имело бы смысл выполнять отдельный запрос по каждому резервуару.

Кроме того - запрос обязан быть отсортирован по возрастанию даты и по возрастанию номера смены. Иначе надо будет отдельно выбирать его данные в некий промежуточный буфер - ну хоть TList - и сортировать.

Ну, да ладно. Итак:


Код:
[more]
var
value_found: Boolean;
...
begin
...

q.Open();

for i := 0 to <количество_резервуаров> - 1 do begin
q.First();

while not q.Eof and (q.FieldByName(<date>).AsDate < <start_date>) do
q.Next();

for j := <start_date> to <end_date> do begin
value_found := False;

while not q.Eof and (q.FieldByName(<date>).AsDate = j) do begin
if q.FieldByName(<id_резервуара>).AsInteger = <id_резервуара>(i) then begin
<добавляем реальное значение на график>

value_found := True;
end;

q.Next();
end;

if not value_found then
<добавляем нулевое значение на график>
end;
end;
[/more]
Автор: Man Without Face
Дата сообщения: 12.03.2010 12:04
Odysseos
Спасибо большое, только происходит зацикливание вот здесь:
while trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < j do
Если я выбрал период с 1 марта по 12 марта, а в базе только данные до 8 марта, то строит до 8 марта, а потом зацикливается. Помогите этот штрих убрать, я уже ничего не соображаю...Если что вот полный код: [more]
begin
//dbChart1.Title.Text.Add('График отклонения фактического движения за смену от расчетного');
//Подсчитываю количество линий:
count_product:=0;
while not(qCharts.Eof) do begin
inc(count_product);
SetLength(mproduct,count_product);
mproduct[count_product-1]:=qCharts.FieldByName('rc_smenavol_volumenum').AsInteger;
qCharts.Next;
end;
//Строю график

qChart2.Open;
for i:=0 to count_product-1 do begin

SetLength(mseries,dbChart1.SeriesList.Count+1);
mseries[dbChart1.SeriesList.Count]:=TFastLineSeries.Create(dbChart1);
mseries[dbChart1.SeriesList.Count].LinePen.Width:=2;
dbChart1.AddSeries(mseries[dbChart1.SeriesList.Count]);

qChart2.First();

for j := Trunc(cxdedReservFrom.Date) to Trunc(cxdedReservTo.Date) do begin
while trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < j do

qChart2.Next();
value_found := False;

showmessage(DateToStr(j));
while trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) = j do begin
if qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i] then begin

if cxRadioGroup1.ItemIndex = 0 then //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))))
else //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))));


value_found := True;
end;

qChart2.Next();
end;

if not value_found then

mseries[dbChart1.SeriesList.Count-1].Add(0,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))));
end;


end;
end;
[/more]
Автор: Odysseos
Дата сообщения: 12.03.2010 12:11
Man Without Face

Полностью код, который получился, покажите.

Добавлено:
Man Without Face

Да! И покажите уж, заодно, и запрос.

Добавлено:
Odysseos

...Во всех циклах while по q - добавьте до основного условия еще одно:


Код:
not q.Eof and
Автор: Man Without Face
Дата сообщения: 12.03.2010 12:25
тут еще мог напороть с массивом: if qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i] then begin
Полный код: [more]
procedure TfTypes.ChangeReservFiltr;
var bar_ser:TBarSeries;
mseries:array of TFastLineSeries;
mproduct:array of integer;
count_product,i,j:integer;
value_found: Boolean;
begin
if not bInit then
begin
with qReservoirsState do
begin
if Active then Close;
ParamByName('obj').AsInteger:=ID_AZS;
ParamByName('date_from').AsDate:=cxdedReservFrom.Date;
ParamByName('date_to').Asdate:=cxdedReservTo.Date;
Prepare;
Open;
end;

with qReservoirsStatus do
begin
if Active then Close;
ParamByName('obj').AsInteger:=ID_AZS;
ParamByName('date_from').AsDate:=cxdedReservFrom.Date;
ParamByName('date_to').Asdate:=cxdedReservTo.Date;
Prepare;
Open;
end;

with qryShiftListRes do
begin
if Active then Close;
ParamByName('obj').AsInteger:=ID_AZS;
ParamByName('date_from').AsDate:=cxdedReservFrom.Date;
ParamByName('date_to').Asdate:=cxdedReservTo.Date;
Prepare;
Open;
end;
//////////////////////////////////////////////////////////////////////////
with qCharts do
begin
if Active then Close;
ParamByName('obj').AsInteger:=ID_AZS;
ParamByName('date_from').AsDate:=cxdedReservFrom.Date;
ParamByName('date_to').Asdate:=cxdedReservTo.Date;
Prepare;
Open;
end;


with qChart2 do
begin
if Active then Close;
ParamByName('obj').AsInteger:=ID_AZS;
ParamByName('date_from').AsDate:=cxdedReservFrom.Date;
ParamByName('date_to').Asdate:=cxdedReservTo.Date;
Prepare;
Open;
end;

//Строим график
dbChart1.View3D:=false;
dbChart1.Legend.Visible:=true;
dbChart1.Legend.ColorWidth:=0;
dbChart1.Legend.ShadowSize:=1;
dbChart1.Legend.Alignment:=laRight;
dbChart1.Legend.ColorWidth:=15;

dbChart1.SeriesList.Clear; //Очищаю график
dbchart1.Refresh;
begin
//dbChart1.Title.Text.Add('График отклонения фактического движения за смену от расчетного');
//Подсчитываю количество линий:
count_product:=0;
while not(qCharts.Eof) do begin
inc(count_product);
SetLength(mproduct,count_product);
mproduct[count_product-1]:=qCharts.FieldByName('rc_smenavol_volumenum').AsInteger;
qCharts.Next;
end;
//Строю график

qChart2.Open;
for i:=0 to count_product-1 do begin

SetLength(mseries,dbChart1.SeriesList.Count+1);
mseries[dbChart1.SeriesList.Count]:=TFastLineSeries.Create(dbChart1);
mseries[dbChart1.SeriesList.Count].LinePen.Width:=2;
dbChart1.AddSeries(mseries[dbChart1.SeriesList.Count]);

qChart2.First();

for j := Trunc(cxdedReservFrom.Date) to trunc(strtodate('07.03.2010')) do begin
while trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < j do
//begin
qChart2.Next();
value_found := False;
//end;
//showmessage(DateToStr(j));
while trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) = j do begin
if qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i] then begin

if cxRadioGroup1.ItemIndex = 0 then //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))))
else //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))));

value_found := True;
end;

qChart2.Next();
end;

if not value_found then

mseries[dbChart1.SeriesList.Count-1].Add(0,datetostr(trunc((qChart2.FieldByName('rc_sd_begindate').Asdatetime))));
end;

end;
end;

end;
end;
[/more]
Запросы:
[more]
Подсчет количества резервуаров:
select distinct t.rc_smenavol_product, t.rc_smenavol_volumenum from berlio.RC_SMENAVOL t, berlio.rc_smenadates m, roman.Producttypes n
where rc_smenavol_header = rc_smenadates
         and m.rc_sd_begindate >= ate_from and m.rc_sd_enddate <= ate_to
and m.rc_sd_object = bj
and t.rc_smenavol_product = n.producttypes
and producttypes_productgroup in (1,2)
order by t.rc_smenavol_volumenum

Выборка записей:
SELECT DISTINCT "PT"."producttypes_productname",
"PT"."producttypes_color",
"V"."RC_SMENAVOL",
"V"."rc_smenavol_volumenum",
"V"."rc_smenavol_header",
"V"."rc_smenavol_bookbegsmena",
"V"."rc_smenavol_bookendsmena",
"V"."rc_smenavol_litrtrkofvolume",
"V"."rc_smenavol_begsmena",
"V"."rc_smenavol_endsmena",
"V"."rc_smenavol_deltavolume",
"V"."rc_smenavol_litrinput",
"V"."rc_smenavol_product",
"V"."rc_smenavol_bookendsmena" as "rc_smenavol_bookendsmena_increasing",
s.rc_smenadates,
s.rc_sd_iterator,
s.rc_sd_begindate,
s.rc_sd_enddate,
s.rc_sd_name,
(rc_smenavol_bookbegsmena - rc_smenavol_bookendsmena) AS "bookrealisation",
(rc_smenavol_endsmena - rc_smenavol_begsmena - (rc_smenavol_litrinput - bookrealisation)) as otklon_fakdvforsmena, (rc_smenavol_endsmena - rc_smenavol_bookendsmena) as otklon_fakrestfromincrease
FROM ( "Berlio"."RC_SMENAVOL" AS V JOIN "Berlio"."RC_SMENADATES" AS S ON ("V"."rc_smenavol_header" = "S"."RC_SMENADATES") ) JOIN "Roman"."PRODUCTTYPES" AS PT ON ("V"."rc_smenavol_product" = "PT"."PRODUCTTYPES")
WHERE rc_sd_object = bj AND s.rc_sd_begindate >= ate_from AND s.rc_sd_enddate <= ate_to
ORDER BY V."rc_smenavol_volumenum", s."rc_sd_begindate"
[/more]
Автор: Odysseos
Дата сообщения: 12.03.2010 12:48
Man Without Face

Я имел в виду, вообще-то, код только самого цикла, а не всей процедуры...

Перепишите цикл вот так:


Код:
[more]
qChart2.Open;

for i:=0 to count_product-1 do begin
SetLength(mseries,dbChart1.SeriesList.Count+1);
mseries[dbChart1.SeriesList.Count]:=TFastLineSeries.Create(dbChart1);
mseries[dbChart1.SeriesList.Count].LinePen.Width:=2;
dbChart1.AddSeries(mseries[dbChart1.SeriesList.Count]);

qChart2.First();

while not qChart2.Eof and (trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < j) do
qChart2.Next();

for j := Trunc(cxdedReservFrom.Date) to trunc(strtodate('07.03.2010')) do begin
value_found := False;

//showmessage(DateToStr(j));
while not qChart2.Eof and (trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) = j) do begin
if qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct then begin

if cxRadioGroup1.ItemIndex = 0 then //График фактического отклонения движения за смену от расчетного
mseries[dbChart1.SeriesList.Count-1].Add(
qChart2.FieldByName('otklon_fakdvforsmena').AsInteger,
datetostr(trunc(qChart2.FieldByName('rc_sd_begindate').Asdatetime))
)
else //График фактического остатка от нарастающего расчетного
mseries[dbChart1.SeriesList.Count-1].Add(
qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger,
datetostr(trunc(qChart2.FieldByName('rc_sd_begindate').Asdatetime))
);

value_found := True;
end;

qChart2.Next();
end;

if not value_found then
mseries[dbChart1.SeriesList.Count-1].Add(
0,
datetostr(trunc(qChart2.FieldByName('rc_sd_begindate').Asdatetime))
);
end;
end;
end;
[/more]
Автор: Man Without Face
Дата сообщения: 12.03.2010 13:01
Odysseos
Я бы картинку прикрепил бы, да инет глючный. Поле rc_smenavol_volumenum последовательные значения не с 0 (31,32,33,34,35 и т.д.). Отойти нужно, буду через час, последний код проверю. Спасибо.
Автор: Odysseos
Дата сообщения: 12.03.2010 13:16
Man Without Face

Я посмотрел в полном коде процедуры - нет, с номерами резервуаров все правильно должно быть. Сравнение же не с самим значением i, а как раз с get_id(i) (которая в данном случае - mproduct[i]).

...Кстати - промежуточную переменную count_product можно вообще не использовать, и делать цикл:


Код:
for i := Low(mproducts) to High(mproducts) do begin
Автор: Man Without Face
Дата сообщения: 12.03.2010 14:18
Odysseos
Зацикливание в последнем коде, изменил
while not qChart2.Eof and (trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < j) do
на
while not qChart2.Eof and (trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) < Trunc(cxdedReservFrom.Date)) do
В итоге рисует первую линию (резервуар) не до конца (5-6 точек) и не сначала.
Фишка где то здесь:
if qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = mproduct[i]
В отладчике ('rc_smenavol_volumenum').AsInteger принимает почему только значения 31 и 32 (должно быть от 31 до 38), а если навести на mproduct то показывает значения 31,32...37,38. В итоге другие линии рисуются в 0.


Добавлено:
Odysseos
Когда ('rc_smenavol_volumenum').AsInteger принимает значение 32 то даты не равняются никогда:
while not qChart2.Eof and (trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime) = j) do begin
Поэтому нули лупит. Но почему дата сет дальше по резервуарам не идет (33,34 и т.д.).


Добавлено:
Odysseos
Вроде нашел:
После каждого следующего резервуара в датасете нужно как то J обновлять: for j := Trunc(cxdedReservFrom.Date) to trunc(cxdedReservTo.Date) do begin
Автор: Odysseos
Дата сообщения: 12.03.2010 15:16
Man Without Face

О-хо-хонюшки...

Как, интересно, вот это:


Код:
ORDER BY V."rc_smenavol_volumenum", s."rc_sd_begindate"
Автор: greenpc
Дата сообщения: 12.03.2010 15:23
Man Without Face
подправить под себя
[more]
type
TLGrath = record
IDR : Integer;
DayCount : Integer;
LastPos : Integer;
LinR : TLineSeries;
end;
PTLGrath =^TLGrath;
var
i, j, kum: Integer;
s, t: TFastLineSeries;
lLine : array of TLGrath;

begin
SetLength(lLine, 5); // рисуем 6 линий
for i := 0 to High(lLine) do begin
lLine[i].IDR :=i;
lLine[i].LastPos :=0;
lLine[i].DayCount := 0;
lLine[i].LinR := TLineSeries.Create(nil);
lLine[i].LinR.ParentChart := Cht1;
lLine[i].LinR.Clear;
end;
end; // for
for j := Trunc(cxdedReservFrom.Date) to Trunc(cxdedReservTo.Date) do begin
maxdotday :=0;
for i := 0 to High(lLine) do begin
lLine[i].LastPos :=0;
lLine[i].DayCount := 0;
qChart2.First;
while not qChart2.eof do begin
if (qChart2.FieldByName('rc_smenavol_volumenum').AsInteger = lLine[i].IDR) and
Trunc(qChart2.FieldByName('rc_sd_begindate').AsDateTime)= j then begin
if cxRadioGroup1.ItemIndex = 0 then //График фактического отклонения движения за смену от расчетного
lLine[i].LastPos :=qChart2.FieldByName('otklon_fakdvforsmena').AsInteger;
else //График фактического остатка от нарастающего расчетного
lLine[i].LastPos :=qChart2.FieldByName('otklon_fakrestfromincrease').AsInteger;
lLine[i].LinR.Add(LastPos, datetostr(j));
lLine[i].DayCount := lLine[i].DayCount+1;
if lLine[i].DayCount>maxdotday then maxdotday := lLine[i].DayCount;
end;
qChart2.Next;
end; // while
end; //for i
for i := 0 to High(lLine) do begin
for k := lLine[i].DayCount to maxdotday do
lLine[i].LinR.Add(lLine[i].LastPos, datetostr(j));
end;
end; // for j
end;[/more]
Автор: Man Without Face
Дата сообщения: 12.03.2010 15:28
Odysseos
Все работает как надо! БОЛЬШОЕ СПАСИБО! СПАСИБО! СПАСИБО!

Наверное вам сильно голову задурил, но хоть завтра на работу не попрусь.
Автор: Odysseos
Дата сообщения: 12.03.2010 15:48
Man Without Face

Не за что

...Почитайте что-нибудь по алгоритмам - жизнь весьма упростится.
Автор: Man Without Face
Дата сообщения: 12.03.2010 17:01
greenpc
Тоже большое спасибо за помощь!
Автор: Dromic
Дата сообщения: 12.03.2010 17:03
Здрасти.
Есть один очень старый проект, который создавался еще на Delphi 4-5. Создавал его не я.
Но мне приходиться его переделывать на Delphi 2010.
Как только я его открываю-первый мат:
Class TDBMemoMenu not found
Насколько я понял это устаревшый VCL. Только я не знаю чем его заменить в Delphi 2010.

Автор: Odysseos
Дата сообщения: 12.03.2010 17:38
Dromic

Что-то не помню я в VCL 4 или 5 такого класса. Может, этот проект требует каких-то сторонних компонент?
Автор: Dromic
Дата сообщения: 12.03.2010 18:06
Вероятнее всего, но каких?
ehLib, FastReport и Jedi у меня установлены.
В гугле ничего инетерсного не нашел.
Автор: Frodo_Torbins
Дата сообщения: 12.03.2010 18:29
Dromic
Возможно имеет смысл поставить себе Delphi 5 и попробовать открыть проект там. А уже когда он будет нормально компилироваться под пятеркой, двигать его дальше на 2010-ю.
Автор: Odysseos
Дата сообщения: 12.03.2010 19:47
Dromic

Если это старый проект - то, вероятно, он будет требовать версий библиотек компонентов именно тех времен, а не современных. (То есть - как минимум, не Jedi, а RxLib.)

Также - вероятно, это вообще самописный компонент, который как раз для того проекта и был написан. Попробуйте поискать в других файлах проекта такой класс.


...Кроме того - можно открыть pas-файл, на котором ругань вылезает, в текстовом редакторе (хоть в "Блокноте"), и посмотреть в нем, где и как используется этот компонент - может, он и нафиг не нужен. Также стоит посмотреть и в соответствующем dfm-файле.
Автор: Aleksandr N
Дата сообщения: 12.03.2010 20:55
Подскажите, можно-ли в компоненте TTBPopupMenu в одном из элементов сделать наподобие как в TPopupMenu у элементов есть свойство Break=mbBreak? Для того, чтобы элементы можно было расположить столбцами.
Автор: Odysseos
Дата сообщения: 12.03.2010 22:07
Aleksandr N

Нет, так он не умеет.
Автор: Aleksandr N
Дата сообщения: 12.03.2010 22:21
Odysseos
Плохо, даже подтверждение в их новостях нашел.
Автор: Odysseos
Дата сообщения: 12.03.2010 22:32
Aleksandr N

Ну, учитывая открытые исходники - можно и самостоятельно попробовать. Я в TB2k кое-чего менял - в общем, ничего особо сложного не обнаружилось.
Автор: Wahnsinn
Дата сообщения: 12.03.2010 23:29
oбщий вoпрoс,
дoпустим нужнo зашифрoвать oдин из параметрoв ини файла. алгoритм Blоwfish, 3DES в oбщем неважнo,
пoсле шифрoвания имеем пoтoк TMemoryStream, вoт как быть с ним для сохрания в строку в конфигурационный файл, ничего кроме oбрабoтки пoбайтнo функцией оrd() в голову не приходит.
Автор: Odysseos
Дата сообщения: 13.03.2010 00:02
Wahnsinn

Во-первых, "чистый" бинарный поток, преобразованный в строку, записать в ini-файл нельзя (просто потому, что функции работы с ini-файлами используют WinAPI, который ожидает на вход 0-ль как конец строки - а после шифрования 0-ли в байтовом массиве могут быть в произвольным месте; кроме того - что получится, если в полученном массиве будут байты, кодирующие символы '[', ']' и '='?..). Очевидное решение - предварительное кодирование байтового массива в Base64.

Во-вторых, из-за некоторой специфики того, как именно работает Delphi с WinAPI при записи/чтении ini-файлов - больше 16 КБ (кажется) в ключ и больше 64 КБ (кажется) всего записать не получится. Этот недостаток можно обойти, используя класс TMemIniFile - но у него есть свои особенности.
Автор: Wahnsinn
Дата сообщения: 13.03.2010 00:28
вариант с Bаse64 я пробовал, натыкался на такую мысль, не удалось расшифровать потом, хотя теперь на ум приходит, что это косяк реализаций функций шифровки/расшифровки алгоритма Base64 у меня.
Автор: Odysseos
Дата сообщения: 13.03.2010 01:03
Wahnsinn

Поверьте - раскодируется без проблем Я сам так храню несколькокилобайтные блоки. Другой вопрос - что оно, вероятно, обрезалось, по указанным причинам.
Автор: Aleksandr N
Дата сообщения: 13.03.2010 02:17
Odysseos
Да и я сам менял, но вот что-то свойство Break не получается придумать...
Вот я и подумал, может кто-то уже придумал???!!!
Автор: Odysseos
Дата сообщения: 13.03.2010 10:27
Aleksandr N

Как мне видится - это должен быть наследник от separator'а, на который соответствующим образом будет реагировать (пересчитывая размеры и перенося в новую колонку последующие item'ы) изменененный TTBPopupMenu (или - опять же - его наследник).
Автор: Aleksandr N
Дата сообщения: 13.03.2010 12:53
Odysseos
В том-то и фокус, представить можно, а вот практически... Вот только интересно, почему автор говорит, что это пока невозможно.
Автор: Frodo_Torbins
Дата сообщения: 13.03.2010 17:05
Господа, помогите плиз с переводом заголовочников из WinSDK. Есть вот такой хидер: [more=magnification.h]
Код: [no]// -------------------------------------------------------------
// magnification.h
//
// Magnification Control API
//
// Copyright (c) Microsoft Corporation. All rights reserved.
// -------------------------------------------------------------


#ifndef _INC_MAGNIFIER
#define _INC_MAGNIFIER

#ifndef __wincodec_h__
#include <wincodec.h>
#endif

#ifdef __cplusplus // If used by C++ code,
extern "C" { // we need to export the C interface
#endif

#ifdef _WIN32

// Magnifier Class Name
#define WC_MAGNIFIERA "Magnifier"
#define WC_MAGNIFIERW L"Magnifier"

#ifdef UNICODE
#define WC_MAGNIFIER WC_MAGNIFIERW
#else
#define WC_MAGNIFIER WC_MAGNIFIERA
#endif

#else
#define WC_MAGNIFIER "Magnifier"
#endif

// Magnifier Window Styles
#define MS_SHOWMAGNIFIEDCURSOR 0x0001L
#define MS_CLIPAROUNDCURSOR 0x0002L
#define MS_INVERTCOLORS 0x0004L


// Filter Modes
#define MW_FILTERMODE_EXCLUDE 0
#define MW_FILTERMODE_INCLUDE 1

typedef struct tagMAGTRANSFORM
{
float v[3][3];
} MAGTRANSFORM, *PMAGTRANSFORM;

typedef struct tagMAGIMAGEHEADER
{
UINT width;
UINT height;
WICPixelFormatGUID format;
UINT stride;
UINT offset;
SIZE_T cbSize;
} MAGIMAGEHEADER, *PMAGIMAGEHEADER;

typedef struct tagMAGCOLOREFFECT
{
float transform[5][5];
} MAGCOLOREFFECT, *PMAGCOLOREFFECT;

typedef BOOL (CALLBACK* MagImageScalingCallback)(HWND hwnd, void * srcdata, MAGIMAGEHEADER srcheader, void * destdata, MAGIMAGEHEADER destheader, RECT unclipped, RECT clipped, HRGN dirty );

// Public Functions
BOOL WINAPI MagInitialize();
BOOL WINAPI MagUninitialize();

BOOL WINAPI MagSetWindowSource(HWND hwnd, RECT rect);
BOOL WINAPI MagGetWindowSource(HWND hwnd, RECT *pRect);
BOOL WINAPI MagSetWindowTransform(HWND hwnd, PMAGTRANSFORM pTransform);
BOOL WINAPI MagGetWindowTransform(HWND hwnd, PMAGTRANSFORM pTransform);
BOOL WINAPI MagSetWindowFilterList(HWND hwnd, DWORD dwFilterMode, int count, HWND *pHWND );
int WINAPI MagGetWindowFilterList(HWND hwnd, DWORD *pdwFilterMode, int count, HWND *pHWND );
BOOL WINAPI MagSetImageScalingCallback(HWND hwnd, MagImageScalingCallback callback );
MagImageScalingCallback WINAPI MagGetImageScalingCallback(HWND hwnd );
BOOL WINAPI MagSetColorEffect(HWND hwnd, PMAGCOLOREFFECT pEffect);
BOOL WINAPI MagGetColorEffect(HWND hwnd, PMAGCOLOREFFECT pEffect);


#ifdef __cplusplus
}
#endif

#endif // !_INC_MAGNIFIER
[/no]

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.