StringGrind Textausrichtung ändern.



  • Hallo,

    ich würde gerne innerhalb einer methode die textausrichtung eines StringGrids ändern. Hier ein paar infos:

    void TFunktion::writeStringGrid(TStringGrid *StringGrid)
    {
    
       for(int i=0; i < N_ELEMENTE; i++)
       {
          /* ... ganz viel code ... */
       }
    
       StringGrid->ColCount = PositionZaehler;
       StringGrid->RowCount = 2;
       StringGrid->FixedCols = 0;
       StringGrid->FixedRows = 0;
       StringGrid->GridLineWidth = 0;
       StringGrid->DefaultColWidth = StringGrid->Canvas->TextWidth("000");
       StringGrid->RowHeights[0] = StringGrid->Canvas->TextHeight("0");
    }
    

    So, also ich übergebe über die Parameter ein Zeiger auf ein StringGrid.
    Das wird jetzt über die Methode formatiert und beschrieben. Jetzt mein Problem.
    Das StringGrid soll in der ersten ([0]ten) Reihe die Textausrichtung LINKS haben und in der zweiten ([1]ten) mittig bzw standard. Wenns geht auch noch in der ersten ([0]ten) reihe nach UNTEN ausgerichtiet sein.

    Problem ist jetzt, das über den Zeiger zu ändern. Mir fällt da keine lösung ein. In der FAQ habe ich das hier gefunden.

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
      // Farben festlegen:
      // Standardfarben für selektierte Zelle(n)
      if (State.Contains(gdSelected))
      {
        StringGrid1->Canvas->Brush->Color = clHighlight;
        StringGrid1->Canvas->Font->Color = clHighlightText;
      }
      // gerade Zeilen Dunkelgrau, aber nicht die feste(n) Zeile(n) oben
      else if (ARow % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clGray;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // gerade Spalten Hellgrau, aber nicht ... links
      else if (ACol % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clSilver;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // Zelle 2/2 Gelb
      else if (ACol == 2 && ARow == 2)
      {
        StringGrid1->Canvas->Brush->Color = clYellow;
        StringGrid1->Canvas->Font->Color = clBlack;
      }
    
      // Zelle endlich zeichnen
      StringGrid1->Canvas->FillRect(Rect);
    
      // noch ein Gimmick für die Textausrichtung
      int hAlign;   // text align, 0/1/2 - Left/Center/Right
      if (ACol % 2)
        hAlign = 1;
      else
        hAlign = 2;
    
      // und zum Schluss den Text in die Zelle malen
      DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(),
        -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    }
    //---------------------------------------------------------------------------
    

    Allerdings kann ich ja die Methode nicht peer Zeiger an der stelle meines Codes ändern odeR?



  • die Textausrichtung eines StringGrid kann nur beim Zeichnen (OnDrawCell) geändert werden, also setze bei dem StringGrid diese Methode einfach ein, entweder zur Entwurfszeit über den Objektinspektor oder zur Laufzeit dynamisch (Beispiel)

    um innerhalb der Methode auf das referenzierende Objekt zuzugreifen, in deinem Fall also das StringGrid kannst du

    TStringGrid *Beliebiger_VariablenName = dynamic_cast<TStringGrid*>(Sender);
    

    verwenden, wobei du dann nur Beliebiger_VariablenName als Bezeichnung für das StringGrid innerhalb der Methode verwenden solltest



  • Wie kann ich denn bei dieser funktion auf StringGrid1 zugreifen, wenn ich den
    zeiger darauf gar nicht habe. (Die Funktion liegt jat nich in der Form
    wo das StringGrid letztendlich ist.)

    Bekommt man den Zeiger irgendwie aus *Sender?

    void __fastcall TForm1::StringGrid1DrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
      // Farben festlegen:
      // Standardfarben für selektierte Zelle(n)
      if (State.Contains(gdSelected))
      {
        StringGrid1->Canvas->Brush->Color = clHighlight;
        StringGrid1->Canvas->Font->Color = clHighlightText;
      }
      // gerade Zeilen Dunkelgrau, aber nicht die feste(n) Zeile(n) oben
      else if (ARow % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clGray;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // gerade Spalten Hellgrau, aber nicht ... links
      else if (ACol % 2 && !State.Contains(gdFixed))
      {
        StringGrid1->Canvas->Brush->Color = clSilver;
        StringGrid1->Canvas->Font->Color = clWhite;
      }
      // Zelle 2/2 Gelb
      else if (ACol == 2 && ARow == 2)
      {
        StringGrid1->Canvas->Brush->Color = clYellow;
        StringGrid1->Canvas->Font->Color = clBlack;
      }
    
      // Zelle endlich zeichnen
      StringGrid1->Canvas->FillRect(Rect);
    
      // noch ein Gimmick für die Textausrichtung
      int hAlign;   // text align, 0/1/2 - Left/Center/Right
      if (ACol % 2)
        hAlign = 1;
      else
        hAlign = 2;
    
      // und zum Schluss den Text in die Zelle malen
      DrawText(StringGrid1->Canvas->Handle, StringGrid1->Cells[ACol][ARow].c_str(),
        -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    }
    //---------------------------------------------------------------------------
    


  • hier nochmal

    Linnea schrieb:

    um innerhalb der Methode auf das referenzierende Objekt zuzugreifen, in deinem Fall also das StringGrid kannst du

    TStringGrid *Beliebiger_VariablenName = dynamic_cast<TStringGrid*>(Sender);
    

    verwenden, wobei du dann nur Beliebiger_VariablenName als Bezeichnung für das StringGrid innerhalb der Methode verwenden solltest

    und hier noch eine Hilfe -> FAQ



  • Sorry, hatte da was falsch verstanden ;).

    Ok, das ansprechen läuft jetzt. Aber hier das will net so

    C++ Fehler Funktion.cpp(299): E2034 Konvertierung von 'void (_fastcall *)(TObject *,int,int,TRect &,TGridDrawState)' nach 'void (_fastcall * (_closure )(TObject *,int,int,const TRect &,TGridDrawState))(TObject *,int,int,const TRect &,TGridDrawState)' nicht möglich

    Die Fehlermeldung kommt an der Zeile wo das kommentar
    "Und hier kommt der Fehler" steht.

    Ich habe das jetzt so gemacht:

    void __fastcall StringGridDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State);
    
    class TFunktion
    {
    
       private:
    
          /* ... */
    
       public:
    
          TFunktion();
          /* ... */
    
          void writeStringGrid(TStringGrid *StringGrid, bool setSize, bool setFormat);
    
    };
    
    void TFunktion::writeStringGrid(TStringGrid *StringGrid, bool setSize, bool setFormat)
    {
    
       TStringGrid *newGrid = new TStringGrid( StringGrid->Owner );
    
       /* Vom übergebenen StringGrid daten in das neue übenehmen */
       AnsiString GridName;
    
       newGrid->Color   = StringGrid->Color;
       newGrid->Font    = StringGrid->Font;
       /* ... */
       newGrid->Parent  = StringGrid->Parent;
       newGrid->TabOrder = newGrid->TabOrder;
    
       newGrid->Ctl3D   = StringGrid->Ctl3D;
       newGrid->BorderStyle = StringGrid->BorderStyle;
    
       // altes löschen
       delete StringGrid;
    
       newGrid->Name = GridName;
    
       /* newGrid füllen */
    
       /* ... */
    
       newGrid->ColCount        = PositionZaehler;
       newGrid->RowCount        = 2;
       newGrid->FixedCols       = 0;
       newGrid->FixedRows       = 0;
    
       // Wenn das Grid neu formatiert werden soll, tu dies ;)
       if( setFormat )
       {
          newGrid->GridLineWidth   = 0;
          newGrid->DefaultColWidth = newGrid->Canvas->TextWidth("000");
          newGrid->RowHeights[0]   = newGrid->Canvas->TextHeight("0");
          newGrid->Enabled         = false;
          newGrid->Ctl3D           = false;
          newGrid->BorderStyle     = bsNone;
    
          /* Und hier kommt der Fehler: */
          newGrid->OnDrawCell      = StringGridDrawCell;
        }
    
       // Wenn das Grid neu dimensioniert werden soll, tu dies ;)
       if( setSize )
       {
          newGrid->Height = newGrid->RowHeights[0] + newGrid->RowHeights[1];
    
          int newWidth = 1;
          for(int i=0; i < newGrid->ColCount; i++)
          {
             newWidth += newGrid->ColWidths[i];
          }
    
          newGrid->Width = newWidth;
    
          newGrid->ScrollBars = ssNone;
       }
    }
    
    void __fastcall StringGridDrawCell(TObject *Sender, int ACol,
          int ARow, TRect &Rect, TGridDrawState State)
    {
    
       TStringGrid *StringGrid = dynamic_cast<TStringGrid*>(Sender);
    
       /* ... */
    
      // und zum Schluss den Text in die Zelle schreiben
      DrawText(StringGrid->Canvas->Handle, StringGrid->Cells[ACol][ARow].c_str(),
        -1, &Rect, DT_SINGLELINE | DT_VCENTER | hAlign);
    }
    

    Jemand ne idee/erlärung?



  • Hallo

    das ist ein bekannter Fehler. Obwohl der OI den Event mit TRect& erstellt, muß aber beim manuellen Zuweisen const Rect& angegeben, wie es auch in der BCB-Hilfe steht.

    void __fastcall StringGridDrawCell(TObject *Sender, int ACol,
          int ARow, const TRect &Rect, TGridDrawState State)
    

    bis bald
    akari



  • hm, ich hab jetzt die deklarationszeile so abgeändert und bekomme diesen fehler:

    [C++ Fehler] Funktion.cpp(299): E2034 Konvertierung von 'void (_fastcall *)(TObject *,int,int,const TRect &,TGridDrawState)' nach 'void (_fastcall * (_closure )(TObject *,int,int,const TRect &,TGridDrawState))(TObject *,int,int,const TRect &,TGridDrawState)' nicht möglich
    [C++ Fehler] Funktion.cpp(529): E2034 Konvertierung von 'const TRect *' nach 'tagRECT *' nicht möglich
    [C++ Fehler] Funktion.cpp(529): E2342 Keine Übereinstimmung des Typs beim Parameter 'lpRect' ('tagRECT *' erwartet, 'const TRect *' erhalten)


Anmelden zum Antworten