「もにゃ様」ご提供のTScrollBMPBoxについて質問

解決


武田  2006-08-21 05:39:51  No: 22940

いつもお世話になっています。
前回の水平、垂直線のカーソル移動についての質問で「もにゃ様」のTScrollBMPBoxをご提供いただき試用させていただいております。
一つ質問させていただきたいのですが、
たとえば水平線のカーソルのポジションは取得できますが、画像のその絶対位置に分割するラインを引きたいのですが
スクロールしているとき、カーソルのX,Yはあくまでそのときの画面の座標ですから、画像の絶対位置とは異なるのは解りますが、
下記のようにコンポーネントに追加してやってみたのですが、画像の絶対ポジションを得る方法はどのようにするのか教えていただけないでしょうか。

procedure TScrollBMPBox.MouseDown(Button: TMouseButton; Shift: TShiftState;  X, Y: Integer);
  //-----------------------------------------------------追加  
  if Form2.Tag=1 then//水平線のカーソル時のフラグ
  begin
    bufferBMP.Canvas.MoveTo(0,  aBufMouseDownPos.Y);
    fBMP.Canvas.MoveTo(0,  aBufMouseDownPos.Y);
    bufferBMP.Canvas.LineTo(fBMP.Width , aBufMouseDownPos.Y );
    fBMP.Canvas.LineTo(fBMP.Width , aBufMouseDownPos.Y );
  //------------------------------------------------------
  end;
よろしくお願いいたします。


もにゃ  2006-08-21 07:35:46  No: 22941

ソースを見ていただければ分かると思いますが、BMPLeft,BMPTopが表示部分の左上座標です。
従って以下のようになります。

unit hScrollBMPBox;
  public
    property OnMouseMove; //追加

unit Unit1;
  private
    procedure ScrollBMPBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); //追加

procedure TForm1.FormCreate(Sender: TObject);
  ScrollBMPBox.OnMouseMove:= ScrollBMPBoxMouseMove; //追加

procedure TForm1.ScrollBMPBoxMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  caption:= 'X:' + inttostr(x + ScrollBMPBox.BMPLeft) +
           ' Y:' + inttostr(y + ScrollBMPBox.BMPTop);
end;


武田  2006-08-21 21:53:00  No: 22942

もにゃ様早速のご指導ありがとうございます。
まだまだ、熟練者の作成されたコンポーネントをいじくり回す能力もなければ、まして解析する能力もないため、最初はImageを貼り付けてみたり、「あれっ・・・」Imageがなくてもなぜ表示するんだろう??という状態です。
さて、小生の場合property OnMouseMove; //追加をunit hScrollBMPBoxへ追加、Form1はファイル選択にしていて、画像はForm2に実装しているので、
procedure ScrollBMPBoxMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer); //追加と実行部をForm2に
ScrollBMPBox.OnMouseMove:= ScrollBMPBoxMouseMove; //追加をForm2に実装しました。
エラーは出ませんが画像Form2のタイトルバーに表示するはずですが、しません。
property OnMouseMove;で宣言した実行部は書かなくてもいいのでしょうか。
レベルの低い質問ですみません。よろしくお願いいたします。


もにゃ  2006-08-22 00:10:44  No: 22943

駒大苫小牧負けちゃった... orz

>property OnMouseMove;で宣言した実行部は書かなくてもいいのでしょうか。
はい、これは単にForm1からOnMouseMoveイベントを使えるようにするだけのものです、実態は継承前のTControlで実装されています。

ビットマップ専用スクロールボックス(おまけ機能付き)
http://hp.vector.co.jp/authors/VA015390/delphi/ScrollBMPBox002.zip


武田  2006-08-22 00:43:09  No: 22944

もにゃ様ありがとうございます。
了解しました。
これから、少しずつコンポーネントの解読とコンポーネントという概念を理解できるようにしていきます。
どうして、あれだけのことで(失礼m(_ _)m)あんなことができるのか狐につままれたような気がしています。
ありがとうございました。


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

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






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