- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想以自动换行格式在字符串网格单元格中显示一个长字符串,并找到了以下代码来执行此操作:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
//enable wordwrap in cells
var
S: String;
drawrect :trect;
begin
stringgrid1.Canvas.FillRect (Rect);
S:= (Sender As TStringgrid).Cells [ACol, ARow ];
If Length(S) > 0 Then Begin
drawrect := rect;
DrawText((Sender As TStringgrid).canvas.handle,
Pchar(S), Length(S), drawrect,
dt_calcrect or dt_wordbreak or dt_left );
If (drawrect.bottom - drawrect.top) >
(Sender As TStringgrid).RowHeights[Arow]
Then
(Sender As TStringgrid).RowHeights[Arow] :=
(drawrect.bottom - drawrect.top)
// changing the row height fires the event again!
Else Begin
drawrect.Right := rect.right;
(Sender As TStringgrid).canvas.fillrect( drawrect );
DrawText((Sender As TStringgrid).canvas.handle,
Pchar(S), Length(S), drawrect,
dt_wordbreak or dt_left);
End;
End;
end;
自动换行有效,但单元格同时显示原始文本和换行文本。我假设,由于这是一个 onDrawCell 事件,原始文本已经绘制,我会用第一行代码(stringgrid1.canvas.fillrect(rect))删除它,但这对显示没有影响。我是什么失踪了?
最佳答案
...would erase it with the first line of code (stringgrid1.canvas.fillrect(rect), but this has no effect on the display
这是因为您在调用 FillRect()
f 之前没有选择 Brush.Style
(也可能是 Brush.Color
) .例如。
stringgrid1.canvas.Brush.Style := bsSolid; // add this line
stringgrid1.canvas.Brush.Color := clWhite; // add this line
stringgrid1.Canvas.FillRect (Rect);
您会注意到单元格左边缘有一些默认绘图的残留物(在下图中不可见,我已经修复了它们)。这是因为 TStringGrid
在内部将单元格绘图偏移了 4 个像素。要更改此设置,您需要在调用 FillRect()
之前将 Rect
参数抵消为 -4,并使用 +4 增加宽度。
经过上述更改后,网格看起来非常平坦和暗淡(在图像中我已经向第二个网格添加了颜色)。要恢复标题列和标题行的某些颜色差异,您需要使用不同的 Brush.Color
处理具有 gdFixed in State
的单元格。对于状态为 gdSelected
的单元格也是如此。
如果取消选中 DefaultDrawing
,您还需要执行上述操作。第二个网格和随附的代码演示了这一点。请注意,代码还包括在结束前 gdFocused in State
时对 DrawFocusRect
的调用。
请注意,我将所有这些 Sender as TStringGrid
替换为本地 grid
变量。
procedure TForm4.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
var
grid: TStringGrid;
S: String;
drawrect: TRect;
bgFill: TColor;
begin
grid := Sender as TStringGrid;
if gdFixed in State then
bgFill := $FFF8F8
else
if gdSelected in State then
bgFill := $FFF0D0
else
bgFill := clWhite;
grid.Canvas.Brush.Color := bgFill;
grid.canvas.Brush.Style := bsSolid;
grid.canvas.fillrect(Rect);
S := grid.Cells[ACol, ARow];
if Length(S) > 0 then
begin
drawrect := Rect;
drawrect.Inflate(-4 , 0);
DrawText(grid.canvas.handle, Pchar(S), Length(S), drawrect,
dt_calcrect or dt_wordbreak or dt_left);
If (drawrect.bottom - drawrect.top) > grid.RowHeights[ARow] then
grid.RowHeights[ARow] := (drawrect.bottom - drawrect.top+2)
// changing the row height fires the event again!
else
begin
drawrect.Right := Rect.Right;
// grid.canvas.fillrect(drawrect);
DrawText(grid.canvas.handle, Pchar(S), Length(S), drawrect,
dt_wordbreak or dt_left);
end;
end;
if gdFocused in State then
grid.Canvas.DrawFocusRect(Rect);
end;
第三个网格演示了最简单的解决方案,在我看来也是最好的解决方案,即完全跳过 TStringGrid
并使用 TDrawGrid
代替。您必须将要显示的数据单独保存在网格中的某处。我定义了一个数组:s_arr: array of array of string;
。
在这种情况下,您可以将 DefaultDrawing
保留为打开状态,因为 TDrawGrid
在默认绘制过程中不会绘制任何文本,内容绘制仅在 OnDrawCell
事件。
procedure TForm4.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect;
State: TGridDrawState);
var
S: string;
grid: TDrawGrid;
drawrect: TRect;
begin
grid := Sender as TDrawGrid;
S := s_arr[ACol, ARow];
If Length(S) > 0 Then
Begin
drawrect := Rect;
drawrect.Inflate(-4 , 0);
DrawText(grid.canvas.handle, Pchar(S), Length(S), drawrect,
dt_calcrect or dt_wordbreak or dt_left);
If (drawrect.bottom - drawrect.top) > grid.RowHeights[ARow] Then
grid.RowHeights[ARow] := (drawrect.bottom - drawrect.top + 2)
// changing the row height fires the event again!
Else
Begin
drawrect.Right := Rect.Right;
grid.canvas.fillrect(drawrect);
DrawText(grid.canvas.handle, Pchar(S), Length(S), drawrect, dt_wordbreak or dt_left);
End;
End;
end;
保留DefaultDrawing
,所有这些与主题相关的功能都由网格本身绘制,我们只在顶部绘制文本。
关于delphi - Stringgrid 自动换行显示文本两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46651224/
我在使用 TStringGrid 和弹出菜单时遇到问题 我想知道从弹出菜单中选择一个项目时上次处于事件状态的单元格的行/列。但是,当我单击弹出菜单时,StringGrid.Row 返回为 -1。 我试
如何获取 stringgrid 中选定单元格或范围的总和值?请注意,有时这些单元格包含字符串值! 我尝试了GridCoord,但它效果不佳,因为有时会有“隐藏列”。 procedure TMainSh
我想将备忘录的内容复制到 TStringGrid。 如果字符串之间有空格或间隙,则应将该单词添加到 StringGrid 中其自己的单元格中。 因此,假设我的自动换行备忘录包含如下信息: 如何将该信息
我想以自动换行格式在字符串网格单元格中显示一个长字符串,并找到了以下代码来执行此操作: procedure TForm1.StringGrid1DrawCell(Sender: TObject; AC
我正在这样做: procedure TForm1.Button1Click(Sender: TObject); var dtStart: TDateTime; I: Integer; begin
我在网上找到了很多解决方案,但它们都不起作用,因为 StringGrid1.ColumnCount 属性是只读的。我正在使用 Delphi 10 Seattle。 我有一个 StringGrid1,我
我想知道如何以编程方式确定字符串网格的单元格中的数据已被修改? 我在表单中有一个字符串网格。 stringgrid 的数据是从数据库加载的。如果用户修改了数据,我想更改数据库中的数据。 请分享代码。
我在我的应用程序中使用stringgrid。数据从数据库(后端mysql)获取并显示在stringgrid中。 我想在每行的状态单元格中插入图像。即 if status =online t
嗨,有谁知道是否可以将图片显示为字符串网格的背景,或者是否有人知道任何可以执行此操作的免费网格组件。 谢谢 科林 最佳答案 您可以使用支持所有者绘制的TDrawGrid(或TStringGrid),并
我尝试将数据从 StringGrid 插入到 Oracle DB 表中,我尝试如下。 function TfrmMapping.LoadtoTable: Boolean; var I, J: In
我必须将 StringGrid(其单元格)中的文本居中对齐,并且我正在使用您在此处看到的代码。我在另一个答案中找到了它,并编辑了一些内容。 procedure TForm1.StringGrid1Dr
我在 Delphi 7 中有一个字符串网格,有 0..N 行。有一个列表框,其中包含从 0..N 开始的数字如果用户单击列表框 number 中的任何数字,则应在字符串网格上选择该行号。 所以我有这个
在 Delphi 2010 中,我需要显示一个网格,该网格具有大约 15 列 x 5 行的水平滚动条。 我选择使用 StringGrid。 但是,当鼠标按钮向下拖动水平滚动条时,我希望网格实时滚动。
我一直在寻找解决方案,但没有任何运气。有谁知道一个简单的方法来做到这一点?例如,我想拉伸(stretch)网格的第二列以适应网格的宽度! 最佳答案 使用 ColWidths 属性,如下所示: with
任何人都可以为 Delphi 推荐一个好的 stringgrid 组件,它可以像 Microsoft Excel 一样处理每个单元格上的注释吗?我正在网上搜索,但还没有找到太多,如果这里有人使用过类似
我正在重写字符串网格的OnDrawCell。在某些情况下,我想在系统进行绘图时使用用于所选行的常规 TColor(无 OnDrawCell)。 那是什么颜色? clXXX ? 最佳答案 在 Delph
使用 Delphi 2010 和 TStringGrid 组件,我当前显示数据库查询中的五个字段。 这是我正在做的事情的简单示例 //设置网格 procedure TGriddata.FormCrea
我的表单中有一个 StringGrid,当我按下 Button1 时,我会在该网格内移动一些单元格。这是一个例子: 当我按下Button1时,我从情况A转到情况B。但我也希望能够做相反的事情:我的意思
我有一个 StringGrid,它能够使用 OnDraw 方法绘制新线。 它工作正常,但现在我希望用户可以使用键盘输入新行。目前,必须将多行文本复制粘贴到 StringGrid 中。 每次按下 VK_
在 StringGrid 组件后代中,我想根据单元格的值更改弹出提示消息。我的编码: procedure TForm.GridMouseEnterCell(Sender: TObject; ACol,
我是一名优秀的程序员,十分优秀!