Строка Grid и графика в ячейках - PullRequest
1 голос
/ 14 сентября 2011

Я поместил значки в сетку строк, но столкнулся с проблемой, что не все графики выровнены. Я попытался переделать центрирование текста, чтобы иконки выровнялись, но безуспешно. Я пытался исследовать растровое изображение и его функциональность, но я не нашел (так мне кажется) ничего, что могло бы мне помочь. Может кто-нибудь помочь мне, пожалуйста?

РЕДАКТИРОВАТЬ (из кода, добавленного в ответе на вопрос по ошибке):

bitmap := Tbitmap.Create;
bitmap.LoadFromFile('equal.bmp');
bitmap.SetSize(150,60);
stringgrid1.Canvas.StretchDraw(stringgrid1.CellRect(3,J), bitmap);
SetTextAlign(StringGrid1.Canvas.Handle, TA_CENTER);
StringGrid1.Canvas.TextRect(stringgrid1.CellRect(3,J),
   (stringgrid1.CellRect(3,J).Left+stringgrid1.CellRect(3,J).Right) div 2,

stringgrid1.CellRect(3,J).Top + 5,StringGrid1.Cells[3,J]);
SetTextAlign(StringGrid1.Canvas.Handle, TA_LEFT);

1 Ответ

4 голосов
/ 15 сентября 2011

Вот пример (Delphi 7, поскольку это то, что мне пригодилось, но код должен работать в D2010):

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  Bmp:  TBitmap;
  CellText: string;
  R: TRect;
const
  L_PAD = 5;  // Amount between right side of image and start of text
  T_PAD = 5;   // Amount between top of cell and top of text
begin
  // Some text to display in cells.
  CellText := Format('Row: %d Col: %d', [ARow, ACol]);

  // Draw an image along the left side of each cell in the first
  // col (not the fixed ones, which we'll leave alone)
  if ((ACol = 1) or (ACol = 3)) and  (ARow > 0) then
  begin
    Bmp := TBitmap.Create;
    try
      Bmp.LoadFromFile('C:\glyfx\common\bmp\24x24\favorites24.bmp');
      if ACol = 1 then // left align image
      begin
        R.Top := Rect.Top + 1;
        R.Left := Rect.Left + 1;
        R.Right := R.Left + Bmp.Width;
        R.Bottom := R.Top + Bmp.Height;
        StringGrid1.Canvas.StretchDraw(R, Bmp);
        StringGrid1.Canvas.TextOut(R.Right + L_PAD, R.Top + T_PAD, CellText);
      end
      else
      begin // right align image
        StringGrid1.Canvas.TextOut(Rect.Left + L_PAD,
                                   Rect.Top + L_PAD,
                                   CellText);
        R.Top := Rect.Top + 1;
        R.Left := Rect.Right - Bmp.Width - 1;
        R.Right := Rect.Right - 1;
        R.Bottom := R.Top + L_PAD + Bmp.Height;
        StringGrid1.Canvas.StretchDraw(R, Bmp);
      end;
    finally
      Bmp.Free;
    end;
  end
  else
    StringGrid1.Canvas.TextOut(Rect.Left + L_PAD, Rect.Top + T_PAD, CellText);
end;

Вот как это выглядит:

StringGrid with image aligned

...