Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];

Вниз

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

 
Познающий глубины   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.014 c
3-1138541855
zzz2
2006-01-29 16:37
2006.03.19
Как задать значения в полях DBGrid по умолчанию?


2-1141047541
zx_
2006-02-27 16:39
2006.03.19
CD диск


2-1141375218
Creative
2006-03-03 11:40
2006.03.19
Как увидеть из одного юнита класс, описанный во втором


3-1138033188
HabarovSergey
2006-01-23 19:19
2006.03.19
не понятно назначение функций sp_getapplock/sp_releaseapplock ?


4-1135703481
oleggar
2005-12-27 20:11
2006.03.19
PID of process





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский