環境 Windows XP D6 personalです。
Pagecontrolにタブを新規作成すると同時にToolBarを
動的に貼り付けて
ToolBarにボタンなど貼り付けようとしていますが、
意図した順番通りになりません。
下記の場合、Edit→Combobox→Button→UpDownの順になります。
解決方法を教えて頂けませんか。
ToolBar5:=TToolBar.Create(PageControl1);
ToolBar5.Parent:=PageControl1;
ToolBar5.Align:=albottom;
ToolBar5.Height:=24;
FontName:=TComboBox.Create(ToolBar5);
FontName.Parent:=ToolBar5;
FontName.Top:= 0;FontName.Left:= 0;FontName.Width:= 100;
FontSize:=TEdit.Create(ToolBar5);
FontSize.Parent:=ToolBar5;
FontSize.Left:=101;FontSize.Top:=0;FontSize.Width:= 20;
UpDown1:=TUpDown.Create(ToolBar5);
UpDown1.Parent:= ToolBar5;
UpDown1.Left:=121;UpDown1.Top:=0;UpDown1.Width:= 15;
BoldButton:=TToolButton.Create(ToolBar5);
BoldButton.Parent:= ToolBar5;
BoldButton.Left:=136;BoldButton.Top:=0;BoldButton.Width:= 23;BoldButton.Height:=22;
取り敢えずこれでエラーなしでコンパイル可能。
Windows Vista + Delphi7
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ToolWin;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
ToolBar5: TToolBar;
ComboBox1: TComboBox;
Edit1: TEdit;
UpDown1: TUpDown;
BoldButton: TToolButton;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ToolBar5:=TToolBar.Create(PageControl1);
ToolBar5.Parent:=PageControl1;
ToolBar5.Align:=albottom;
ToolBar5.Height:=24;
ComboBox1 :=TComboBox.Create(ToolBar5);
ComboBox1.Parent:=ToolBar5;
ComboBox1.Top:= 0;
ComboBox1.Left:= 0;
ComboBox1.Width:= 100;
Edit1 :=TEdit.Create(ToolBar5);
Edit1.Parent:=ToolBar5;
Edit1.Left:=101;
Edit1.Top:=0;
Edit1.Width:= 20;
UpDown1:=TUpDown.Create(ToolBar5);
UpDown1.Parent:= ToolBar5;
UpDown1.Left:=121;UpDown1.Top:=0;UpDown1.Width:= 15;
BoldButton:=TToolButton.Create(ToolBar5);
BoldButton.Parent:= ToolBar5;
BoldButton.Left:=136;
BoldButton.Top:=0;BoldButton.Width:= 23;BoldButton.Height:=22;
end;
end.
申し訳ない。ちょっと勘違いをしていました。
描きたい順番に、Leftを前項のアイテムの(Width)にプラスしても駄目かな。..
ToolBarの0,0を基点に絶対値を順番に指定するとか。
コレじゃない。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ToolWin;
type
TForm1 = class(TForm)
PageControl1: TPageControl;
procedure FormCreate(Sender: TObject);
private
{ Private 宣言 }
ToolBar5: TToolBar;
ComboBox1: TComboBox;
Edit1: TEdit;
UpDown1: TUpDown;
BoldButton: TToolButton;
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
ToolBar5:=TToolBar.Create(PageControl1);
ToolBar5.Parent:=PageControl1;
ToolBar5.Align:=albottom;
ToolBar5.Height:=24;
ComboBox1 := TComboBox.Create(ToolBar5);
ComboBox1 := TComboBox.Create(Self);
ComboBox1.Parent := ToolBar5;
ComboBox1.Top := ToolBar5.Top;
ComboBox1.Left := ToolBar5.Left;
ComboBox1.Width := 100;
Edit1 := TEdit.Create(ToolBar5);
Edit1.Parent := ToolBar5;
Edit1.Left := ComboBox1.Left + ComboBox1.Width + 1;
Edit1.Top := 0;
Edit1.Width := 20;
UpDown1 := TUpDown.Create(ToolBar5);
UpDown1.Parent := ToolBar5;
UpDown1.Top := 0;
UpDown1.Width := 15;
UpDown1.Left := Edit1.Left + Edit1.Width + 1;
BoldButton := TToolButton.Create(ToolBar5);
BoldButton.Parent := ToolBar5;
BoldButton.Width := 23;
BoldButton.Left := UpDown1.Left + UpDown1.Width + 1;
BoldButton.Top := 0;
BoldButton.Height := 22;
end;
end.
> ComboBox1 := TComboBox.Create(Self);
の行は不要だと思われ。
ご存じのように、ツールバーに置いたコンポーネントはx座標の順に自動的に並べ替えられます。
問題は、動的に挿入したコンポーネントが必ずしも後ろに追加されるとは限らないこと。
ステップ実行してみるとわかりますが、2番目のEditを作ってToolBarに入れた時点で
Editが先頭に挿入され、ComboBoxが右にずらされます。
かつEditの初期幅が120なので、ComboBoxのLeftは120に変更されます。
その後でEdit1.Leftを100にしても、ComboBoxよりx座標が小さいので
そのまま順番が保たれて結局Editの方が左(Edit.Left=0)になってしまうわけです。
というわけなので、絶対値を指定するのではなく
常に直前のコンポーネントの Left(実際の値)+Width を指定して、
必ず最後尾に移動されるようにすればいいですね。
ついでですがWidthもToolBarに入れる前に変更しておいた方が確実でしょう。
初歩的なことでお恥ずかしいですが。
初心者さん、コレさん、tttさん、よく理解できました。
おかげさまで解決しました。
有り難うございました。
ツイート | ![]() |