喫茶XRAYトップページ


[13045] コントロールのClickメソッド返信 削除
2019/9/3 (火) 21:17:07 Mr.XRAY
コントロールの Click メソッドは protected 部にあります.したがって,
以下のコードは 次のエラーが発生してコンパイルできません.
もちろん入力支援のリストに Click は表示されません.
http://mrxray.on.coocan.jp/Delphi/Others/A_IDETechnique.htm#05

[dcc32 エラー] Unit1.pas(33): E2362 プロテクトシンボル TControl.Click にアクセスできません

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.Click;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
  ShowMessage('Clicked ');
end;

※ Click メソッドは,コントロールをクリックした時に自動的に実行されます.


Click はない

[13046] コントロールのClickメソッド-メッセージ送信返信 削除
2019/9/3 (火) 21:19:12 Mr.XRAY
Click メソッドと同じ動作を実現するためによく使用されるのが
メッセージの送信です.

参考記事
[ コードでボタンクリックのイベントを発生させる ]
http://mrxray.on.coocan.jp/Delphi/Others/A_UltraIntro01.htm#14

procedure TForm1.Button1Click(Sender: TObject);
begin
  SendMessage(Panel1.Handle, WM_LBUTTONDOWN, 0, 0);
  SendMessage(Panel1.Handle, WM_LBUTTONUP, 0, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Panel1.Perform(WM_LBUTTONDOWN, 0, 0);
  Panel1.Perform(WM_LBUTTONUP, 0, 0);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // TPanel は Button コントロールではないので BM_CLICK は動作しない
  SendMessage(Panel1.Handle, BM_CLICK, 0, 0);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  // Panel1Click のコードを実行
  // 本当の意味でのクリック動作ではない
  Panel1Click(nil);
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
  ShowMessage('Clicked ');
end;


[13047] コントロールのClickメソッド-protected部返信 削除
2019/9/3 (火) 21:21:08 Mr.XRAY
protected 部のメンバーにアクセスするには,
対象のコントロールの継承クラスを定義します.

implementation

{$R *.dfm}

type
  TMyPanel = class(TPanel);

procedure TForm1.Button1Click(Sender: TObject);
begin
  TMyPanel(Panel1).Click;
end;

procedure TForm1.Panel1Click(Sender: TObject);
begin
  ShowMessage('Clicked ');
end;


[13051] 放置物件?返信 削除
2019/9/12 (木) 22:07:31 Mr.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