フォームがあります。formshow で、フィールドの値を stringgrid セルに初期化しますが、セルのテキストの下に影が表示されます。フィールドの値にペルシア文字を使用しました。
私は英語の値で同じことをしましたが、うまくいきます。
提案をいただければ幸いです。
出力例:
フォームがあります。formshow で、フィールドの値を stringgrid セルに初期化しますが、セルのテキストの下に影が表示されます。フィールドの値にペルシア文字を使用しました。
私は英語の値で同じことをしましたが、うまくいきます。
提案をいただければ幸いです。
出力例:
有効DefaultDrawing
にして を入力すると、テキストはすでにレンダリングされますOnDrawCell
。
を使用してペイントに必要な行の高さを計算しているため、で塗りつぶし/クリアするものを計算する必要がDT_CALCRECT
あります。
を使用して、塗りつぶす必要がある最終的な Rect を取得できます (例では)。DrawText
Rect
FillRect
UnionRect
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;