Firemonkey Grid Control - выравнивание столбца справа - PullRequest
6 голосов
/ 12 февраля 2012

Я использую элемент управления FireMonkey Grid, но у меня есть постоянная проблема при попытке выровнять столбец вправо. Из сообщений других пользователей мне удалось создать новый тип TColumn, применить стиль к нему (текст как HorzAlign = taTrailing) и теоретически - подумал, что это будет решением. Значения предоставляются функцией OnGetValue для элемента управления Grid.

Проблема, однако, заключается в том, что, хотя поначалу все выглядит нормально, если вы прокручиваете колесо / колесо мыши и т. Д., Новый столбец типа TColumn не обновляется должным образом с помощью метода / кода ниже. Это может быть ошибка / особенность Grid (или как я это делаю). Я пробовал .ReAlign и т.д ...; но безрезультатно. Единственный способ вернуть сетку в соответствие - это изменить размер столбца, например, который затем правильно перерисовывается?

Приведенный ниже код показывает, что это простой TGrid с 2 столбцами, 1 стандартным StringColumn и 1 моим новым StringColNum (с выравниванием по правому краю). - Любая помощь приветствуется, так как эта является основным требованием любой работы по сетке.

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.

С уважением. Ян.

Ответы [ 6 ]

5 голосов
/ 12 февраля 2012

Все это напоминает мне, что я до сих пор не написал своего блога об этом.

В любом случае, ячейка сетки может быть любым потомком TStyledControl (в основном, любого элемента управления).По умолчанию для текстовой ячейки используется TTextCell, который является просто TEdit.Быть TEdit означает, что изменить выравнивание очень просто: просто измените свойство TextAlign.Нет необходимости связываться со стилями (если вы действительно этого не хотите).

В вашем столбце необходимо создать ячейки в методе CreateCellControl.Вы фактически создаете экземпляр своего столбца, который является вашей главной проблемой.

Вам не нужен метод Create для вашего столбца (он ничего не делает), поэтому удалите его (если он не нужен для чего-то другого)) и измените ваш CreateCellControl.

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

Наконец, ваш обработчик событий GetValue не должен делать ничего, кроме как вернуть значение:

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;
0 голосов
/ 25 ноября 2018

другое решение:

Grid1.ApplyStyleLookup();
MyCol1.DefaultTextSettings.HorzAlign:=TTextAlign.taCenter;
0 голосов
/ 18 февраля 2016

Решение "suat dmk" работает нормально, вам нужно recompile Fmx.Bind.DBLinks.pas and Fmx.Bind.Editors.pas, если вы собираетесь использовать ссылки на БД.

После этого вы просто добавляете событие OnPainting:

SGrid1.ColumnByIndex(1).HorizontalAlign := TTextAlign.Leading;
0 голосов
/ 08 февраля 2016

Я думаю, что Embarcadero - это лень.

добавление / изменение 3 строк в FMX.Grid.pas решает эту проблему.

вместо модификации исходного FMX.копирование оригинального FMX.Grid pas в ваш каталог Project, в том числе в вашем Project (добавить в Project) и добавление / изменение следующих строк.ваш проект.например:

MyColumn.HorizontAlign: = TTextAlign.taCenter;

0 голосов
/ 31 декабря 2013

Если вы используете живые привязки, когда у вас меньше шансов настроить создаваемый класс столбца, но вы можете создать помощников для столбца, который устанавливает некоторые атрибуты отдельных элементов управления ячейки. Не слишком элегантно, но просто и работает:

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 голосов
/ 28 октября 2013

Нисходящие столбцы плохо работают с живыми привязками, так как администратор привязок создает столбцы, так что вам придется возиться с этим по убыванию.На мой взгляд, ни элегантно, ни практично.

Просто выровняйте свои ячейки в событии OnPainting для сетки.

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