こんにちは。お世話になります。
表題の件ですが、例えば親フォームにあるボタンをクリックした時に、
子フォームをボタンのすぐ上に表示したりはできますか?
親フォームが画面のどこにあっても、ボタンを押した時には
すぐ上に表示したいのですが、そういった操作はWin32APIで
Controlすることになるでしょうか?
すみませんが、要領がわらかないので、サンプル的なコードを
教えていただけると幸いです。
よろしくお願い致します。
どのくらいかな?
親フォームが画面の一番上の位置にあったら?
簡易コードですが以下でどうでしょうか??
Form1側
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
form2.Show;
end;
form2側
implementation
uses Unit1;
{$R *.DFM}
procedure TForm2.FormActivate(Sender: TObject);
begin
if form1.Top < 10 then
exit
else
form2.Top := form1.Top - 20;
end;
Form2側はOnActivateに書き込みます。
細かい数値はそちら側でも念の為試して下さい。
とりあえずこちら側では問題なく動きました^^。
//子フォームを動的に生成して表示したいならこんな感じ
procedure TForm1.Button1Click(Sender: TObject);
var
frm2 :TForm2;
Pt :TPoint;
Btn :TButton;
begin
Btn :=Sender as TButton;
frm2 :=TForm2.Create(Self);
try
Pt :=ClientToScreen(Point(Btn.Left, Btn.Top));
frm2.Left :=Pt.X;
frm2.Top :=Pt.Y - frm2.Height;
frm2.ShowModal;
finally
FreeAndNil(frm2);
end;
end;
ボタンがスクリーンの上のほうの場合の位置は、
ご自分で調整お願いしますよ。
自分のはバグバグでしたね^^;
訂正すいません!^^;
アクティブなる度に、フォーム2が動きまわります(笑)。
フォームも少ししか上に出来ないし^^;
またバグあったらごめんなさい;
フォーム1
var
Form1: TForm1;
sw:boolean=false;
implementation
uses Unit2;
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
sw:=true;
form2.Show;
end;
フォーム2 OnActivate部分
procedure TForm2.FormActivate(Sender: TObject);
begin
if sw then begin
form2.Top := form1.Top - 40;
if form2.Top < 0 then
form2.Top := 0;
end;
sw := false;
end;
で、取りあえず何とか^^;
ばりばりの初心者コードですが、
もし使って下さる奇特な方がいましたら是非^^;。
レスくれた皆さん、ありがとうございました。
ClientToScreenでうまくいきそうです。
Delphi大好きさんも、レスありがとうです。
参考になりました^^
解決です!
ツイート | ![]() |