2016-09-01 3 views
2

コードからTGridPanelでフォームを作成しようとしています。コードからTGridPanelに追加するときに、2つのパーセンテージ行の間に絶対行を入れる方法はありますか?

は含ま:

  • (50%に設定されている)上部のメモ(24個の画素に設定されている)中心に
  • ナビゲータ下部に
  • グリッド

    uses 
        Winapi.Messages, Winapi.Windows, System.Classes, System.SysUtils, 
        System.UITypes, System.Variants, Vcl.Controls, Vcl.DBCtrls, Vcl.DBGrids, 
        Vcl.Dialogs, Vcl.ExtCtrls, Vcl.Forms, Vcl.Graphics, Vcl.Grids, Vcl.StdCtrls, 
        Data.DB; 
    
    procedure Test; 
    var 
        View: TForm; 
        GridPanel: TGridPanel; 
        Grid: TDBGrid; 
        DataSource: TDataSource; 
        Navigator: TDBNavigator; 
        Memo: TMemo; 
    begin 
        View := TForm.Create(Application); 
        try 
        View.Name := 'Form2'; 
        // SystemFont(View.Font); 
        View.Width := 640; 
        View.Height := 480; 
        View.Position := TPosition.poOwnerFormCenter; 
        GridPanel := TGridPanel.Create(View); 
        GridPanel.Name := 'GridPanel'; 
        GridPanel.Caption := ''; 
        GridPanel.BevelOuter := TBevelCut.bvNone; 
        GridPanel.FullRepaint := False; 
        GridPanel.Parent := View; 
        GridPanel.Align := TAlign.alClient; 
    
        GridPanel.ColumnCollection.BeginUpdate; 
        GridPanel.ColumnCollection.Delete(1); 
        GridPanel.ColumnCollection[0].Value := 100; 
        GridPanel.ColumnCollection.EndUpdate; 
        GridPanel.RowCollection.BeginUpdate; 
        GridPanel.RowCollection.Add; 
        TCellItem(GridPanel.RowCollection[0]).Value := 50; 
        TCellItem(GridPanel.RowCollection[0]).SizeStyle := TSizeStyle.ssPercent; 
        TCellItem(GridPanel.RowCollection[1]).Value := 24; 
        TCellItem(GridPanel.RowCollection[1]).SizeStyle := TSizeStyle.ssAbsolute; 
        TCellItem(GridPanel.RowCollection[2]).Value := 50; 
        TCellItem(GridPanel.RowCollection[2]).SizeStyle := TSizeStyle.ssPercent; 
        GridPanel.RowCollection.EndUpdate; 
    
        Memo := TMemo.Create(View); 
        Memo.Name := 'Memo'; 
        Memo.Parent := GridPanel; 
        Memo.Lines.Clear; 
        Memo.Align := TAlign.alClient; 
        DataSource := TDataSource.Create(View); 
        Navigator := TDBNavigator.Create(View); 
        Navigator.Name := 'Navigator'; 
        Navigator.DataSource := DataSource; 
        Navigator.Parent := GridPanel; 
        Navigator.Align := TAlign.alClient; 
        Grid := TDBGrid.Create(View); 
        Grid.Name := 'Grid'; 
        Grid.Parent := GridPanel; 
        Grid.Align := TAlign.alClient; 
        Grid.DataSource := DataSource; 
    
        { 
        GridPanel.ControlCollection.BeginUpdate; 
        GridPanel.ControlCollection.AddControl(Memo, 0, 0); 
        GridPanel.ControlCollection.AddControl(Navigator, 0, 1); 
        GridPanel.ControlCollection.AddControl(Grid, 0, 2); 
        GridPanel.ControlCollection.EndUpdate; 
        } 
    
        // ShowMessage(ComponentToString(View)); 
        View.ShowModal; 
        finally 
        View.Free; 
        end; 
    end 
    
    :(これは50%に設定されている)

これは私が書いたコードであります

結果は次のようになります。

enter image description here

問題:フォームの下部にあるギャップと見られるようになしDBナビゲータがあります!

DFMのダンプは、私には罰金になります。私は位置を変更すると

object Form2: TForm 
    Left = 0 
    Top = 0 
    Caption = 'Form2' 
    ClientHeight = 441 
    ClientWidth = 624 
    Color = clBtnFace 
    Font.Charset = DEFAULT_CHARSET 
    Font.Color = clWindowText 
    Font.Height = -11 
    Font.Name = 'Tahoma' 
    Font.Style = [] 
    OldCreateOrder = False 
    Position = poOwnerFormCenter 
    PixelsPerInch = 96 
    TextHeight = 13 
    object GridPanel: TGridPanel 
    Left = 0 
    Top = 0 
    Width = 624 
    Height = 441 
    Align = alClient 
    BevelOuter = bvNone 
    ColumnCollection = < 
     item 
     Value = 100.000000000000000000 
     end> 
    ControlCollection = < 
     item 
     Column = 0 
     Control = Memo 
     Row = 0 
     end 
     item 
     Column = 0 
     Control = Navigator 
     Row = 1 
     end 
     item 
     Column = 0 
     Control = Grid 
     Row = 2 
     end> 
    FullRepaint = False 
    RowCollection = < 
     item 
     Value = 50.000000000000000000 
     end 
     item 
     SizeStyle = ssAbsolute 
     Value = 24.000000000000000000 
     end 
     item 
     Value = 50.000000000000000000 
     end> 
    TabOrder = 0 
    object Memo: TMemo 
     Left = 0 
     Top = 0 
     Width = 624 
     Height = 208 
     Align = alClient 
     TabOrder = 0 
     ExplicitLeft = 219 
     ExplicitTop = 59 
     ExplicitWidth = 185 
     ExplicitHeight = 89 
    end 
    object Navigator: TDBNavigator 
     Left = 0 
     Top = 208 
     Width = 624 
     Height = 18 
     Align = alClient 
     TabOrder = 1 
     ExplicitTop = 0 
     ExplicitWidth = 240 
     ExplicitHeight = 25 
    end 
    object Grid: TDBGrid 
     Left = 0 
     Top = 208 
     Width = 624 
     Height = 209 
     Align = alClient 
     TabOrder = 2 
     TitleFont.Charset = DEFAULT_CHARSET 
     TitleFont.Color = clWindowText 
     TitleFont.Height = -11 
     TitleFont.Name = 'Tahoma' 
     TitleFont.Style = [] 
    end 
    end 
    object TDataSource 
    end 
end 

、ナビゲーターは、正しい位置にあるが、私はそれが絶対的になりたいです。

TCellItem(GridPanel.RowCollection[1]).Value := 5; 
TCellItem(GridPanel.RowCollection[1]).SizeStyle := TSizeStyle.ssPercent; 

この場合、TGridPanelはなぜ奇妙な動作をしますか?それについて私は何ができますか?

答えて

4

SizeStyleとValueの設定順序を変更します。

TCellItem(GridPanel.RowCollection[0]).SizeStyle := TSizeStyle.ssPercent; 
TCellItem(GridPanel.RowCollection[0]).Value := 50; 
TCellItem(GridPanel.RowCollection[1]).SizeStyle := TSizeStyle.ssAbsolute; 
TCellItem(GridPanel.RowCollection[1]).Value := 24; 
TCellItem(GridPanel.RowCollection[2]).SizeStyle := TSizeStyle.ssPercent; 
TCellItem(GridPanel.RowCollection[2]).Value := 50; 
+0

理由は 'TCellItem.SetValue'にあります。' TCellItem'クラスの中に 'FValue'の隣に' FSize'というフィールドがあります。どのようなハック... –

+0

@JensMühlenhoff、 'FSize'は' SizeStyle'がssAbsoluteであるときに値に設定されるピクセルで実際のサイズをとります。それ以外の場合は 'TCustomGridPanel.RecalcCellDimensions'で計算されます。 –

関連する問題