TBitmapと変数パラメータ

解決


プレアデス3世  2009-03-18 14:37:31  No: 33687

以下の例で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の効果が現れている
以下略


ofZ  2009-03-18 17:36:53  No: 33688

クラスは、ポインタ
SizeOf(TBitmap) = 4
レコード型のように実体を渡しているのでない。

値渡しだろうが、参照渡しだろうが、どちらも実体を指すポインタなので
正しく動作します。


プレアデス3世  2009-03-18 18:04:59  No: 33689

> クラスは、ポインタ
  ああ、そうなんですね!
  それでいて普通はあまりポインタを意識しないですむから、クラス型って
便利ですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加