Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача параметров. [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()


Наверх

Титульная страница Поиск, карта сайта Написать письмо