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

Вниз

Передача параметров.   Найти похожие ветки 

 
Познающий глубины   (2006-02-27 15:46) [0]

Чем отличается и какой метод лучше использовать при передаче параметров.

type
 pImage = ^TImage;
...
procedure TForm1.Proc(a: PImage);

или

procedure TForm1.Proc(a: TBitMap);


 
Сергей М. ©   (2006-02-27 15:49) [1]

С т.з. комплексной производительности - второй

С других т.з. это зависит от того что творится в теле Proc()


 
Познающий глубины   (2006-02-27 15:54) [2]

В теле Proc() идут основательные вычесления с использованием канваса переданого изображения.


 
Alkid ©   (2006-02-27 15:55) [3]

Не вник в конструкцию pImage = ^TImage.
TImage - это ссылочный тип и передача в процедуру переменной типа
TImage есть передача ссылки (сиречь указателя) на объект. А так получается
указатель на указатель.


 
Познающий глубины   (2006-02-27 16:12) [4]

А можете мне объяснить, почему такой код работает (на имадже отображается результат)

type
pImage = ^TImage;
...
Differ1(@image1, @image2, @image4)
...
procedure TForm1.Differ1(Source1, Source2, Dest: PImage);
var
 i, j: integer;
begin
...
 Dest^.Canvas.Pixels[i, j] := abs(Source2^.Canvas.Pixels[i, j] - Source1^.Canvas.Pixels[i, j]);
...
end;


А вот такой - нет.

...
Differ(image1.Picture.Bitmap, image2.Picture.Bitmap, image4.Picture.Bitmap);
...
procedure TForm1.Differ(Source1, Source2, Dest: TBitMap; DifferDouble: boolean=False);
begin
...
 Dest.Canvas.Pixels[i, j] := abs(Source2.Canvas.Pixels[i, j] - Source1.Canvas.Pixels[i, j]);
...
end;


 
Alkid ©   (2006-02-27 16:16) [5]

В первом случае ты пишешь Dest^.
Dest имеет тип ^TImage => Выражение Dest^ тебе даёт значение типа TImage, на которое указывает Dest, что тебе и надо. То есть конструкция Dest^.canvas правильна. Иначе не правильно.

Вообще, тебе не нужно делать тип PImage = ^TImage. Ты тут делаешь масло маслянное.

Конструкция:

procedure xxx(x : TImage)
begin
 x.canvas
end;

Более правильна, чем

procedure xxx(x : PImage)
begin
 x^.canvas
end;


 
wicked ©   (2006-02-27 16:19) [6]

> Познающий глубины   (27.02.06 16:12) [4]

> А можете мне объяснить, почему такой код работает (на имадже
> отображается результат)
> поскипано
> А вот такой - нет.
> поскипано

а они не эквивалентные.... неизвестно еще, что в imageX у тебя лежит....


 
Познающий глубины   (2006-02-27 16:28) [7]

Я не понимаю почему вторая процедура не работает. Что BitMap не передается или что????
Дальше по коду я использую такие варианты, которые прекрасно функцианируют.

...
   Binary(image1.Picture.Bitmap);
...

procedure TForm1.Binary(BMP: TBitMap);
var
 i, j, g: integer;
begin
 g := round((maxcolor(BMP) - mincolor(BMP)) / 2);
...
     if getrvalue(BMP.Canvas.Pixels[i, j]) >= g then
       BMP.Canvas.Pixels[i, j] := clWhite
     else
       BMP.Canvas.Pixels[i, j] := clBlack;
...
end;

И глядя на это я не могу понять ПОЧЕМУ принципиально такой же код не работает.


 
Сергей М. ©   (2006-02-27 16:31) [8]

Тебе накой ляд передавать ссылку на ссылку (как в случае с PImage)? Объясни ..


 
Познающий глубины   (2006-02-27 16:34) [9]

Да мне собственно и не надо. Я же ведь спрашиваю, почему битмап не передается. Я и хочу избавится от передачи указателя.


 
umbra ©   (2006-02-27 17:00) [10]

что значит "не работает"? какая ошибка выдается?


 
icWasya ©   (2006-02-27 17:04) [11]

Тут надо чётко представлять, что Image1.Picture.Bitmap.Canvas и Image1.Canvas - это не совсем одно и то же. Хотя Борланд это тщательно скрывает. То есть пусть в начале работы  Image1.Picture.Bitmap = Nil. Но если выполнить такой код Image1.Canvas.Pixels[0,0]:=clWhite или любую другую манипуляцию с Image1.Canvas, то создастся TBitmap с размерами TImage, присвоится Image.Picture, и с этих пор Image1.Picture.Bitmap.Canvas и Image1.Canvas - это одно и то же. Что и вызывает массу вопросов у неопытных юзеров.


 
Познающий глубины   (2006-02-27 18:07) [12]

icWasya ©   (27.02.06 17:04) [11]
Спасибо. Действительно, я и сам примерно к такому же выводу пришел. Но теперь-то все ясно. Еще раз спасибо за обстоятельный ответ.



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

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

Наверх




Память: 0.49 MB
Время: 0.047 c
2-1141566700
ctudent
2006-03-05 16:51
2006.03.19
Помогите разобраться с ошибкой!


9-1126532168
Signate
2005-09-12 17:36
2006.03.19
Игровой цикл


3-1138095220
dtm
2006-01-24 12:33
2006.03.19
Кодировка поля таблицы типа "text" - can not transliterate


15-1140776613
ArtemESC
2006-02-24 13:23
2006.03.19
Вправе ли я давать ссылку со своего сайта...


2-1141533960
Nsk3d
2006-03-05 07:46
2006.03.19
выделение всего