![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача параметров. [D7, WinXP]
Познающий глубины © (2006-02-27 15:46:00)Чем отличается и какой метод лучше использовать при передаче параметров.
type
pImage = ^TImage;
...
procedure TForm1.Proc(a: PImage);
или
procedure TForm1.Proc(a: TBitMap);
Познающий глубины (2006-02-27 18:07:00) [1]icWasya © (27.02.06 17:04) [11]
Спасибо. Действительно, я и сам примерно к такому же выводу пришел. Но теперь-то все ясно. Еще раз спасибо за обстоятельный ответ.
icWasya (2006-02-27 17:04:00) [2]Тут надо чётко представлять, что 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 - это одно и то же. Что и вызывает массу вопросов у неопытных юзеров.
umbra (2006-02-27 17:00:00) [3]что значит "не работает"? какая ошибка выдается?
Познающий глубины (2006-02-27 16:34:00) [4]Да мне собственно и не надо. Я же ведь спрашиваю, почему битмап не передается. Я и хочу избавится от передачи указателя.
Сергей М. (2006-02-27 16:31:00) [5]Тебе накой ляд передавать ссылку на ссылку(как в случае с PImage)? Объясни ..
Познающий глубины (2006-02-27 16:28:00) [6]Я не понимаю почему вторая процедура не работает. Что 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;
И глядя на это я не могу понять ПОЧЕМУ принципиально такой же код не работает.
wicked (2006-02-27 16:19:00) [7]> Познающий глубины (27.02.06 16:12) [4]
> А можете мне объяснить, почему такой код работает (на имадже
> отображается результат)
> поскипано
> А вот такой - нет.
> поскипано
а они не эквивалентные.... неизвестно еще, что в imageX у тебя лежит....
Alkid (2006-02-27 16:16:00) [8]В первом случае ты пишешь 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;
Познающий глубины (2006-02-27 16:12:00) [9]А можете мне объяснить, почему такой код работает (на имадже отображается результат)
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 15:55:00) [10]Не вник в конструкцию pImage = ^TImage.
TImage - это ссылочный тип и передача в процедуру переменной типа
TImage есть передача ссылки (сиречь указателя) на объект. А так получается
указатель на указатель.
Познающий глубины (2006-02-27 15:54:00) [11]В теле Proc() идут основательные вычесления с использованием канваса переданого изображения.
Сергей М. (2006-02-27 15:49:00) [12]С т.з. комплексной производительности - второй
С других т.з. это зависит от того что творится в теле Proc()