Delphi: Как выровнять тексты ячеек в центре TStringGrid? - PullRequest
12 голосов
/ 22 августа 2010

Кажется, что-то очевидное, чтобы иметь. Я хочу, чтобы тексты были в центре ячеек, но по некоторым причинам я не могу найти его в свойствах. Как я могу это сделать?

Ответы [ 2 ]

17 голосов
/ 22 августа 2010

Нет свойства для центрирования текста в TStringGrid, но вы можете сделать это на событии DrawCell как:

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
var
  S: string;
  SavedAlign: word;
begin
  if ACol = 1 then begin  // ACol is zero based
    S := StringGrid1.Cells[ACol, ARow]; // cell contents
    SavedAlign := SetTextAlign(StringGrid1.Canvas.Handle, TA_CENTER);
    StringGrid1.Canvas.TextRect(Rect,
      Rect.Left + (Rect.Right - Rect.Left) div 2, Rect.Top + 2, S);
    SetTextAlign(StringGrid1.Canvas.Handle, SavedAlign);
  end;
end;

Код, который я отправил с здесь

ОБНОВЛЕНИЕ:

для центрирования текста при записи в ячейку, добавьте этот код в GetEditText Событие:

procedure TForm1.StringGrid1GetEditText(Sender: TObject; ACol, ARow: Integer;
  var Value: string);
var
  S : String;
  I: Integer;
  IE : TInplaceEdit ;
begin
  for I := 0 to StringGrid1.ControlCount - 1 do
    if StringGrid1.Controls[i].ClassName = 'TInplaceEdit' then
    begin
      IE := TInplaceEdit(StringGrid1.Controls[i]);
      ie.Alignment := taCenter
    end;
end;
4 голосов
/ 30 ноября 2012

Это намного лучшее решение, чем другие, и на них был неправильный тип процедур TStringGrid.SetCellsAlignment и TStringGrid.SetCellsAlignment, сравнение (-1 < Index) было правильным, но детали then и else были поменяны местами. Правильная версия (эта) покажет, что когда индекс больше -1, он перезапишет сохраненное значение, в противном случае он добавит новую запись, остальные сделают только опозит, выведя список из сообщения индекса, спасибо за обнаружение такого .

У меня также есть возможность быть все в другом отделенном подразделении, так что вот оно (надеюсь, теперь это правильно и спасибо за обнаружение таких опечаток):

unit AlignedTStringGrid;

interface

uses Windows,SysUtils,Classes,Grids;

type 
  TStringGrid=class(Grids.TStringGrid)
  private
    FCellsAlignment:TStringList;
    FColsDefaultAlignment:TStringList;
    function GetCellsAlignment(ACol,ARow:Integer):TAlignment;
    procedure SetCellsAlignment(ACol,ARow:Integer;const Alignment:TAlignment);
    function GetColsDefaultAlignment(ACol:Integer):TAlignment;
    procedure SetColsDefaultAlignment(ACol:Integer;const Alignment:TAlignment);
  protected
    procedure DrawCell(ACol,ARow:Longint;ARect:TRect;AState:TGridDrawState);override;
  public
    constructor Create(AOwner:TComponent);override;
    destructor Destroy;override;
    property CellsAlignment[ACol,ARow:Integer]:TAlignment read GetCellsAlignment write SetCellsAlignment;
    property ColsDefaultAlignment[ACol:Integer]:TAlignment read GetColsDefaultAlignment write SetColsDefaultAlignment;
  end;

implementation

constructor TStringGrid.Create(AOwner:TComponent);
begin
  inherited Create(AOwner);
  FCellsAlignment:=TStringList.Create;
  FCellsAlignment.CaseSensitive:=True;
  FCellsAlignment.Sorted:=True;
  FCellsAlignment.Duplicates:=dupIgnore;
  FColsDefaultAlignment:=TStringList.Create;
  FColsDefaultAlignment.CaseSensitive:=True;
  FColsDefaultAlignment.Sorted:=True;
  FColsDefaultAlignment.Duplicates:=dupIgnore;
end;

destructor TStringGrid.Destroy;
begin
  FCellsAlignment.Free;
  FColsDefaultAlignment.Free;
  inherited Destroy;
end;

procedure TStringGrid.SetCellsAlignment(ACol,ARow: Integer; const Alignment: TAlignment);
var
  Index:Integer;
begin
  if (-1 < Index) then begin
    FCellsAlignment.Objects[Index]:= TObject(Alignment);
  end else begin
    FCellsAlignment.AddObject(IntToStr(ACol) + '-' + IntToStr(ARow), TObject(Alignment));
  end;
end;

function TStringGrid.GetCellsAlignment(ACol,ARow: Integer): TAlignment;
var
  Index:Integer;
begin
  Index:= FCellsAlignment.IndexOf(IntToStr(ACol)+'-'+IntToStr(ARow));
  if (-1 < Index) then begin
    GetCellsAlignment:= TAlignment(FCellsAlignment.Objects[Index]);
  end else begin
    GetCellsAlignment:= ColsDefaultAlignment[ACol];
  end;
end;

procedure TStringGrid.SetColsDefaultAlignment(ACol: Integer; const Alignment: TAlignment);
var
  Index:Integer;
begin
  Index:= FColsDefaultAlignment.IndexOf(IntToStr(ACol));
  if (-1 < Index) then begin
    FColsDefaultAlignment.Objects[Index]:= TObject(Alignment);
  end else begin
    FColsDefaultAlignment.AddObject(IntToStr(ACol), TObject(Alignment));
  end;
end;

function TStringGrid.GetColsDefaultAlignment(ACol:Integer):TAlignment;
var
  Index:Integer;
begin
  Index:= FColsDefaultAlignment.IndexOf(IntToStr(ACol));
  if (-1 < Index) then begin
    GetColsDefaultAlignment:= TAlignment(FColsDefaultAlignment.Objects[Index]);
  end else begin
    GetColsDefaultAlignment:=taLeftJustify;
  end;
end;

procedure TStringGrid.DrawCell(ACol,ARow:Longint;ARect:TRect;AState:TGridDrawState);
var
  Old_DefaultDrawing:Boolean;
begin
  if DefaultDrawing then begin
    case CellsAlignment[ACol,ARow] of
      taLeftJustify: begin
        Canvas.TextRect(ARect,ARect.Left+2,ARect.Top+2,Cells[ACol,ARow]);
      end;
      taRightJustify: begin
        Canvas.TextRect(ARect,ARect.Right -2 -Canvas.TextWidth(Cells[ACol,ARow]), ARect.Top+2,Cells[ACol,ARow]);
      end;
      taCenter: begin
        Canvas.TextRect(ARect,(ARect.Left+ARect.Right-Canvas.TextWidth(Cells[ACol,ARow]))div 2,ARect.Top+2,Cells[ACol,ARow]);
      end;
    end;
  end;
  Old_DefaultDrawing:= DefaultDrawing;
  DefaultDrawing:=False;
  inherited DrawCell(ACol,ARow,ARect,AState);
  DefaultDrawing:= Old_DefaultDrawing;
end;

end.

Это целое подразделение, сохраните его в файл с именем AlignedTStringGrid.pas.

Тогда в любой форме у вас есть TStringGrid add ,AlignedTStringGrid в конце интерфейса использования пункта.

Примечание: то же самое можно сделать для строк, но сейчас я не знаю, как смешивать оба (столбцы и строки) из-за того, как выбрать приоритет, если кто-то очень заинтересован в этом, дайте мне знать.

P.D .: Эту же идею можно реализовать для TEdit, просто поищите на stackoverflow.com для TEdit.CreateParams или прочитайте сообщение Как установить выравнивание текста в элементе управления TEdit

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...