【发布时间】:2017-10-09 16:41:14
【问题描述】:
我想在字符串网格单元格中以自动换行格式显示一个长字符串,并找到了以下代码:
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) 删除它,但这对显示没有影响。我是什么不见了?
【问题讨论】:
-
不要从绘图事件中设置行高。这又会再次触发绘图事件。
-
听起来您仍然启用了
DefaultDrawing。适当的做法是禁用它,但您也负责 all 绘图。 -
@Victoria 由于 stringgrid 不执行自动换行,所以我必须使用 onDrawCell 事件来修改单元格大小并显示文本。
-
不,您不必这样做。实际上,你不应该那样做。实际上是你设置了单元格文本,所以进行测量并在那里设置行高(
TStringGrid是旧的,不是灵活的控制)。而且,如果您允许,也可以在调整列大小时(但这需要网格类拦截)。 -
@JerryDodge 我想避免自己绘制整个字符串网格。由于此代码在初始绘图后执行,因此我期望填充矩形。覆盖文本原始显示,然后重新绘制包装的文本。
标签: delphi vcl tstringgrid