2012-02-13 12 views
7

Szukam zalecanego rozwiązania do stylizowania komórki TGrid, która jest rysowana przez wywołanie OnGetValue (która jest wywoływana do malowania komórek w widoku). W tle znakomita odpowiedź Mike'a pokazała, jak po prostu zastosować właściwość tAlign podczas tworzenia komórki; ale moim następnym wyzwaniem jest zabarwienie zawartości komórki.Sterowanie siatką Firemonkey - Stylizacja komórki na podstawie wartości (za pomocą wywołania funkcji OnGetValue)

Previous posting/answer

Celem jest zmiana atrybutów komórki (czcionki, styl, kolor itp ...) wartości mam zamiar wrócić jak komórki „wartość”. W poniższym przykładzie; byłoby zastosowanie stylu do "wartości" OnGetValue, która jest zwracana. Może się zdarzyć, że musimy to zrobić za pomocą arkusza stylów FM; czy możemy przejść bezpośrednio do atrybutów TText? Idealnie, oba scenariusze byłoby świetnie - ale na tym etapie wezmę albo rozwiązanie ... (; -..>

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; 
    published 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.fmx} 

function TStringColNum.CreateCellControl: TStyledControl; 
begin 
    Result:=TTextCell.Create(Self); 
    TTextCell(Result).TextAlign := TTextAlign.taTrailing; 
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); 
begin 
    if Col=0 then 
    Value:='Row '+IntToStr(Row); 

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

// Apply style based on value ? 

end; 

end. 

Wielkie dzięki z góry, Ian

+0

można zdefiniować „na podstawie wartości”? Czy masz na myśli, powiedzmy, że jeśli wartość jest ujemna, to czcionka będzie czerwona itp.? –

+0

Witaj Mike - Tak; na miejscu. Mam dwa scenariusze, ale obie są tą samą zasadą. Jeden scenariusz to wartość ujemna, która ma być wyświetlana na CZERWONO, a druga to "pogrubienie" pozycji na liście (którą wybieram - ze względu na brak informacji przechowywanych w sieci, ważny klient itp.). Z góry dziękuję. Ian. – Ian

Odpowiedz

5

Najpierw przeprosiny W moim odpowiedź na twoje ostatnie pytanie, CreateCellControl powinien był wywołać dziedziczenie, aby utworzyć komórkę. Zmieniono moją odpowiedź:

Jeśli chodzi o to pytanie, dodałem mój wpis na blogu w FireMonkey Cells - http://monkeystyler.com/blog/entry/firemonkey-grid-basics-custom-cells-and-columns - obejmuje on rzeczy z poprzednią odpowiedź, a także obejmuje tworzenie niestandardowych kontroli komórek. Musisz to przeczytać przed proce ed. Poczekam.

...

Powrót? Dobry.

Kontynuując przykład z posta na blogu.

Poza tym, że zaktualizowałem TFinancialCell do dziedziczenia bezpośrednio z TTextCell (który oczywiście jest TEdit), co ma dużo więcej sensu i jest znacznie prostsze do stylu.

Tak, zaktualizuj TFinancialCell:

type TFinancialCell = class(TTextCell) 
    private 
    FIsNegative: Boolean; 
    FIsImportant: Boolean; 
    protected 
    procedure SetData(const Value: Variant); override; 
    procedure ApplyStyle;override; 
    procedure ApplyStyling; 
    public 
    constructor Create(AOwner: TComponent); override; 
    published 
    property IsNegative: Boolean read FIsNegative; 
    property IsImportant: Boolean read FIsImportant; 
    end; 

kod do powyższego:

procedure TFinancialCell.ApplyStyle; 
var T: TFMXObject; 
begin 
    inherited; 
    ApplyStyling; 
end; 

procedure TFinancialCell.ApplyStyling; 
begin 
    if IsNegative then 
    FontFill.Color := claRed 
    else 
    FontFill.Color := claBlack; 
    Font.Style := [TFontStyle.fsItalic]; 
    if IsImportant then 
    Font.Style := [TFontStyle.fsBold] 
    else 
    Font.Style := []; 
    if Assigned(Font.OnChanged) then 
    Font.OnChanged(Font); 
    Repaint; 
end; 

constructor TFinancialCell.Create(AOwner: TComponent); 
begin 
    inherited; 
    TextAlign := TTextAlign.taTrailing; 
end; 

procedure TFinancialCell.SetData(const Value: Variant); 
var F: Single; 
    O: TFMXObject; 
    S: String; 
begin 
    S := Value; 
    FIsImportant := S[1] = '#'; 
    if IsImportant then 
    S := Copy(Value,2,MaxInt) 
    else 
    S := Value; 

    F := StrToFloat(S); 
    inherited SetData(Format('%m', [F])); 
    FIsNegative := F < 0; 
    ApplyStyling; 
end; 

i wreszcie zaktualizować obsługi zdarzeń getValue: powyżej

procedure TForm1.Grid1GetValue(Sender: TObject; const Col, Row: Integer; 
    var Value: Variant); 
var Cell: TStyledControl; 
begin 
    if Col = 0 then 
    Value := Row 
    else if Col = 1 then 
    begin 
    Value := FloatToStr(Data[Row]); 
    if Value > 30 then 
     Value := '#'+Value; 
    end; 
end; 
+0

Witaj, Mike - jeszcze raz dziękuję za przykład; w rzeczywistości jesteś "guru TGrid". Post na blogu/post na forum są doskonałe i bardzo dobrze przedstawione. Udało mi się śledzić twój poprawiony/zredagowany przykład i sprawić, że odważny i czerwony działa dobrze. - Wielkie dzięki jeszcze raz; prawdziwy gent ...! Ian. (PS.Czy istnieje sposób, aby wyrównać nagłówek kolumny z tą samą metodologią dla kolumn TFinancial??) – Ian

+0

Cześć Mike - drobny problem, który zauważyłem w związku z powyższym? Wszystko wygląda dobrze, dopóki nie przewiniem okna. Kiedy się przewija, czerwony/pogrubiony wychodzi poza linię/synchronizację. Nie jestem pewien, czy jest to problem odbarwiania w FM czy coś innego? Mogę opublikować mój kod, jeśli twój jest w porządku? - Z góry, Ian. – Ian

+0

Moja zła. Stylizacja musi zostać ponownie zastosowana z metody SetData, dlatego zaktualizowałem powyższy kod, aby wyodrębnić metodę ApplyStyles i wywołać ją z ApplyStyle, SetData i SetIsImportant. –

1

Kod jest w porządku wersje przed XE4, ale dla XE4 i XE5 nie działa. Kolor i styl tekstu nie są zmieniane.

Jest to kod stały dla XE4 i XE5:

procedure TFinancialCell.ApplyStyling; 
begin 
    StyledSettings := [TStyledSetting.ssFamily, TStyledSetting.ssSize]; 
    if IsNegative then 
    FontColor := claRed 
    else 
    FontColor := claBlack; 
    Font.Style := [TFontStyle.fsItalic]; 
    if IsImportant then 
    Font.Style := [TFontStyle.fsBold] 
    else 
    Font.Style := []; 
    if Assigned(Font.OnChanged) then 
    Font.OnChanged(Font); 
    Repaint; 
end; 
Powiązane problemy