動的に作成したToolBarにEditやButtonを貼り付けるには。

解決


武田  2009-01-12 04:40:36  No: 33099

環境  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;


初心者  2009-01-12 05:13:25  No: 33100

取り敢えずこれでエラーなしでコンパイル可能。
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.


初心者  2009-01-12 05:23:06  No: 33101

申し訳ない。ちょっと勘違いをしていました。

描きたい順番に、Leftを前項のアイテムの(Width)にプラスしても駄目かな。..

ToolBarの0,0を基点に絶対値を順番に指定するとか。


コレ  2009-01-12 05:39:54  No: 33102

コレじゃない。

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.


コレを訂正  2009-01-12 05:50:12  No: 33103

>   ComboBox1          := TComboBox.Create(Self);
の行は不要だと思われ。


ttt  2009-01-12 05:51:37  No: 33104

ご存じのように、ツールバーに置いたコンポーネントはx座標の順に自動的に並べ替えられます。
問題は、動的に挿入したコンポーネントが必ずしも後ろに追加されるとは限らないこと。

ステップ実行してみるとわかりますが、2番目のEditを作ってToolBarに入れた時点で
Editが先頭に挿入され、ComboBoxが右にずらされます。
かつEditの初期幅が120なので、ComboBoxのLeftは120に変更されます。
その後でEdit1.Leftを100にしても、ComboBoxよりx座標が小さいので
そのまま順番が保たれて結局Editの方が左(Edit.Left=0)になってしまうわけです。

というわけなので、絶対値を指定するのではなく
常に直前のコンポーネントの Left(実際の値)+Width を指定して、
必ず最後尾に移動されるようにすればいいですね。
ついでですがWidthもToolBarに入れる前に変更しておいた方が確実でしょう。


武田  2009-01-12 08:48:35  No: 33105

初歩的なことでお恥ずかしいですが。
初心者さん、コレさん、tttさん、よく理解できました。
おかげさまで解決しました。
有り難うございました。


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

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






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