2012-02-13 20 views
7

Tôi đang tìm giải pháp được đề xuất để tạo kiểu ô TGrid đang được gọi bằng cuộc gọi OnGetValue (được gọi để vẽ các ô trong chế độ xem). Đối với nền, một phản ứng tuyệt vời của Mike, cho thấy làm thế nào để chỉ cần áp dụng một thuộc tính tAlign khi ô được tạo; nhưng thử thách tiếp theo của tôi là tô màu nội dung của ô.Điều khiển lưới Firemonkey - Tạo một ô dựa trên giá trị (thông qua cuộc gọi hàm OnGetValue)

Previous posting/answer

Mục tiêu là để thay đổi các thuộc tính di động (Font, phong cách, màu sắc vv ...) giá trị tôi sắp trở lại như những tế bào "Giá trị". Trong ví dụ dưới đây; nó sẽ áp dụng một kiểu cho giá trị "OnGetValue" đang được trả về. Nó cũng có thể là chúng ta phải làm điều này thông qua một FM Stylesheet; hoặc chúng ta có thể trực tiếp đến các thuộc tính TText không? Lý tưởng nhất, cả hai kịch bản sẽ là tuyệt vời - nhưng ở giai đoạn này tôi sẽ đưa một trong hai giải pháp ... (; -..>

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. 

Nhiều cảm ơn trước, Ian

+0

Bạn có thể xác định dựa trên giá trị '? Bạn có nghĩa là, nói, nếu giá trị là tiêu cực thì phông chữ sẽ là màu đỏ vv? –

+0

Xin chào Mike - Có; tại chỗ trên. Tôi có hai kịch bản nhưng cả hai đều là nguyên tắc tương tự. Một kịch bản là giá trị âm sẽ được hiển thị RED và kịch bản khác là "in đậm" một mục trong danh sách (mà tôi chọn - do tắt chi tiết tổ chức lưới; khách hàng quan trọng, v.v ...). Cảm ơn trước. Ian. – Ian

Trả lời

5

Thứ nhất, một lời xin lỗi Trong tôi trả lời cho câu hỏi cuối cùng của bạn, CreateCellControl nên được gọi là kế thừa để tạo ra các tế bào.Tôi đã sửa đổi câu trả lời của tôi.Đã sửa đổi câu trả lời của tôi

Đối với câu hỏi này, tôi đã tải lên bài đăng trên blog của tôi trên FireMonkey Cells - http://monkeystyler.com/blog/entry/firemonkey-grid-basics-custom-cells-and-columns câu trả lời trước và cũng bao gồm việc tạo các điều khiển ô tùy chỉnh. Bạn cần phải đọc điều đó trước khi bắt đầu ed. Tôi sẽ đợi.

...

Quay lại ngay bây giờ? Tốt.

Làm theo ví dụ trong bài đăng trên blog.

Ngoại trừ, tôi đã cập nhật TFinancialCell để kế thừa trực tiếp từ TTextCell (tất nhiên là TEdit), điều này có ý nghĩa hơn và đơn giản hơn rất nhiều.

Vì vậy, cập nhật 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; 

Mã cho ở trên:

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; 

Và cuối cùng, cập nhật GetValue xử lý sự kiện:

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

Xin chào Mike - cảm ơn một lần nữa vì ví dụ; bạn thực sự là "TGrid guru". Bài đăng trên blog/bài đăng trên blog rất tuyệt vời và được trình bày rất tốt. Tôi đã quản lý để làm theo ví dụ sửa đổi/chỉnh sửa của bạn và nhận được làm việc táo bạo và đỏ. - Cảm ơn nhiều lần nữa; một gent thật ...! Ian. (PS.Có cách nào để căn chỉnh đúng tiêu đề cột cũng như sử dụng phương pháp tương tự cho các cột tài chính không?) – Ian

+0

Xin chào Mike - một vấn đề nhỏ mà tôi đã lưu ý liên quan đến những điều trên? Tất cả đều ổn cho đến khi tôi cuộn cửa sổ. Khi nó cuộn, màu đỏ/dấu chấm phẩy đi ra khỏi dòng/đồng bộ. Tôi không chắc chắn nó là một vấn đề repaint với FM hay cái gì khác? Tôi có thể gửi mã của tôi nếu bạn là tốt? - Thx trước, Ian. – Ian

+0

Tệ của tôi. Kiểu dáng cần phải được áp dụng lại từ phương thức SetData, vì vậy tôi đã cập nhật đoạn mã trên để trích xuất một phương thức ApplyStyles và gọi nó từ ApplyStyle, SetData và SetIsImportant. –

1

Mã ở trên là tốt cho phiên bản trước XE4, nhưng cho XE4 và XE5 không hoạt động. Màu sắc và kiểu văn bản không thay đổi.

này được một mã số cố định cho XE4 và 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; 
Các vấn đề liên quan