Announcement

Collapse
No announcement yet.

Farbe in DBGRID und Multiselect

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Farbe in DBGRID und Multiselect

    hi delphiprofis

    ich habe ein dbgrid, in welchem ich in abhängigkeit eines bestimmten wertes die entsprechende zeile einfärbe.

    die geschieht über "DrawColumnCell".
    in dieser routine setze ich auch neue farbwerte für die selektierte zeile (if gdselected in state then ...). funktioniert alles super.

    jetzt mein problem:

    ich habe im grid multiselect auf true gestellt um mehrere zeilen zu selektieren und anschliessend zu löschen. sobald ich mit dem selektieren beginne, färben sich die ausgewählten zeilen nicht andersfarbig ein(standard ist ja blau), so dass man anhand der färbung nicht erkennt ob eine zeile selektiert ist oder nicht.

    was muss ich beachten um mein ziel zu erreichen?

    gruss

    swen

  • #2
    Hi Sven,
    <br>
    könntest du bitte den ganzen Quelltext aus der Ereignisprozedur DrawColumnCell posten.
    <br>Mit dem kleinen Schnipsel kann man leider nicht viel anfangen.
    <br>
    <br>
    mfg & thx
    <br>Torste

    Comment


    • #3
      hi torsten

      hier kommt der quelltext dazu:

      <PRE>
      procedure THF.DBGDrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
      begin
      if ADO['NACH_AUDIS']= 1 then
      DBG.Canvas.Brush.Color := rgb(200,200,200)
      else
      DBG.Canvas.Brush.Color := rgb(255,255,255);
      if gdSelected in State then
      begin
      DBG.Canvas.Brush.Color := rgb(0,0,0);
      if ADO['NACH_AUDIS']= 1 then
      DBG.Canvas.font.Color := rgb(200,200,200)
      else
      DBG.Canvas.font.Color := rgb(255,255,255);
      end;

      DBG.DefaultDrawColumnCell(Rect, DataCol, Column, State);
      end;
      </PRE>

      wie gesagt das einfärben funktioniert wunderbar, aber wenn ich mehrere zeilen auswähle, ist die markierung nicht mehr sichtbar.

      ciao

      swe

      Comment


      • #4
        Hi Sven,

        ersetz mal die Zeile
        <PRE>
        DBG.DefaultDrawColmunCell(Rect, DataCol, Colums, State);
        </PRE>
        durch eine eigene Ausgaberoutine. Dann sollte es funktionieren. Mußt dann aber auch den Text selber ausgegen. Kann dir nur ein Beispiel in C++ posten. Interessiert?

        Joche

        Comment


        • #5
          hi jochen

          selbstverständlich bin ich daran interessiert.

          danke schon mal

          swe

          Comment


          • #6
            Hi Sven,
            <PRE>
            void __fastcall TForm_MainViewer:BGrid1DrawColumnCell(TObject *Sender,
            const TRect &Rect, int DataCol, TColumn *Column,
            TGridDrawState State)
            {
            if (Column->FieldName == "zug_endtermin" && Column->Field->AsDateTime <= TDateTime::CurrentDate() && Column->Field->AsFloat > 0)
            {
            TBrush* TempBrush = new TBrush();
            int TextWidth;

            if (Column->Field->AsDateTime < TDateTime::CurrentDate()) // roter Hintergrund weil Endtermin überschritten
            {
            if (State.Contains(gdFocused))
            {
            DBGrid1->Canvas->Font->Color = clYellow;
            TempBrush->Color = clBlack;
            }
            else
            {
            DBGrid1->Canvas->Font->Color = clWhite;
            TempBrush->Color = clRed;
            }
            }
            else // grüner Hintergrund weil Endtermin heute
            {
            if (State.Contains(gdFocused))
            {
            DBGrid1->Canvas->Font->Color = clWhite;
            TempBrush->Color = clBlack;
            }
            else
            {
            DBGrid1->Canvas->Font->Color = clBlack;
            TempBrush->Color = clLime;
            }
            }

            DBGrid1->Canvas->Brush = TempBrush;
            DBGrid1->Canvas->FillRect(Rect);
            TextWidth = Canvas->TextWidth(Column->Field->AsString);
            DBGrid1->Canvas->TextOutA((Rect.Left + ((Rect.Width() - TextWidth) / 2)), (Rect.Top + 2) , Column->Field->AsString);

            delete TempBrush;
            }
            else
            DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
            }
            </PRE>

            Ich hab' aus der Funktion alles irrelevante rausgelöscht - ist nicht die komplette Funktion...

            Dieses Beispiel gibt nur ein Feld mit anderer Hintergrundfarbe aus, abhängig davon, ob markiert und vom Wert des Feldes. Falls keine der Bedingungen erfüllt wird, verwende ich DefaultDrawColumnCell. Mit Multi-Select darfst Du die aber (glaube ich) nicht aufrufen, sondern mußt auch die Standardausgabe selbst machen. Der Text wird in dem obigen Bsp grundsätzlich zentriert ausgegeben.

            Ich hoffe, Du kannst was damit anfangen.

            Grüße Joche

            Comment


            • #7
              hi jochen

              dein beispiel nutzt mir leider nichts, da dein code genau das selbe bezweckt wie mein eigener.
              das was ich brauche ist eben das angesprochene multiselect.
              das problem ist eigentlich folgendes:

              ich färbe bestimmte zeilen grau ein. alle zeilen welche nicht dem kriterium entsprechen müssen extra weiss gefärbt werden. durch die abfrage ob eine zeile markiert ist kann ich sie extra hervorheben. beim multiselect ist diese hervorhebung nicht möglich, da die selektierten zeilen nicht als markiert durchgehen(warum auch immer). also werden sie default-mässig gefärbt(hintergrund weiss). die schrift wird durch multiselect aber ebenfalls weiss. du siehst, daß alles ist irgendwie nicht befriedigend.

              mfg

              swe

              Comment


              • #8
                Hi Sven,

                um die zu ermitteln mußt du die BookmarkList des DBGrids auswerten. Die verbirgst sich hinter der Eigenschaft SelectedRows. Damit solltest Du in der Lage sein den Wert des Primärindex auszulesen (der selektierten Zeilen), und mit dem aktuellen Wert des Primärindexes der aktuell zu zeichnenden Zeile zu vergleichen und entsprechend die Zeile einzufärben.

                Joche

                Comment

                Working...
                X