StringGrid Problem Überschrift zentriert ausgeben



  • Hallo Zusammen,

    wie man Text in einer Zelle formatieren kann, ist ja unter dem Link bekannt.
    http://www.bytesandmore.de/rad/cpp/snipp/sc02016.php

    Nun funktioniert das aber nur wenn die Eigenschaft "DrawingStyle" der StringGrid auf "gdsClassic" eingestellt ist. Aber in neueren C Builder Versionen (z.B. XE) gibt es noch "gdsGradient" und die Standardeinstellung "gdsThemed". Nach der o.g. Anleitung werden da aber die Zelleneinträge doppelt angezeigt, nämlich linksbündig und zentriert!!??

    Hier mal Beispielcode (nur den wichtigen Teil):

    Unit1.h

    void __fastcall DrawCellText(Graphics::TCanvas* pCanvas, AnsiString slStr, TRect &Rect, TAlignment eAlignment);
    

    Unit1.cpp

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int Col,
    	  int Row, TRect &Rect, TGridDrawState State)
    {
     // Zeiger besorgen:
     TStringGrid* Grid=dynamic_cast<TStringGrid *>(Sender);
    
     // Text zentriert ausgeben:
     DrawCellText(Grid->Canvas, Grid->Cells[Col][Row], Rect, taCenter);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::DrawCellText(Graphics::TCanvas* pCanvas, AnsiString slStr,
     TRect &Rect, TAlignment eAlignment)
    {
     pCanvas->TextRect(Rect, Rect.Left + (Rect.Right - Rect.Left)/2 -
     pCanvas->TextWidth(slStr)/2, (Rect.Top+Rect.Bottom-
     pCanvas->TextHeight(slStr))/2, slStr);
    }
    //---------------------------------------------------------------------------
    

    Warum funktioniert das nur mit der Eigenschaft "gdsClassic"??
    Wer kann mir helfen???

    Edit: Das Problem tritt nur bei den fixierten Zellen auf!!



  • Hat wirklich keiner eine Lösung wie man den Text der Überschrift zentriert ausgibt??

    Habe mal vor dem DrawCellText noch eine Zeile eingefügt:

    StringGrid1->Canvas->Brush->Color = clBtnFace;
    

    Also sieht es insgesamt jetzt so aus:

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int Col,
          int Row, TRect &Rect, TGridDrawState State)
    {
     // Zeiger besorgen:
     TStringGrid* Grid=dynamic_cast<TStringGrid *>(Sender);
    
     // Text zentriert ausgeben:
     StringGrid1->Canvas->Brush->Color = clBtnFace; //Neu hinzugefügt
     DrawCellText(Grid->Canvas, Grid->Cells[Col][Row], Rect, taCenter);
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::DrawCellText(Graphics::TCanvas* pCanvas, AnsiString slStr,
     TRect &Rect, TAlignment eAlignment)
    {
     pCanvas->TextRect(Rect, Rect.Left + (Rect.Right - Rect.Left)/2 -
     pCanvas->TextWidth(slStr)/2, (Rect.Top+Rect.Bottom-
     pCanvas->TextHeight(slStr))/2, slStr);
    }
    //---------------------------------------------------------------------------
    

    Somit werden die Zellen neu gezeichnet. Dadurch wird der Text nun ordnungsgemäß zentriert angezeigt. Aber das funktioniert natürlich nicht beim Style "gdsGradient".

    Frage:
    1. Wäre das zu mindest eine gute Lösung für den Style "gdsThemed"?
    Steht der Zelleninhalt trotzdem doppelt drin aber man sieht nur den Text über dem neu gezeichneten?
    2. Es muss doch möglich sein beim Style "gdsGradient" die fixierten Zellen ordnungsgemäß zentriert auszugeben!!!

    Ist es doch zu schwer oder warum hat keiner eine Lösung?? 😕



  • Das ist nochmal ein letzter Hilferuf!!!!!!!!!!!

    Wie stelle ich den Zelleninhalt der fixierten Zellen bei einer StringGrid DrawingStyle "gdsThemed" bzw. "gdsGradient" zentriert dar?

    Ich kann nicht glauben das das so ein schweres Thema sein soll...

    Kann das Problem zu Mindest irgendjemand nachvollziehen oder stimmt was mit meiner CB-Installation nicht?



  • Vermutlich wird beim DrawingStyle "gdsThemed" bzw. "gdsGradient" dein zentrierter Text wieder überschrieben. Schau mal da nach der Eigenschaft "DefaultDrawing" und setz die auf false, damit dürfte das überschreiben nicht mehr erfolgen.



  • Manchmal heißt die Eigenschaft auch "OwnerDraw"



  • Die Änderung des DefaultDrawing hilft nicht, da dann auch der eingestellte DrawingStyle deaktiviert wird, was natürlich blöd ist, wenn man den Style möchte. Zusätzlich müsste ich dann auch jede Zelle selber zeichnen, was ich vermeiden wollte aber das ist eine andere Geschichte.

    Noch andere Ideen?


Anmelden zum Antworten