2011-03-27 8 views
0

Form1とForm2の2つのフォームがあります 私はForm2.towを呼び出すonclickイベントであるForm1にTLabelを持っています。Delphi - TLabelの場所にウィンドウを開く

私がやりたいことは、私がどのようにしてform2を作ることができるかを調べるには、ラベルの下に5pxのラベルを表示します:) Form2は小さく、いくつかのオプションを示しています。

私はマウスの位置を使用することはできますが、それほど十分ではありません。

私は

// Set top - add 20 for the title bar of software 
Form2.Top := Form1.Top + Label1.Top + Label1.Height + 20; 
// Set the Left 
Form2.Left := Form1.Left + Label1.Left + round(Label1.Width/2) - round(form2.Width/2); 

のようなものを考えていたが、私はあなたが本当にForm2のフォームする必要がありますか良い方法

+0

なぜ20ですか?私はあなたが15を加えるべきだと思います。それとも30歳ですか?すなわち、定数は良くない! –

+0

@Cosmind:彼の質問のポイントだと思います。 –

答えて

1

ClientOriginプロパティは、スクリーン座標でルベルの左上隅を返しますので、あなたがする必要はありません手動で決定する:

var 
    Pt: TPoint; 
begin 
    Pt := Label1.ClientOrigin; 
    Form2.Left := Pt.X + Round(Label1.Width/2) - Round(Form2.Width/2); 
    Form2.Top := Pt.Y + Label1.Height + 5; 
end; 
2

があることができると思いますか? Form2ロジックを含むフレームを作成し、親として非表示のTPanelを使用することもできます。ユーザーがLabel1をクリックすると、パネルが表示されます。

次のようなものです。あなたは、Form1を作成するかのLabel1をクリックするとすると(必要に応じて):Label1のためのOnClickイベントで

Frame := TFrame1.Create(Self); 
Frame.Parent := Panel1; 

ユーザーがちょうど行われ、再びパネルを非表示され
Panel1.Top := Label1.Top + 5; 
Panel1.Left := Label1.Left + round(Label1.Width/2) - round(form2.Width/2); 
Panel1.Visible := true; 

(と必要に応じてフレームを破壊する)。ユーザーがForm1を使用している間にフレームを有効にしておくと、フォームから離れるときにForm1を解放することを忘れないでください。

あなたはそれの親の座標系を使用してForm2の座標を設定する必要がHTH

+0

+1フレームはしばしば良い(間違った)解決策です。しかし、フォームを使用する場合もあります。 –

3

。 (あなたはタイトルバーの高さを補うためにしようとしているので)親がデスクトップであると仮定すると、これはそれを行うことができます。

procedure ShowForm; 
var P: TPoint; 
begin 
    // Get the top-left corner of the Label in *screen coordinates*. This automatically compensates 
    // for whatever height the non-client area of the window has. 
    P := Label1.ScreenToClient(Label1.BoundsRect.TopLeft); 
    // Assign the coordinates of Form2 based on the translated coordinates (P) 
    Form2.Top := P.Y + 5; // You said you want it 5 pixels lower 
    Form2.Left := P.X + 5 + (Label1.Width div 2); // Use div since you don't care about the fractional part of the division 
end; 

あなたは上のベースのForm2の位置決めのためのコードを適応させる必要がありますあなたの中心となる要件、私はあなたが望むものをかなり理解していませんでした。もちろん、フレームやパネルで十分であれば、より良いことです! Guillemのソリューションをよく見てみましょう。

3
procedure TForm2.AdjustPosition(ARefControl: TControl); 
var 
    LRefTopLeft: TPoint; 
begin 
    LRefTopLeft := ARefControl.ScreenToClient(ARefControl.BoundsRect.TopLeft); 

    Self.Top := LRefTopLeft.Y + ARefControl.Height + 5; 
    Self.Left := LRefTopLeft.X + ((ARefControl.Width - Self.Width) div 2); 
end; 

その後、あなたは次のようにフォームが任意の所望の制御に比べて自分自身を調整することができます:

Form2.AdjustPosition(Form1.Label1); 
+0

+1クリーンコードです。参照と対象を渡すことで、どのようなコントロールでも動作させることができますか? AdjustPosition(aForm:TForm、ARefControl:TControl);彼はForm3も持っている – Najem

関連する問題