2010-08-22 4 views

Antwort

15

Es gibt keine Eigenschaft, um den Text in TStringGrid zum Zentrum, aber Sie können das bei DrawCell Ereignis tun wie:

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; 

Der Code, den ich von here geschrieben

UPDATE:

zu Text zentrieren, während Sie in die Zelle schreiben, diesen Code zu GetEditText hinzufügen Ereignis:

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; 
+0

Danke. Also, wenn ich möchte, dass es zentriert wird, während der Benutzer in seine Zellen schreibt, dann sollte ich das in onEdit() tun? – Mahm00d

+0

Der obige Code ist im 'OnDrawCell'-Event implementiert und sollte dort belassen werden. Wenn Sie möchten, dass die Eingabe als Benutzerzentrale zentriert wird, dann sollten Sie die Paint-Ereignisse der Editoren TEdit/TWhatewayEdit verwenden. – zz1433

+0

Flom, ich habe die Antwort aktualisiert. –

1

Auf Delphi kann ich es durch TEdit Art Überlastung, auf diese Weise:

On-Schnittstellenabschnitt, bevor eine TForm Erklärung i setzen: für eine solche

type TStringGrid=class(Grids.TStringGrid) 
    private 
    FCellsAlignment:TStringList; 
    function GetCellsAlignment(ACol,ARow:Integer):TAlignment; 
    procedure SetCellsAlignment(ACol,ARow: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; 
end; 

Auf der Implementierung Abschnitt i die Umsetzung setzen :

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

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

procedure TStringGrid.SetCellsAlignment(ACol,ARow:Integer;const Alignment:TAlignment); 
begin 
    FCellsAlignment.AddObject(IntToStr(ACol)+'-'+IntToStr(ARow),TObject(Alignment)); 
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:=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; 

dann die Zellenausrichtung einzustellen ich etwas so:

CellsAlignment[TheCellCol,TheCellRow]:=taLeftJustify; 
CellsAlignment[TheCellCol,TheCellRow]:=taCenter; 
CellsAlignment[TheCellCol,TheCellRow]:=taRightJustify; 

Das ist es.

pelase beachten Sie, es kann viel verbessert werden, es ist nur ein Proof-of-concept davon TStingGrid Hinzufügen es geht nicht um eine neue Klasse zu erstellen (mit anderen Namen) und weder es geht um eine neue Komponente zu schaffen .

Hoffe, dass dies für jemanden nützlich sein kann.

PD: Die gleiche Idee ist möglich, TEdit getan werden, nur die Suche auf stackoverflow.com für TEdit.CreateParams oder senden Sie lesen How to set textalignment in TEdit control

3

Bitte beachten: Da ich Beiträge nicht löschen kann (wenn ein Admin kann tun Bitte lösche sie und entferne diesen Absatz), ich versuche sie zu bearbeiten, um nur diesen zu lassen. Dieser ist eine viel bessere Lösung, dass die anderen und auf ihnen gab es einen Tipp auf Verfahren TStringGrid.SetCellsAlignment und TStringGrid.SetCellsAlignment der -1<Index Vergleich war korrekt, aber then und else Teile sind vertauscht ... Die richtige Version (diese) wird zeigen, dass wenn Index ist größer als -1 es überschreibt Wert gespeichert sonst wird es einen neuen Eintrag hinzufügen, die anderen werden nur die Gegenseite bringen eine Liste aus Index-Nachricht, danke für die Erkennung solcher.

Ich habe auch in der Lage macht alle in einer anderen getrennten Einheit zu sein, so ist es hier (Hoffnung jetzt ist es richtig, und vielen Dank für solche mistypes Nachweis):

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. 

Dies ist eine ganze Einheit ist, speichern in eine Datei namens AlignedTStringGrid.pas.

Dann auf jedem Formular haben Sie eine TStringGrid hinzufügen ,AlignedTStringGrid am Ende der Schnittstelle verwendet Klausel.

Hinweis: Das gleiche kann für Zeilen gemacht werden, aber für jetzt weiß ich nicht, wie man beide (Spalten und Zeilen) wegen der Wahl der Priorität mischen, wenn jemand sehr daran interessiert ist, lass es mich wissen.

P. D .: Die gleiche Idee ist möglich, TEdit getan werden, nur die Suche auf stackoverflow.com für TEdit.CreateParams oder read post How to set textalignment in TEdit control

+0

hmm ... welcher der beiden übriggebliebenen _ist_ der richtige? – kleopatra

1

In Lazarus Sie es von Objektinspektor erstellen können. Suchen Sie nach Eigenschaftenspalten in TStringGrid, die Sie erstellt haben, und fügen Sie wenige Elemente hinzu. Erweitern Sie dann Ihr TStringGrid im Objekt-Explorer, wählen Sie das Raster aus, das Sie ausrichten möchten, und ändern Sie es in die Eigenschaft Alignment.

Verwandte Themen