导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2023/6/6 13:31:37
标题:
请教FMX模式下TGrid数据格式化问题
浏览:1268
加入我的收藏
楼主:
大家好,有个问题向大家求教,请大家指导一下,在此谢过了 在FireMonkey模式下,我使用Binding将数据绑定到了TGrid中,我想问问如何在TGrid表中将数据格式化呢 比如将数字:1234567格式化为:1,234,567
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/6 14:13:55
1楼:
如果数据来自数据库的 TField,可以在字段的 OnGetValue 事件里面对数字进行格式化。这个方法和 Binding 无关。 如果要在 Binding 里面搞,也可以。在 Binding 的 OnAssigningValue 事件里面写代码。请看: https://blog.csdn.net/pcplayer/article/details/104290065
----------------------------------------------
-
作者:
2023/6/9 20:39:17
2楼:
能具体说说吗,我在OnGetValue方法中试了多种方式,都没有看到生效,不知道是哪里弄好,能否帮忙贴个案例代码 谢谢
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
janker (janker)
★☆☆☆☆
-
盒子活跃会员
2023/6/9 21:55:35
3楼:
tgrid默认是按数据类型进行基本格式处理的,比如字符串左对齐,数字右对齐,货币类型(currency)自动添加分隔符","。绑定的时候数据类型是取决于数据适配器。 自己处理显示格式时,用TTextLayout来处理内容,不要直接用TCanvas。
----------------------------------------------
-
作者:
2023/6/9 23:08:35
4楼:
能具体说明一下吗,FMX还是第一次玩,没什么经验,您说得方法我没啥概念啊
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/10 2:23:14
5楼:
in fact, you only needs check "ShowThousandSeparator" on "Columns" in your TGrid using LiveBinding...
此帖子包含附件: 大小: 87.2K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/10 9:35:45
6楼:
To:emailx45 非常感谢您的指点,目前的问题是:我的Grid不一定是固定的格式,是根据查询的字段来显示对应的字段,所以针对字段类型与格式需要使用代码来实现,而这正是我不知道如何解决的问题。 您是否能使用动态设置的方式帮忙解决这个问题,谢谢
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/10 10:22:33
7楼:
动态创建Column?
----------------------------------------------
z@S7
作者:
2023/6/10 10:37:18
8楼:
我是将TGRID绑定到了TClientDataSet上,Grid没有设置固定的字段,是根据TClientDataSet的查询结果,显示数据,所以字段名称与数量是不固定的。 现在我的问题是想能够动态的对字段格式进行设置,比如动态的将Grid.Columns[1]的数据设置成千分位格式,或者是百分比格式。 我现在已经做的就是根据查询后的结果设置各字段的宽度,如下: Grid1.Columns[0].Visible:=False; Grid1.Columns[1].Width:=160; Grid1.Columns[2].Width:=100; Grid1.Columns[3].Width:=80; Grid1.Columns[4].Width:=200; Grid1.Columns[5].Width:=80; 但不知如何设置数据的格式。
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/10 12:13:44
9楼:
你得重新考虑怎么构建整个TGrid了. 你先读取了TClientDataSet,然后跟据TClientDataSet.Fields,依据其每个Field的类型,重新构建TGrid的对应类型的Column,这时候才能依据TColumn的类型设置显示效果。 Columns有了,这个时候再重新做运行时TGrid与TClientDataSet的关系绑定的代码实现。 如果是用TCurrencyColumn(Columns[3]).Format:=''这种,怕是行不通. 总之挺麻烦的,动态创建Columns,动态绑定TGird与TClientDataSet.
此帖子包含附件: 大小: 13.8K
----------------------------------------------
z@S7
作者:
2023/6/10 12:27:50
10楼:
或者在FMX模式下有其它控件可以简化这一过程,大家有推荐吗
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/10 15:52:35
11楼:
或许你可以另辟蹊径,在数据集做文章,例如TFDQuery.FormatOptions 组件的话,可以试试TMS FNX UI Pack 的 TMSFNCGrid + TMSFNCGridDatabaseAdapter
----------------------------------------------
z@S7
作者:
2023/6/10 19:55:00
12楼:
目前我临时采用的方式是在SQL查询时就直接就数据格式化,但这会影响到查询的速度,还是想看能否在Grid上面做文章,或者换一个其它的FMX网格控件解决此问题
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/11 0:40:24
13楼:
@changfengleeNO NEED RECREATE THE COLUMNS, you can try this:REMEMBER: in Grids (TGrid/StringGrids) all informations is a "string value" -- not the value really showed on the screen!!! - the convertion is done in behind the scenes!!! implementation {$R *.fmx} procedure TForm1.Button1Click(Sender: TObject); begin for var i: integer := 0 to (Grid1.ColumnCount - 1) do begin // verify if the columns is a "currency, float, single, integer, etc...", for example.... and other informations // // if (Grid1.Columns[i] is TCurrencyColumn) or { } (Grid1.Columns[i] is TFloatColumn) or { } (Grid1.Columns[i] is TIntegerColumn) then begin TCurrencyColumn(Grid1.Columns[i]).DecimalDigits := 5; TCurrencyColumn(Grid1.Columns[i]).ShowThousandSeparator := true; // etc... end; end; end;
此帖子包含附件: 大小: 7.0K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/11 0:57:26
14楼:
Other way, would be create a new customized "method" to converter or whatever to LiveBinding usage: here you can learn more about my post in WeDelphi: How to creating a LiveBindings custom Method to TDate fields to show Empty value on screen! by Emailx45 for example, if your data = 31/12/1899 ( TDate(0) ), in your screen it will be showed as ("") = empty stringhttp://wedelphi.com/t/422547/
此帖子包含附件: 大小: 20.7K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/11 1:23:22
15楼:
my custom function in usage ..
此帖子包含附件: 大小: 126.1K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/11 17:10:58
16楼:
TO:emailx45 非常感谢,按您的方法,确实解决了大部分的问题了。 另外还有一个问题想继续问问,就是百分比如何实现呢,比如50.00%这样的
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/12 2:14:17
17楼:
the ease way is using "Custom Format" on Columns! NOTE: but you'll have problem with edit value in non-text types, like: currency, integer, floats, etc... to advanced usage, it's necessary create yourself "Methods" do livebinding!!!! NOTE 2: you can use "READ-ONLY" on column or Grid to avoid edit!!!
此帖子包含附件: 大小: 33.9K
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/12 8:33:32
18楼:
TO:emailx45 非常感谢,按您的方法,问题已解决,向高手致敬
----------------------------------------------
【个人签名】:玩了多年DELPHI,终于从菜鸟升级成老菜鸟
作者:
2023/6/13 1:25:40
19楼:
YAAAAHOOOOOOOOOO!
----------------------------------------------
The higher the degree, the greater the respect given to the humblest!RAD 11.3
作者:
2023/6/16 21:09:11
20楼:
复杂的使用 TGrid.OnDrawColumnCell 事件, 想咋整就咋整 procedure TGridForm.DataGridDrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); var LField : String; LLayout: TTextLayout; LColor : TAlphaColor; begin LField := StockLinkGrid.Columns[Column.Index].MemberName; LLayout := TTextLayoutManager.DefaultTextLayout.Create(Canvas); try try LLayout.BeginUpdate; LLayout.TopLeft := R.TopLeft; LLayout.MaxSize := PointF(Column.Width - 4, DataGrid.RowHeight - 1); LLayout.WordWrap := False; LLayout.Opacity := Column.AbsoluteOpacity; LLayout.HorizontalAlign := TTextAlign.Center; LLayout.VerticalAlign := TTextAlign.Center; LLayout.Font.Assign(DataGrid.TextSettings.Font); LLayout.Trimming := TTextTrimming.Character; LColor := DataGrid.TextSettings.FontColor; if SameText(LField, 'Flag') then case StrToIntDef(LLayout.Text, 0) of 1 : begin LLayout.Text := '◇'; LColor := TAlphaColorRec.Gray; end; 2 : begin LLayout.Text := '★'; LColor := TAlphaColorRec.Maroon; end; 3 : begin LLayout.Text := '☆'; LColor := TAlphaColorRec.Goldenrod; end; 4 : begin LLayout.Text := '√'; LColor := TAlphaColorRec.Green; end; else LLayout.Text := ''; end; LLayout.Color := LColor; Canvas.Font.Size := LLayout.Font.Size; finally LLayout.EndUpdate; end; LLayout.RenderLayout(Canvas); finally FreeAndNil(LLayout); end; end;
----------------------------------------------
我84砖家
作者:
2023/6/17 9:12:16
21楼:
一个不知道什么语言的网址,说的挺详细 有些方法在11.0可能是失效了。Grilles et Livebindings
----------------------------------------------
z@S7