2012-02-12 31 views
6

FireMonkey Gridコントロールを使用していますが、列を右揃えにする際に問題が継続しています。他のユーザー投稿から、私は新しいTColumnタイプを作成し、これにスタイルを適用しました(HorzAlign = taTrailingというテキスト)。理論的には、これが解決策だと思っていました。値は、OnGetValue関数によってGridコントロールに提供されます。Firemonkeyグリッドコントロール - 列を右揃えにする

しかし、最初は問題ないですが、バー/マウスホイールなどをスクロールすると、新しいTColumnタイプの列は以下のメソッド/コードを使用して正しく更新されないようです。これは、Gridのバグ/機能(または私がそれをやっている方法)である可能性があります。私は.AlAlignなどを試みました...;しかし役に立たない。グリッドを一列に戻す唯一の方法は、例えば列のサイズ変更を行うことです。これを正しく再描画しますか?

以下のコードは、2つの列、1つの標準のStringColumn、1つの新しいStringColNum(wuthの右揃えが適用された)という単純なTGridであることを示しています。 - これは、グリッドワークの基本要件であると評価されています。

unit Unit1; 

interface 

uses 
    System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, 
    FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.Objects, FMX.Grid, 
    FMX.Layouts, FMX.Edit; 

type 
    TForm1 = class(TForm) 
    Grid1: TGrid; 
    Button1: TButton; 
    StyleBook1: TStyleBook; 
    procedure Grid1GetValue(Sender: TObject; const Col, Row: Integer; 
     var Value: Variant); 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

    TStringColNum = class(TStringColumn) 
    private 
    function CreateCellControl: TStyledControl; override; 
    public 
    constructor Create(AOwner: TComponent); override; 
    published 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

constructor TStringColNum.Create(AOwner: TComponent); 
begin 
    inherited; 
end; 

function TStringColNum.CreateCellControl: TStyledControl; 
var 
    t:TEdit; 
begin 
    Result:=TStringColNum.Create(Self); 
    Result.StyleLookup := 'textrightalign'; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    Grid1.AddObject(TStringColumn.Create(Self)); 
    Grid1.AddObject(TStringColNum.Create(Self)); // Right Aligned column? 

    Grid1.RowCount:=5000; 
    Grid1.ShowScrollBars:=True; 
end; 

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer; 
    var Value: Variant); 
var 
    cell: TStyledControl; 
    t: TText; 
begin 
    if Col=0 then 
    Value:='Row '+IntToStr(Row);; 

    if Col=1 then 
    begin 
     cell := Grid1.Columns[Col].CellControlByRow(Row); 
     if Assigned(cell) then 
     begin 
      t := (Cell.FindStyleResource('text') as TText); 
      if Assigned(t) then 
      t.Text:='Row '+IntToStr(Row); 
     end; 
    end; 
end; 

end. 

大切にしています。イアン

答えて

5

私はまだこれについて私のブログの記事を書いていないことを私に思い出させるすべてのことを思い出させる。

とにかく、グリッドセルは、TStyledControl(基本的には任意のコントロール)の子孫にすることができます。テキストセルのデフォルトはTTextCellです。これは単にTEditです。 TEditというのは、アラインメントを変更することが本当に簡単であることを意味します:TextAlignプロパティを変更するだけです。スタイルを混乱させる必要はありません(本当にしたい場合を除きます)。

あなたの列はCreateCellControlメソッドでセルを作成する必要があります。あなたは実際にあなたの主な問題であるあなたの列のインスタンスを作成しています。

あなたのカラムにCreateメソッドは必要ありません。何もしていないので、それを削除してください(別のものが必要な場合を除いて)。そしてCreateCellControlを修正してください。

function TStringColNum.CreateCellControl: TStyledControl; 
begin 
    Result:=inherited; 
    TTextCell(Result).TextAlign := taTrailing; 
end; 

は最後に、あなたのGetValueメソッドイベントハンドラのニーズは値を返す以上何もしない:あなたが降順で台無しに持っているので、bindmanagerが列を作成すると、列を降順

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer; 
    var Value: Variant); 
begin 
    if Col=0 then 
    Value:='Row '+IntToStr(Row); 

    if Col=1 then 
    Value := 'Row '+IntToStr(Row); 
end; 
+2

おかげでマイク - 私が探していた「完璧な答え」。本当のスーパースター..! – Ian

0

はlivebindingsでうまく動作しません。それ。私の見解ではエレガントでも実用的でもありません。

グリッドのOnPaintingイベントでセルを整列させるだけです。

I := Col; 
for J := 0 to Grid1.RowCount - 1 do 
begin 
    T := TTextCell(Grid1.Columns[I].Children[J]); 
    T.TextAlign := TTextAlign.taTrailing; 
end; 
0

あなたが作成されている列クラスをカスタマイズするが、あなたは、個々の細胞のコントロールのいくつかの属性を設定し、列のヘルパーを作成することができます少ないチャンスを持っているときにlivebindingsを使用している場合。あまりにもエレガントしかし、シンプルで機能しません:

unit GridColumnHelper; 

interface 

uses 
    Fmx.Types, Fmx.Controls, Fmx.Grid, Fmx.Edit; 

type 
    TGridColumnHelper = class helper for TColumn 
    public 
    procedure SetEditMaxLength(aValue: Integer); 
    procedure SetEditTextAlign(aValue: TTextAlign); 
    end; 

implementation 

{ TGridColumnHelper } 

procedure TGridColumnHelper.SetEditMaxLength(aValue: Integer); 
var 
    lControl: TStyledControl; 
begin 
    for lControl in FCellControls do 
    begin 
    if lControl is TEdit then 
     (lControl as TEdit).MaxLength := aValue; 
    end; 
end; 

procedure TGridColumnHelper.SetEditTextAlign(aValue: TTextAlign); 
var 
    lControl: TStyledControl; 
begin 
    for lControl in FCellControls do 
    begin 
    if lControl is TEdit then 
     (lControl as TEdit).TextAlign := aValue; 
    end; 
end; 

end. 

結合は、グリッドを埋めた後、あなたはヘルパーを呼び出すことができます。

MyGrid.Columns[0].SetEditTextAlign(TTextAlign.taTrailing); 
MyGrid.Columns[1].SetEditMaxLength(15); 
0

私はそれがエンバカデロの怠惰だと思います。

FMX.Grid.pasで3行を追加/変更するとこの問題は解決されます。

元のFMXを変更する代わりに。グリッドパスでは、オリジナルのFMX.Grid pasをプロジェクトディレクトリにコピーすることをお勧めします。プロジェクトに追加(プロジェクトに追加)し、次の行を追加/変更します。

TColumn = class(TStyledControl) 
    private const 
    HorzTextMargin = 2; 
    VertTextMargin = 1; 
    private 
    FReadOnly: Boolean; 
    FHorizontalAlign:TTextAlign;//Add this Line ********* 
    FEditMode: Integer; 
    FApplyImmediately: boolean; 
    ... 
    ... 
    procedure UpdateCell(ARow: Integer); 
    published 
    property HorizontalAlign: TTextAlign read FHorizontalAlign write FHorizontalAlign;//add this line ******* 
    property Align; 
    property ClipChildren default False; 

procedure TColumn.DefaultDrawCell(const Canvas: TCanvas; const Bounds: TRectF; const Row: Integer; 
    const Value: TValue; const State: TGridDrawStates); 
var 
    R: TRectF; 
    Layout: TTextLayout; 
    LocalRow: Integer; 
begin 
    if FDrawable <> nil then 
    FDrawable.DrawCell(Canvas, Bounds, Row, Value, State) 
    else 
... 
... 
     Layout.Opacity := AbsoluteOpacity; 
     (*remark this line ***************** 
     Layout.HorizontalAlign := Grid.TextSettingsControl.ResultingTextSettings.HorzAlign; 
     *) 
     Layout.HorizontalAlign := HorizontalAlign;//add this line ***** 

最後に、あなたのプロジェクトに新しいプロパティを設定することができます。例:

MyColumn.Horizo​​ntalAlign:= TTextAlign.taCenter;

0

"suat dmk"のソリューションは正常に動作しています.DBリンクを使用する場合は、recompile Fmx.Bind.DBLinks.pas and Fmx.Bind.Editors.pasにする必要があります。その後

、あなたは、単にOnPaintingイベントに置く:

SGrid1.ColumnByIndex(1).HorizontalAlign := TTextAlign.Leading;