DBGrid verliert RowSelect nach wechseln des Focus - Verhindern?



  • Hallo Zusammen,
    ich habe ein DBGrid mit RowSelect = true. Wenn ich eine Zeile anklicke wird auch die ganze Zeile markiert. Sobald ich dann aber z.B. ein Editfeld aktiviere verschwindet die selektierte Zeile im DBGrid. Man kann nur noch anhand des Pfeils in der ersten Spalte sehen, welche Zeile selektiert wurde.

    Kann man das verhindern? Also ich möchte, das die selektierte Zeile immer zu sehen ist.



  • Ja, indem Du mit Canvas selbst zeichnest
    (im Ereignis OnDrawColumnCell).

    void __fastcall TForm1::DBGrid2rawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
    DBGrid->Canvas->Font->Color=clCaptionText;
    DBGrid->Canvas->Font->Color=clLime;
    DBGrid->Canvas->FillRect(Rect);
    DrawCellText(DBGrid->Canvas,asText,Rect,taRightJustify);
    }
    
    void __fastcall TForm1::DrawCellText(Graphics::TCanvas* pCanvas,
                                           AnsiString slStr, TRect &Rect,
                                           TAlignment eAlignment)
    {
      if(eAlignment == taLeftJustify)
      {
        pCanvas->TextRect(Rect, Rect.Left + 3,
          (Rect.Top+Rect.Bottom-pCanvas->TextHeight(slStr))/2, slStr);
      }
      else if(eAlignment == taRightJustify)
      {
        pCanvas->TextRect(Rect, Rect.Right - pCanvas->TextWidth(slStr) - 3,
          (Rect.Top+Rect.Bottom-pCanvas->TextHeight(slStr))/2, slStr);
      }
      else
      {
        pCanvas->TextRect(Rect, Rect.Left + (Rect.Right - Rect.Left)/2 -
          pCanvas->TextWidth(slStr)/2, (Rect.Top+Rect.Bottom-
          pCanvas->TextHeight(slStr))/2, slStr);
      }
    }
    


  • So, habe es mal ausprobiert. Leider bekomme ich folgende Fehlermeldung:

    [C++ Fehler] drucken_lieferschein_auswahl_cpp.cpp(288): E2451 Undefiniertes Symbol 'asText'
    [C++ Warnung] drucken_lieferschein_auswahl_cpp.cpp(288): W8030 Temporäre Größe für Parameter 'Rect' in Aufruf von '_fastcall DrawCellText(TCanvas *,AnsiString,TRect &,TAlignment)' verwendet

    Muß ich asText irgendwo vorher schon deklarieren?



  • Das asText ist wohl ein Fragment. Ersetze es einfach durch eine Zeichenkette. In dem Fall bietet sich der Text der selektierten Zelle an.



  • @Fincki,
    wie komme ich denn an den Text der selektieren Zelle? Ich habe ja drei Spalten und es soll ja die ganze Zeile markiert sein.
    Dadurch habe ich ja drei Zellen die markiert sind.



  • asText ist eine AnsiString-Variable, die den Text der Zelle enthält.

    Den Wert kriegst Du indem Du den Wert der Spalte das aktuellen DS abfragst.

    z.B. so:

    void __fastcall TMainMLVisard::DBGrid2DrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
    //....
          if (Column->FieldName=="MITARBEITER" || Column->FieldName=="BEMERKUNG") {
             asText = DBGrid->Fields[DataCol]->AsString;
          }
          else {
             asText = FloatToStrF(DBGrid->Fields[DataCol]->AsFloat,ffNumber,7,2);
          }
    /....
    }
    


  • So habe es mal eingefügt und die Fehlermeldung kommt auch nicht mehr.

    Wenn ich aber vom DBGrid in ein Edit-Feld wechsel ist die ausgewählte Zeile wieder nicht markiert.



  • void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
          const TRect &Rect, int DataCol, TColumn *Column,
          TGridDrawState State)
    {
    if(State.Contains(gdSelected))
    {
       DBGrid1->Canvas->Brush->Color = clHighlight;
       DBGrid1->Canvas->Font->Color = clHighlightText;
    }
    else
    {
       DBGrid1->Canvas->Brush->Color = clWindow;
       DBGrid1->Canvas->Font->Color = clWindowText;
    }
    DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
    }
    


  • Wie wärs einfach mit Options dgAlwaysShowSelection=true ?



  • VergissEs schrieb:

    Wie wärs einfach mit Options dgAlwaysShowSelection=true ?

    @VergissEs

    VergissEs



  • @bcbler
    haste dir schon mal die Frage von Thread-Ersteller durchgelesen?

    und was macht nun dgAlwaysShowSelection=true ?

    genau das was der Thread-Ersteller wollte, nämlich nach den DBGrid Focus verlust weiterhin die selektierte Zeile darzustellen!


Anmelden zum Antworten