Announcement

Collapse
No announcement yet.

Einzelne Zellen im DBGrid farbig markieren

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

  • Einzelne Zellen im DBGrid farbig markieren

    Ich möchte in einem DBGrid zur Laufzeit die Hintergrundfarbe einzelner Zellen ändern. Z.B. sollen Zellen, deren Daten einen bestimmten Wert unterschreiten rot markiert werden.

    Ist das möglich? (Wahrscheinlich ja) Aber wie ?

  • #2
    Hallo,

    dazu kann das TDBGrid-Ereignis <b>OnDrawColumnCell</b> verwendet werden. Über den Parameter <b>DataCol</b> kann die Spalte ausgewertet werden, um dann den Hintergrund für diese Zelle immer dann einzufärben, wenn in diesem Datensatz ein bestimmter Wert vorgefunden wird:
    <pre>
    procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
    DataCol: Integer; Column: TColumn; State: TGridDrawState);
    begin
    if DataCol = 5 then
    if Table1AmountPaid.Value > 1000 then
    DBGrid1.Canvas.Brush.Color := clRed;
    DBGrid1.DefaultDrawColumnCell(Rect, Datacol, Column, State);
    end;
    </pre&gt

    Comment


    • #3
      Hallo Herr Kosch,

      vielen Dank für die schnelle Unterstützung.
      Allerdings kann ich das Beispiel noch nicht kompilieren, zwei Probleme treten auf:

      1. Woher beziehe ich Table1AmountPaid.Value? Der Bezeichner ist dem Compiler nicht bekannt.
      (Ich arbeite mit einer Paradox-Tabelle namens DatenModul.HeadData, die über DatenModul.DataSourceHeadData dem DBGrid zugewiesen wird.)

      2. Der Compiler liefert in der Zeile

      DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

      folgende Fehlermeldung:

      [Fehler] Main.pas(563): Inkompatible Typen: 'DBGrids.TColumn' und 'DBVGrids.TColumn'
      (Der Cursor steht dabei hinter Column.)

      Haben Sie dazu eine Idee

      Comment


      • #4
        Hallo Herr Kosch,

        vielen Dank für die schnelle Unterstützung.
        Allerdings kann ich das Beispiel noch nicht kompilieren, zwei Probleme treten auf:

        1. Woher beziehe ich Table1AmountPaid.Value? Der Wert ist dem Compiler nicht bekannt.
        (Ich arbeite mit einer Paradox-Tabelle namens DatenModul.HeadData, die über DatenModul.DataSourceHeadData dem DBGrid zugewiesen wird.)

        2. Ich bekomme eine Compilermeldung in der Zeile

        DBGrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);

        [Fehler] Main.pas(563): Inkompatible Typen: 'DBGrids.TColumn' und 'DBVGrids.TColumn'
        (Der Cursor steht dabei hinter Column.)

        Haben Sie dazu eine Idee

        Comment


        • #5
          Hallo,

          in meinem Beispiel verbirgt sich hinter <i>Table1AmountPaid</i> eine persistente TField-Instanz. Ich habe mit einem Doppelklick auf TTable den <b>Feld-Editor</b> aufgerufen und für alle Spalten persistente TFields anlegen lassen. Somit kann ich nun einfach über <b>Value</b> auf den Wert dieses Feldes zugreifen.

          Wenn anstelle DBGrids eine <b>andere</b> Komponente (DB<b>V</b>Grids) verwendet wird, muss selbstverständlich dieser Teil an die eigene Komponente angepasst werden. Was verbirgt sich hinter DB<b>V</b>Grids

          Comment


          • #6
            Hallo,

            hinter DBVGrid (TVDBGrid ist eine Komponenete eines Griechen, aus dem Internet gezogen) verbirgt sich ein vertikales Grid, das heißt die "Tabelle" ist um 90 Grad gedreht. Allerdings verwende ich an dieser Stelle nach bestem Wissen das DBGrid aus der Komponente TDBGrid. Das DBGrid1 ist jedenfalls vom Typ TDBGrid und die procedure TFormMain.DBGrid1DrawColumnCell wird vom Ereignis OnDrawColumnCell eben des Original-DBGrid1 aufgerufen.

            Einen Zusammenhang sehe ich schon zur TVDBGrid. In der entsprechenden Unit DBVGrids sind sowohl die Procedure DefaultDrawColumnCell als auch die TColumns definiert. Ich habe aber keine Idee, wie es zu einer Vermischung der Column-Typen kommen kann.

            Würde im Notfall helfen, in der DBVGrids alle TColumn-Typen umzubenennen? Stell ich mir nicht so ganz trivial vor, zudem ich noch nicht sehr lange mit Delphi arbeite.

            Gibt es eine schlüssige Erklärung für das Compilerverhalten ?
            Gibt es eine sinnvolle Lösung ?

            Herzlichen Dank im voraus.

            Rüdige

            Comment


            • #7
              Hallo,

              in diesem Fall würde ich die Reihenfolge der Unit-Auflistung in der <b>Uses</b>-Deklaration so ändern, dass die Unit <i>DBGrids</i> (aus der TDBGrid stammt) <b>hinter</b> der Unit für TVDBGrid in der Auflistung steht

              Comment


              • #8
                Hallo,

                das ist ein guter und praktischer Weg, vielen Dank. Was wäre aber, wenn sich die Units nicht tauschen lassen, weil z.B. dann das gleiche Problem mit dem TVDGrid auftreten würde? Wäre dann ein Umbenennen aller oder spezieller Bezeichner im DBVGrid eine Lösung oder würden dann neue Probleme zu erwarten sein?

                Momentan habe ich das vertikale Grid wieder aus der Anwendung entfernt, weil ich die potentiellen Probleme in der Zukunft nicht abschätzen kann. Statt dessen wird die zu zeigende Tabelle um 90 Grad gedreht und in einem normalen Grid dargestellt. Das ist zwar mit Einschränkungen verbunden, die sind aber berechenbar

                Comment


                • #9
                  Hallo,

                  dieses Problem würde nicht auftreten, wenn TVDGrid exakt die gleiche Deklaration der Methoden und Parameter verwenden würde wie das Delphi-Original DBGrid. Vermutlich wurde TVDGrid mit einer älteren Delphi-Version entwickelt und dann nicht mehr auf den neuesten Stand gebracht.

                  Man kann diesen Problemen aus dem Weg gehen, wenn anstelle der Reihenfolge in der Uses-Aufzählung ein <b>qualifizierter Bezeichner</b> mit der Syntax <i>Unitname</i><b>.</b><i>Bezeichner</i> verwendet wird. In diesem Fall sucht Delphi unabhängig von der Uses-Reihenfolge immer in der durch <i>Unitname</i> definierten Unit.
                  &#10

                  Comment


                  • #10
                    Super, danke für den Hinweis

                    Comment

                    Working...
                    X