以下の例でBmpCompositeはTBitmapを値渡しで処理していますがsrcは変数パラメータにし
ないと呼び出し元で役に立たないと思うのですが、実際にはうまくいきます(笑)。
これはなぜでしょう?
procedure BmpComposite(src,back: TBitmap; X,Y: Integer);
var
bmp : TBitmap;
begin
Bmp := TBitmap.Create;
try
Bmp.PixelFormat := pf24bit;
Bmp.Width := Screen.Width; Bmp.Height := Screen.Height;
Bmp.Canvas.CopyRect( Rect(X,Y,src.Width+X,src.Height+Y),
src.Canvas,
src.Canvas.ClipRect );
src.Assign(Bmp);
finally
Bmp.Free;
end;
end;
procedure TForm1.PreviewFile;
var
BMP : TBitmap;
w,h,x,y : Integer;
begin
begin
try
BMP := TBitmap.Create;
BMP.PixelFormat := pf24bit;
BMP.Assign(FmainBmp); //FmainBmp は private
if BcBmp.Width > 0 then
begin
w := BMP.Width; h := BMP.Height;
x := 0; y := 0;
GetFormRatio(w, h, x, y); //x, y等を求める。これは4つとも変数パラメータ
BmpComposite(BMP,FBcBmp,x,y); //FBcBmp は private
//値渡しなのでBMPはFmainBmpのままと思われるが
end;
Image1.Canvas.Draw(x,y,BMP); //実際にはBmpCompositeの効果が現れている
以下略
クラスは、ポインタ
SizeOf(TBitmap) = 4
レコード型のように実体を渡しているのでない。
値渡しだろうが、参照渡しだろうが、どちらも実体を指すポインタなので
正しく動作します。
> クラスは、ポインタ
ああ、そうなんですね!
それでいて普通はあまりポインタを意識しないですむから、クラス型って
便利ですね。
ツイート | ![]() |