掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
Image1の上にコントロールをクリエートしたい (ID:21361)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>サンデープログラマー 2006/05/06(土) 10:21:05 >②selfを具体的に「Form1」にしたら通りました。 Self は そのままで、OKです。 Form1のメソッドのつもりなのに、明示的にForm1と書かないと、 動かないようでしたら、そのように想定して書いたわけではない限り、 どこかおかしくなっています。 >procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); OnMouseMoveハンドラは、アサインされた数だけ書く必要はありません。 Sender を使って、どのオブジェクトからこのハンドラが呼び出されたのかは、特定できます。 procedure TForm1.Shape1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var shape: TShape; begin shape:=Sender as TShape; //Tshapeじゃなければここで例外が発生します shape.Left:= 0; end; >配列 配列は管理が大変なので、おすすめしません。 TListがあるので、TListを使ったほうが良いと思います。 ですが、TListを使うまでもありません。(TListを使うのは効率を追求する場合や TList自体を継承して機能を拡張する場合などにおすすめします) TShapeはTCompoment,TControlから派生しているので、VCLの機構をつかって 自動的に親に格納されています。 TComponentは、OwnerのComponentsプロパティに自動的に格納されます。 Ownerとは、 TShape.Create(Self); とした場合、 Selfが TShape の Ownerです。 Selfが Form1 なら、 Onwer は Form1 となります。 TShapeは、Form1.Components[]に入っています。 (TShape.Create(nil) としない限り、TShapeをComponentsプロパティで参照できます。) 他に、TControlは、TWinControlのControlsプロパティに自動的に格納されます。 TShape.Parent:= Panel1; ならば TShape は、Panel1.Controls[]に入っています。 実際にComponentsを使ってアクセスする場合、 Form1のハンドラなら、Form1.識別子は省略できるので以下のようになります。 ただし、Componentsには、TShape以外のものも含まれているので、その点注意が 必要です。(オーバーヘッドとか気にしないのなら、この方法で通常問題ありません) for i:=0 to Components.Count-1 do begin if Components[i] is TShape then begin shape:= TShape(Components[i]); shape.Left:= 0; end; end; Controls[]も同様です。 (物によりますが、ControlsのほうがComponentsより数が少ないはずなので 微妙に効率はよいでしょう。) 詳細なComponentsとControlsの違いはヘルプを参照してください (書くと長くなるし、私の言いたい事もヘルプと一緒です)
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.