喫茶XRAYトップページ

[スレッド全体
]

[13085] Re2:コントロールのClickメソッド返信 削除
2019/10/10 (木) 17:37:02 Mr.XRAY
> これは,実際には次のような質問内容です.

たまたまポインタ関係の記事を書いたもんですから思い出して・・・
型キャストは「型変換」ではないです
例えは以下のコードは,このままではエラーにはなりません.
しかし,こういうことは実際にはできません.

procedure TForm1.Button1Click(Sender: TObject);
var
  LBitmap  : TBitmap;
begin
  LBitmap := TBitmap.Create;
  try
    LBitmap := TBitmap(Button1);
    Image1.Canvas.Draw(0, 0, LBitmap);
  finally
    FreeAndNil(LBitmap);
  end;
end;

エラーが発生しない上のコードのままでも問題があります.
LBitmap が使用するメモリのサイズ (バイト数) が Button1 が使用するバイト数より多い場合,
メモリを解放してしまっていますから,そこに何かのデータがあったかも知れません.
興味があれば LBitmap のプロパティやメソッドを実行してみてください.

以下もエラーが発生しないコードですが,問題ありの例です.

http://mrxray.on.coocan.jp/Delphi/Others/ArrayRangeCheck.htm#list5


[13086] Re3:コントロールのClickメソッド返信 削除
2019/10/10 (木) 20:53:32 Mr.XRAY
> 興味があれば LBitmap のプロパティやメソッドを実行してみてください.

当然ですが,このコードで Button1 をクリックすると,Button1 はなくなります.
 
  TMyClass(XXX);

というのは,XXX の持っているデータを TMyClass 型のデータにすることです.
これは,XXX という変数のデータが格納されているメモリの先頭アドレスからの
データを TMyClassのデータとして操作可能にすることです.
ということは,
XXX のメモリ上のデータは TMyClass の形式で格納されている必要があります.
ということは,Button1 が TButton のオブジェクトだとすると,

  TButton(Button1);

は正しいわけです.でも,こんなことわざわざしません.
しかし,型キャストが必要な場面があるわけです.
そういう場面に出会わなければ必要ありません.
 
ということです.ハイ.


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82