生成したTImageの幅と高さを設定するには?

解決


デル太  2006-03-25 02:13:28  No: 20677

この掲示板でいろいろ教えていただてプログラムを進めることができています。ありがとうございます。
現在、TImageを動的に生成して、そこに線を引くことにトライしています。
次のようなことをしたいと考えています。

1)TImageを動的に生成し、配置する
2)動的に生成したTImageのサイズを例えば400,400に指定する
3)(0,0)-(200,200)に線を引く

ところが、(100,100)ぐらいまでしか線を引けません。
Width, Height を400,400にセットして、Stretch := True にすると、線がドット状の荒いものになってしまいます。
細い線を引きたいので、この方法はNGとわかりました。

ボーランドのサイトで調べてみると次のように書かれています。

=====
TImage の Width と Hight を変更してもサイズが変わらない 
--------------------------------------------------------------------------------
該当するバージョン:Delphi 1.0、Delphi 2.0 Delphi 3.0/Delphi 3.1, Delphi 4
 TImage コンポーネントを TPaintBox のように使用して描画を行っているのですが Width と Height の値を大きくしても,TPaintBox のようにサイズが変わらないのですがどうすればよいでしょうか? 

 基本的には TPaintBox を使用してください。TImage で行うには作成時に最大のサイズにしておき,必要なサイズに再指定して使用するような方法がありますが,最大のサイズが予想できない場合には適しません。

   Image1 := TImage.Create(Form1) ;
   with Image1 do begin
     Parent := Form1 ;
     Width := Form1.Width  ;
     Height := Form1.Height ;
     Canvas.MoveTo(0,0) ;
     Width := 200 ;
     Height := 200 ;
   end:

=====

作成時に大きなサイズにしておけば良さそうなので、やってみましたが、やはり変わらず(100,100)ぐらいしか線を引けません。
そこで、ソースを調べてみたところTImage.Createに次のコードがありました。

constructor TImage.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  ControlStyle := ControlStyle + [csReplicatable];
  FPicture := TPicture.Create;
  FPicture.OnChange := PictureChanged;
  FPicture.OnProgress := Progress;
  Height := 105;
  Width := 105;
end;

この中でHeightとWidthを指定しているので、これが初期値になっているようです。

この部分を回避して、下位クラスでのサイズ指定を有効にするには、どのようにすればよいでしょうか?
さらに上のTGraphicControl.Createを呼ぶ方法とか、あるのかもしれませんが、その場合もTImageのCreateコンストラクタのコードをどうするか?など疑問ばかりです。
どうぞ、適切な方向性をご指導ください。


デル太  2006-03-25 03:19:57  No: 20678

自力で解決できました!

TImage.Picture.Bitmap.Widthを設定すればよいのですね。
お騒がせしてしまい、申し訳ありませんでした。

次の形でできました。ありがとうございました。
-----
//動的に生成したTImageのサイズを変更する20060324 by デル太  
//TImage.Widthだと、中身のTPictureのサイズがかわらない
//TPicture.Bitmap.Widthを変更する必要があった

//フォームに3つボタンを配置しています
//テスト用に1つボタンを作って削除したためButton2からになっています
//usesにExtCtrlsが必要です

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1: TForm1;
  MyImage: TImage;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
  MyImage := TImage.Create(Form1);
  MyImage.Transparent := True;
  MyImage.Parent := Form1;
  MyImage.Width := 200;
  MyImage.Height := 200;
  MyImage.Canvas.Brush.Color := clWhite;
  MyImage.Canvas.FillRect(ClientRect);
  MyImage.Canvas.LineTo(200,200);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  MyImage.Width := 400;
  MyImage.Height := 400;
  MyImage.Canvas.Brush.Color := clWhite;
  MyImage.Canvas.FillRect(ClientRect);
  MyImage.Canvas.MoveTo(0,0);
  MyImage.Canvas.LineTo(200,400);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  MyImage.Picture.Bitmap.Width := 400;
  MyImage.Picture.Bitmap.Height := 400;
  MyImage.Canvas.Brush.Color := clWhite;
  MyImage.Canvas.FillRect(ClientRect);
  MyImage.Canvas.MoveTo(0,0);
  MyImage.Canvas.LineTo(400,200);
end;

end.


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

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






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