2013-10-28 1 views
1

Мне нужно, чтобы мои денежные ячейки на сетке отображали символ местной валюты, выравнивались по правому краю и имели отрицательные числа, показанные красным.мобильная сетка firemonkey с livebindings - изменение цвета текста TextCell во время выполнения XE5

В отличие от аналогичных должностей, я заполняю свой TGrid из набора данных, используя livebindings. Другие решения предлагают подклассифицировать «TFinancialCell» из TStringCell для сетки, что сложно при использовании livebindings.

С помощью Livebindings диспетчер Bind управляет созданием столбцов и ячеек сетки, поэтому подкласс класса Bind Manager (и других соответствующих классов), вероятно, не является ни практичным, ни элегантным.

+1

Если это решение, вы должны оставить вопрос в качестве вопроса, а затем добавить ответ. o.o '' – EMBarbosa

ответ

2

После перепутались с этим еще немного я нашел решение, которое отвечает мою проблему

Символ деньги, полученные с помощью OnGetText событие поля набора данных, чтобы вернуть отформатированную строку:

procedure FDTableMyCurrFieldGetText(Sender: TField; var Text: string; 
    DisplayText: Boolean); 
begin 
    DisplayText := True; 
    Text := FloatToStrF(Sender.AsCurrency, ffCurrency, 18, 2); 
end; 

Я мог бы сделать это в событии Grid OnPainting, но при этом он форматирует поле для всех связанных элементов управления, а также для сетки. Я использую «Sender», а не «FDTableMyCurrField», чтобы ссылаться на поле, чтобы я мог указать на это событие OnGetText всех других полей валюты в моих наборах данных.

Остальная часть форматирования выполняется в сетке. Ячейки сетки не отображаются явно, но вы можете обращаться к ним следующим образом: «TTextCell (Grid1.Columns [I] .Children [J])». Используйте сетку OnPainting событие для форматирования ячеек непосредственно перед их окраской.

Правое выравнивание достигается установкой выравнивания ячейки в сетке.

Цвет текста ячейки задается с помощью стилей. Нам нужно создать «textcellnegativestyle» в нашем приложении StyleBook. Это будет идентично стандарту «textcellstyle», за исключением того, что цвет кисти «переднего плана» будет красным. На настольном приложении вы можете сбросить TEdit в своем приложении, щелкнуть его правой кнопкой мыши и выбрать «Редактировать пользовательский стиль ...», а затем назвать пользовательский стиль «textcellnegativestyle» на основе «editstyle», но просто измените цвет кисти переднего плана на красный.

Mine - мобильное приложение, в котором «Редактировать пользовательский стиль» не отображается во всплывающем меню редактора форм Delphi для this reason. Чтобы добавить собственный стиль, вы должны отредактировать (копию) файла .style с помощью Notepad или текстового редактора.

  1. Копировать/вставить «textcellstyle» объект
  2. редактировать имя вставленного объекта «textcellnegativestyle»
  3. изменить «переднего плана» Кисть цвет на красный.
  4. Загрузите отредактированный файл в свое приложение StyleBook.

Вот как это выглядит в моем .style файла:

object TLayout 
    StyleName = 'textcellnegativestyle' 
    DesignVisible = False 
    Height = 50.000000000000000000 
    Width = 50.000000000000000000 
    object TLayout 
     StyleName = 'content' 
     Align = alContents 
     Locked = True 
     Height = 42.000000000000000000 
     Margins.Left = 4.000000000000000000 
     Margins.Top = 4.000000000000000000 
     Margins.Right = 4.000000000000000000 
     Margins.Bottom = 4.000000000000000000 
     Width = 42.000000000000000000 
    end 
    object TBrushObject 
     StyleName = 'foreground' 
     Brush.Color = claRed 
    end 
    object TBrushObject 
     StyleName = 'selection' 
     Brush.Color = x7F72B6E6 
    end 
    object TFontObject 
     StyleName = 'font' 
    end 
    end 

Я использую событие Сетки OnPainting, чтобы установить выравнивание и стиль ячеек.вот мое рабочее решение:

procedure TFormMain.Grid1Painting(Sender: TObject; Canvas: TCanvas; 
    const ARect: TRectF); 
var 
    I, J: Integer; 
    T: TTextCell; 
begin 
    // my Column 0 is text, all other columns are money in this example 
    for I := 1 to Grid1.ColumnCount - 1 do 
    for J := 0 to Grid1.Columns[I].ChildrenCount- 1 do 
    begin 
     T := TTextCell(Grid1.Columns[I].Children[J]); 
     // set the Cell text alignment to right align 
     T.TextAlign := TTextAlign.taTrailing; 

     // test the Cell string for a negative value 
     if (T.Text[1] = '-') then 
     begin 
     // remove the leading minus sign 
     T.Text := Copy(T.Text, 2, Length(T.Text) - 1); 
     // set the font to red using the style 
     T.StyleLookup := 'textcellnegativestyle'; 
     end 
     else T.StyleLookup := 'textcellstyle'; 
    end; 
end;