喫茶XRAYトップページ

[スレッド全体
]

[13084] Re:コントロールのClickメソッド返信 削除
2019/10/10 (木) 13:30:42 Mr.XRAY
これは,実際には次のような質問内容です.
実証可能な具体的なサンプル形式として提示されているわけではないので,
EscapeControl が具体的に何を指しているのかは不明です.
※ 丸囲み数字は () に変更しています.

拙作の「TplButton」を使用しているが,(1) の部分で以下のエラーとなる

> E2362 プロテクトシンボル TplButton.Click にアクセスできません

    FEscapeControl: TWinControl;

TButton(FEscapeControl).Click;

TplButton(FEscapeControl).Click; // (1)

どちらもキャストに問題がありますな.


[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