Es scheint etwas offensichtlich zu haben. Ich möchte, dass die Texte im Zentrum der Zellen stehen, aber aus bestimmten Gründen kann ich sie nicht in Eigenschaften finden. Wie kann ich das machen?Delphi: Wie Zellen-Texte in TStringGrid-Center ausgerichtet werden?
Antwort
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;
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
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
hmm ... welcher der beiden übriggebliebenen _ist_ der richtige? – kleopatra
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.
- 1. Wie werden Bilder rechts ausgerichtet?
- 2. Wie werden Elemente in einem Bohrloch ausgerichtet?
- 3. Zeilenelemente werden nicht ausgerichtet
- 4. Buttons werden nebeneinander ausgerichtet
- 5. Wie zwei uibuttons im Storyboard ausgerichtet werden
- 6. Wie Tabellendaten für Kindle (KF8) ausgerichtet werden
- 7. Wie werden 2 verschiedene Textgrößen vertikal ausgerichtet?
- 8. Wie werden 2 JPanels vertikal zueinander ausgerichtet?
- 9. Wie werden Achsenetiketten unterschiedlicher Höhe ausgerichtet?
- 10. Objekte können nicht in AppBar ausgerichtet werden
- 11. Wie werden projektspezifische Komponenten in Delphi behandelt?
- 12. Wie werden Bilder in der Rasteransicht programmatisch ausgerichtet?
- 13. Wie werden Zeichenfolgen in C# mit der Funktion string.Format() ausgerichtet?
- 14. Wie können Benutzeroberflächenelemente in Appcelerator dynamisch ausgerichtet werden?
- 15. Wie werden Markentitel und Links in der Bootstrap-Navigationsleiste ausgerichtet?
- 16. TableWrapData: Widgets werden nicht korrekt ausgerichtet
- 17. Kann dieser Code neu ausgerichtet werden?
- 18. Warum werden meine Bilder nicht richtig ausgerichtet?
- 19. Bootstrap-Zeilen können nicht "ausgerichtet" werden
- 20. Benötigen Sie Text innerhalb Bootstrap ausgerichtet werden
- 21. Verschachtelte UIStackViews werden nicht ausgerichtet. Wie richte ich sie aus?
- 22. CSS, wie meine Kreise nach einem Wort horizontal ausgerichtet werden
- 23. Wie 2 Klassen innerhalb div vertikal ausgerichtet werden
- 24. Wie werden 2 Absätze nebeneinander mit Novacode DocX ausgerichtet?
- 25. Wie Klassenmethoden in Schnittstellendefinitionen in Delphi unterstützt werden
- 26. Sollen Instanz-/Klassenfelder in Delphi vorangestellt werden?
- 27. ausgerichtet malloc() in GCC?
- 28. Divs in der gleichen Spalte werden nicht vertikal ausgerichtet
- 29. Wie wird Card in eckigem Material ausgerichtet?
- 30. Bilder können nicht in Zeile richtig ausgerichtet werden
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
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
Flom, ich habe die Antwort aktualisiert. –