![]() |
Delphi XE zentrierter Text im StringGrid
aloha...
ich versuche gerade wie folgt ein stringgrid zu befüllen und die überschrift zentriert darzustellen prozedur zum befüllen des TStringGrids:
Delphi-Quellcode:
die überschrift versuche ich wie folgt zentriert und fett darzustellen:
//******************************************************************************
// prSQLiteStringGrid --> Insert SQLite Query Data into String Grid * // Parameter --> strGrid = TStringGrid * // qryIN = TASQLite3Query * // Return --> * //****************************************************************************** procedure prSQLiteStringGrid(strGrid : TStringGrid; qryIN : TASQLite3Query); var iCol, iMaxTextLength, iRow : Integer; begin //=== Add Columns & Set Width for First Column & Default Height ============== strGrid.ColCount := qryIN.FieldCount +1; strGrid.RowCount := qryIN.RecordCount +1; strGrid.DefaultRowHeight := 20; strGrid.ColWidths[0] := 12; //============================================================================ //=== Set Column Titles ====================================================== For iCol := 0 To (qryIN.FieldCount -1) Do Begin strGrid.Cells[iCol+1, 0] := qryIN.Fields[iCol].FieldName; End; //============================================================================ //=== Insert Data into String Grid =========================================== qryIN.First; For iRow := 1 To qryIN.RecordCount Do Begin For iCol := 0 To (qryIN.FieldCount) -1 Do Begin strGrid.Cells[iCol+1, iRow] := qryIN.Fields[iCol].Text; End; qryIN.Next; End; //============================================================================ //=== Auto Fit Columns ======================================================= For iCol := 1 to (strGrid.ColCount -1) Do Begin iMaxTextLength := 0; For iRow := 0 To (strGrid.RowCount - 1 ) Do Begin If strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]) > iMaxTextLength Then Begin iMaxTextLength := strGrid.Canvas.TextWidth(strGrid.Cells[iCol, iRow]); End; End; strGrid.ColWidths[iCol] := iMaxTextLength + 10; End; //============================================================================ end;
Delphi-Quellcode:
ich weiß nicht wieso, aber auf diese art und weise wird mir die überschrift immer 2 mal gezeichnet, einmal mit den standardeinstellungen und das zweite mal mit den modifizierten einstellungen... weiß jemand woran das liegt?
procedure Tmain_form.strgrid_dataDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var s : String; begin s := strgrid_data.Cells[ACol, ARow]; //=== Column Title =========================================================== If ARow = 0 Then Begin strgrid_data.Canvas.Font.Style := [fsBold]; strgrid_data.Canvas.Font.Size := 9; DrawText(strgrid_data.canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER); End; //============================================================================ end; |
AW: Delphi XE zentrierter Text im StringGrid
Du musst DefaultDrawing auf false setzen. Allerdings bist Du dann selbst für alle Zeichenoperationen zuständig. Das ist mehr als unschön, ich meine mich erinnern zu können, dass es hier auch schon einen Thread dazu gab, leider finde ich den gerade nicht.
|
AW: Delphi XE zentrierter Text im StringGrid
Hallo,
du musst den alten Text vorher löschen. Rufe dazu vor DrawText die unten stehend Methode DRAWRECT auf.
Delphi-Quellcode:
So mache ich es in meiner Komponente
procedure TFilterGrid.DrawRect(can: TCanvas; ARect: TRect; AState: TGridDrawState);
begin if (DrawingStyle = gdsGradient) and (gdFixed in AState) then begin if not(goFixedVertLine in Options) then inc(ARect.Right); if not(goFixedHorzLine in Options) then inc(ARect.Bottom); if (gdHotTrack in AState) or (gdPressed in AState) then begin if (gdPressed in AState) then GradientFillCanvas(can, GradientEndColor, GradientStartColor, ARect, gdVertical) else GradientFillCanvas(can, GetHighlightColor(GradientStartColor), GetHighlightColor(GradientEndColor), ARect, gdVertical); end else GradientFillCanvas(can, GradientStartColor, GradientEndColor, ARect, gdVertical); can.Brush.Style := bsClear; end else can.FillRect(ARect); end; ![]() Gruß Klaus. Gruß Klaus. |
AW: Delphi XE zentrierter Text im StringGrid
@RaSoWa1
vielen dank für den tipp... aber entweder liegts an der uhrzeit oder ich bin zu doof... die funktion DRAWRECT kann ich die auch verwenden ohne das ich deine komponente in meine ide linke? |
AW: Delphi XE zentrierter Text im StringGrid
war doch die dummheit... habs so hinbekommen wie es RaSoWa1 gepostet hat (vielen dank nochmal)...
allerdings hab ich jetzt noch das problem das die markierte zeil falsch dargestellt wird, d.h. der text ist hier wieder doppelt... kann man das auch noch abfangen z.b. über State??? anbei mein aktueller source:
Delphi-Quellcode:
procedure Tmain_form.strgrid_dataDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
var iPos : Integer; s : String; begin If (strgrid_data.DrawingStyle = gdsGradient) And (gdFixed in State) Then Begin If Not(goFixedVertLine In strgrid_data.Options) Then inc(Rect.Right); If Not(goFixedHorzLine In strgrid_data.Options) Then inc(Rect.Bottom); If (gdHotTrack In State) Or (gdPressed In State) Then Begin If (gdPressed in State) Then Begin GradientFillCanvas(strgrid_data.canvas, strgrid_data.GradientEndColor, strgrid_data.GradientStartColor, Rect, gdVertical) End Else Begin GradientFillCanvas(strgrid_data.canvas, GetHighlightColor(strgrid_data.GradientStartColor), GetHighlightColor(strgrid_data.GradientEndColor), Rect, gdVertical); End; End Else Begin GradientFillCanvas(strgrid_data.canvas, strgrid_data.GradientStartColor, strgrid_data.GradientEndColor, Rect, gdVertical); End; strgrid_data.canvas.Brush.Style := bsClear; End Else Begin strgrid_data.canvas.FillRect(Rect); End; s := strgrid_data.Cells[ACol, ARow]; //=== Column Title =========================================================== If ARow = 0 Then Begin strgrid_data.Canvas.Font.Style := [fsBold]; strgrid_data.Canvas.Font.Size := 9; DrawText(strgrid_data.canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); End Else Begin strgrid_data.Canvas.Font.Size := 8; DrawText(strgrid_data.canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER); End; //============================================================================ end; |
AW: Delphi XE zentrierter Text im StringGrid
vorab nochmals vielen dank an RaSoWa1... dein DRAWRECT muster hat mir viel ärger erspart :-)
ich hab mir aus dem ganzen jetzt eine procedure gebastetlt die ich im OnDrawCell aufruf anbei der source... procedure ist sicher noch ausbaufählig, aber für meine bedürfnise reichts vorab erst mal
Delphi-Quellcode:
//******************************************************************************
// prFormatStringGrid --> Format Cells in String Grid * // Parameter --> strGrid = TStringGrid (Name of the Component) * // iCol = Integer (String Grid Column No.) * // iRow = Integer (String Grid Row No.) * // Rect = TRect * // State = TGridDrawState(e.g. fdFixed, fdSelected)* // strGridDrawingStyle = TGridDrawingStyle (e.g. gdsGradient) * // Alignment = TAlignment(e.g. taCenter, taLeftJustify)* // FontColor = TColor (Font Color) * // FontSize = Integer (Font Size) * // blFontBold = Boolean (Font Bold) * // Return --> * //****************************************************************************** procedure prFormatStringGrid(strGrid : TStringGrid; iCol, iRow : Integer; Rect : TRect; State : TGridDrawState; strGridDrawingStyle : TGridDrawingStyle; Alignment : TAlignment; FontColor : TColor; FontSize : Integer; blFontBold : Boolean); var s : String; begin //=== Canvas Settings for gdsGardient Drawing Style ========================== If (strGrid.DrawingStyle = gdsGradient) And ((gdFixed in State) or (gdSelected in State)) Then Begin If Not(goFixedVertLine In strGrid.Options) Then inc(Rect.Right); If Not(goFixedHorzLine In strGrid.Options) Then inc(Rect.Bottom); If (gdHotTrack In State) Or (gdPressed In State) Then Begin If (gdPressed in State) Then Begin GradientFillCanvas(strGrid.canvas, strGrid.GradientEndColor, strGrid.GradientStartColor, Rect, gdVertical) End Else Begin GradientFillCanvas(strGrid.canvas, GetHighlightColor(strGrid.GradientStartColor), GetHighlightColor(strGrid.GradientEndColor), Rect, gdVertical); End; End Else Begin GradientFillCanvas(strGrid.canvas, strGrid.GradientStartColor, strGrid.GradientEndColor, Rect, gdVertical); End; strGrid.canvas.Brush.Style := bsClear; End Else Begin strGrid.canvas.FillRect(Rect); End; //============================================================================ //=== Font Settings for each Cell ============================================ s := strGrid.Cells[iCol, iRow]; strGrid.Canvas.Font.Color := FontColor; strGrid.Canvas.Font.Size := FontSize; If Not (blFontBold) Then strGrid.Canvas.Font.Style := strGrid.Canvas.Font.Style - [fsBold]; If (blFontBold) Then strGrid.Canvas.Font.Style := strGrid.Canvas.Font.Style + [fsBold]; //Center If Alignment = taCenter Then DrawText(strGrid.Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER); //Left If Alignment = taLeftJustify Then DrawText(strGrid.Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_LEFT or DT_VCENTER); //Right If Alignment = taRightJustify Then DrawText(strGrid.Canvas.Handle, PChar(s), Length(s), Rect, DT_SINGLELINE or DT_RIGHT or DT_VCENTER); //============================================================================ end; aufruf in OnDrawCell des stringgrids
Delphi-Quellcode:
procedure Tmain_form.strgrid_dataDrawCell(Sender: TObject; ACol, ARow: Integer; Rect: TRect; State: TGridDrawState);
begin //=== Column Title =========================================================== If ARow = 0 Then Begin prFormatStringGrid(strGrid_data, ACol, ARow, Rect, State, strgrid_data.DrawingStyle, taCenter, clBlack, 9, True); End; //============================================================================ //=== Data Rows ============================================================== If ARow <> 0 Then Begin prFormatStringGrid(strGrid_data, ACol, ARow, Rect, State, strgrid_data.DrawingStyle, taLeftJustify, clBlack, 8, False); End; //============================================================================ end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz