Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2008, 14:18   #1
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию Переделать процедуру

Как нужно переделать процедуру
Код:
procedure DrawGradient(ACanvas: TCanvas; Rect: TRect;
Horicontal: Boolean; Colors: array of TColor);
type
RGBArray = array[0..2] of Byte;
var
x, y, z, stelle, mx, bis, faColorsh, mass: Integer;
Faktor: double;
A: RGBArray;
B: array of RGBArray;
merkw: integer;
merks: TPenStyle;
merkp: TColor;
begin
mx:=High(Colors);
if mx > 0 then
begin
if Horicontal then
mass:=Rect.Right - Rect.Left
else
mass:=Rect.Bottom - Rect.Top;
SetLength(b, mx + 1);
for x:=0 to mx do
begin
Colors[x]:=ColorToRGB(Colors[x]);
b[x][0]:=GetRValue(Colors[x]);
b[x][1]:=GetGValue(Colors[x]);
b[x][2]:=GetBValue(Colors[x]);
end;
merkw:=ACanvas.Pen.Width;
merks:=ACanvas.Pen.Style;
merkp:=ACanvas.Pen.Color;
ACanvas.Pen.Width:=1;
ACanvas.Pen.Style:=psSolid;
faColorsh:=Round(mass / mx);
for y:=0 to mx - 1 do
begin
if y = mx - 1 then
bis:=mass - y * faColorsh - 1
else
bis:=faColorsh;
for x:=0 to bis do
begin
Stelle:=x + y * faColorsh;
faktor:=x / bis;
for z:=0 to 3 do
a[z]:=Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor));
ACanvas.Pen.Color:=RGB(a[0], a[1], a[2]);
if Horicontal then
begin
ACanvas.MoveTo(Rect.Left + Stelle, Rect.Top);
ACanvas.LineTo(Rect.Left + Stelle, Rect.Bottom);
end
else
begin
ACanvas.MoveTo(Rect.Left, Rect.Top + Stelle);
ACanvas.LineTo(Rect.Right, Rect.Top + Stelle);
end;
end;
end;
b:=nil;
ACanvas.Pen.Width:=merkw;
ACanvas.Pen.Style:=merks;
ACanvas.Pen.Color:=merkp;
end
else
raise EMathError.Create('Необходимо хотя бы два цвета.');
end;
Чтобы вместо Canvas можно было указать DC?
AidarBik вне форума Ответить с цитированием
Старый 20.05.2008, 15:18   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Можно и не переделывать, а ввести еще одну функцию:

Код:
procedure DrawGradientDC(DC:THANDLE; Rect: TRect; Horicontal: Boolean; Colors: array of TColor);
var C:TCanvas;
begin
   C := TCanvas.Create;
   try
      C.handle := DC;
      DrawGradient(C, Rect, Horicontal, Colors);
   finally
      C.free;
   end;
end;

// Примеры вызовов
procedure TForm1.FormPaint(Sender: TObject);
begin
   DrawGradientDC(getDC(0), rect(0, 0, 100, 100), true, [clBlue, clRed]);
   DrawGradientDC(Canvas.Handle, rect(0, 0, 100, 100), true, [clBlue, clRed]);
end;
если непременно нужно переделать, то нужно переписать все вызовы ACanvas.<> на соответствующие из winAPI.
alexBlack вне форума Ответить с цитированием
Старый 22.05.2008, 12:23   #3
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Нет. Первым способом не получается, я так пробовал. Происходит ошибка.
AidarBik вне форума Ответить с цитированием
Старый 22.05.2008, 12:55   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Происходит ошибка.
Какая наверное ты не знаешь?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 12:58   #5
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Access violation....
AidarBik вне форума Ответить с цитированием
Старый 22.05.2008, 13:27   #6
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

А до этого она у Вас работала ?

type RGBArray = array[0..2] of Byte;
B: array of RGBArray;
for z:=0 to 3 do
a[z]:=Trunc(b[y][z] + ((b[y + 1][z] - b[y][z]) * Faktor));

у себя я проверял, но без динамических массивов - просто взял область 100х100 и статический массив.
Работало без ошибок.

Последний раз редактировалось alexBlack; 22.05.2008 в 13:30.
alexBlack вне форума Ответить с цитированием
Старый 22.05.2008, 13:37   #7
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Да. Ошибка происходит, когда я обращаюсь к созданной канве.
AidarBik вне форума Ответить с цитированием
Старый 22.05.2008, 13:50   #8
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от AidarBik Посмотреть сообщение
Да. Ошибка происходит, когда я обращаюсь к созданной канве.
На данный момент могу предложить только рабочие примеры со статическим массивом (project1) и с getmem - (test). Может поможет.
С динамическим массивом сейчас попробовать не могу
Вложения
Тип файла: rar Project1.rar (87.5 Кб, 8 просмотров)
Тип файла: rar test.rar (87.4 Кб, 9 просмотров)
alexBlack вне форума Ответить с цитированием
Старый 22.05.2008, 13:52   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А какая целевая задача? Может ее решить можно по другому...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.05.2008, 13:57   #10
AidarBik
Форумчанин
 
Регистрация: 12.06.2007
Сообщений: 130
По умолчанию

Создать свой класс всплывающих подсказок
AidarBik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строки. Помогите переделать DeeCee Общие вопросы Delphi 9 25.12.2007 22:01
Как переделать формулу mik Microsoft Office Excel 1 27.10.2007 19:07
Помогите переделать Stanislav Общие вопросы Delphi 2 24.10.2007 16:14
Помогите переделать БД Antowka БД в Delphi 17 15.06.2007 21:35