AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi XE zentrierter Text im StringGrid

Ein Thema von Andidreas · begonnen am 2. Jan 2012 · letzter Beitrag vom 3. Jan 2012
Antwort Antwort
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Delphi XE zentrierter Text im StringGrid

  Alt 2. Jan 2012, 17:03
aloha...

ich versuche gerade wie folgt ein stringgrid zu befüllen und die überschrift zentriert darzustellen

prozedur zum befüllen des TStringGrids:

Delphi-Quellcode:
//******************************************************************************
// 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;
die überschrift versuche ich wie folgt zentriert und fett darzustellen:

Delphi-Quellcode:
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;
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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Delphi XE zentrierter Text im StringGrid

  Alt 2. Jan 2012, 17:29
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
RaSoWa1

Registriert seit: 1. Jun 2006
Ort: Halle/Saale
140 Beiträge
 
Delphi 2010 Professional
 
#3

AW: Delphi XE zentrierter Text im StringGrid

  Alt 2. Jan 2012, 17:30
Hallo,

du musst den alten Text vorher löschen.
Rufe dazu vor DrawText die unten stehend Methode DRAWRECT auf.
Delphi-Quellcode:
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;
So mache ich es in meiner Komponente TFilterGrid. Schau sie dir mal an. Code und Hilfe liegen bei.

Gruß Klaus.

Gruß Klaus.
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Delphi XE zentrierter Text im StringGrid

  Alt 2. Jan 2012, 17:52
@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?
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Delphi XE zentrierter Text im StringGrid

  Alt 2. Jan 2012, 19:14
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;
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Benutzerbild von Andidreas
Andidreas

Registriert seit: 27. Okt 2005
1.110 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: Delphi XE zentrierter Text im StringGrid

  Alt 3. Jan 2012, 08:11
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;
Ein Programmierer Programmiert durchschnittlich 15 Code Zeilen pro Tag
Wir sind hier doch nicht bei SAP!!!

Aber wir habens bald
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz