2013-07-21 82 views
0

我有一个表单。在formshow上,我将一个字段的值初始化为stringgrid单元格,但它在单元格文本下显示一个阴影。 我已经使用波斯字符作为字段的值。
我做了与英国值相同,但它工作正常。
我很欣赏任何建议。输出StringGrid下的阴影

例如:

enter image description here

+3

看起来好像您确实在使用TextOut之前实现了DrawCell并且没有填充Rect。 – bummi

+0

s:=(发件人为TStringGrid).Cells [ACol,ARow]; if length(s)> 0 then begin drawrect:= Rect; ((Sender as TStringGrid).Canvas.handle,Pchar(s),Length(s),drawrect,DT_CALCRECT或DT_WORDBREAK或DT_LEFT); if(drawrect.bottom - drawrect.Top)>(Sender as TStringGrid).RowHeights [ARow] then (Sender as TStringGrid).RowHeights [ARow]:=(drawrect.bottom - drawrect.Top) else begin drawrect .Right:= Rect.Right; (Sender as TStringGrid).Canvas.FillRect(drawrect); ((Sender as TStringGrid).Canvas.handle,Pchar(s),Length(s),drawrect,DT_WORDBREAK or DT_LEFT); 结束; –

+0

根据s的长度,我看不到需要进行不同的处理,但是如果添加'(Sender as TStringGrid).Canvas.FillRect(Rect);'作为第一个例程,则问题应该是一个,因为启用DefaultDrawing'rext已经被绘制到网格中。 – bummi

回答

2

随着enaabled DefaultDrawing文本将如果输入OnDrawCell是已经呈现。

由于要计算使用的DrawTextDT_CALCRECT你将不得不计算Rect至极应充/有FillRect清除绘画所需的rowHeight。
您可以使用UnionRect来获得必须填写的最终Rect(示例中为FillRect)。

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    StringGrid1.Cells[1,1] := 'Hallo'#13'World'; 
    StringGrid1.Cells[2,2] := 'اهای' +13# + 'جهان'; 
end; 

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer; 
    Rect: TRect; State: TGridDrawState); 
var 
    S:String; 
    drawrect,Fillrect : TRect; 
begin 
    s := (Sender as TStringGrid).Cells[ACol, ARow]; 
    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); 
    UnionRect(FillRect,Rect,DrawRect); 
    (Sender as TStringGrid).Canvas.FillRect(FillRect); 
    DrawText((Sender as TStringGrid).Canvas.handle, Pchar(s), Length(s), 
     drawrect, DT_WORDBREAK or DT_LEFT); 
end;