Announcement

Collapse
No announcement yet.

DBGrid und Farben ändern der Zellen

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

  • DBGrid und Farben ändern der Zellen

    Hallo!

    Wie kann ich bewirken, daß bei einem bestimten Wert, der aus einer Tabelle stammt und in einem DBGrid angezeigt werden soll, daß dieser in einer bestimmten Farbe angezeigt wird????
    Ein Beispiel wäre sehr nett, danke.
    Gruß,
    Marco

  • #2
    Hallo Markus,

    dazu musst Du das Event DrawColumnCell des DBGrids verwenden. In dem Beispiel unten wird ein boolscher Wert durch ein schöneres Bitmap ersetzt.

    procedure TFormMitarbeiterBrowser.grdSelectDrawColumnCell(Se nder: TObject;
    const Rect: TRect; DataCol: Integer; Column: TColumn;
    State: TGridDrawState);
    var
    x, y: Integer;
    begin
    inherited;

    if Column.Fieldname = 'STATUS' then
    begin
    x := Rect.Left + (Rect.Right - Rect.Left - 16) div 2;
    y := Rect.Top + (Rect.Bottom - Rect.Top - 16) div 2;
    // die häßliche "1" entfernen
    grdSelect.Canvas.FillRect(Rect);

    grdSelect.Canvas.CopyMode := cmMergeCopy;
    if Column.Field.AsInteger >= 1 then
    grdSelect.Canvas.Draw(x, y, ImgOK)
    else
    grdSelect.Canvas.Draw(x, y, ImgCancel)
    end;
    end;

    Ciao Torste

    Comment


    • #3
      Könnte mir jemand ein Simples Beispiel schreiben, daß bei einem die Zellenfarbe (eine einzelne Zelle irgendwo im Grid) ab einem Bestimmten Wert wechselt????
      Ich brauche diese Hilfe sehr! Meine Mail: [email protected]

      Vielen Dank

      Comment


      • #4
        <pre>
        <font size = 2>
        procedure TfAngebot.DBGrid2DrawDataCell(Sender: TObject; const Rect: TRect;
        Field: TField; State: TGridDrawState);
        begin
        if angebot.fieldByname ('anum').AsInteger mod 2 = 0
        then dbgrid2.Canvas.brush.Color := clBlue
        else dbgrid2.Canvas.brush.Color := clRed;
        dbgrid2.Canvas.FillRect(rect);
        dbgrid2.Canvas.TextOut(rect.Left+1,rect.top+1,fiel d.asstring);
        end;
        </pre>
        </font>
        <p>
        Eigenschaft defaultDrawing muß auf false stehen!
        Mit Canvas.font.color läßt sich alternativ die textfarbe verstellen

        Comment


        • #5
          Hallo,

          erst einmal Danke für Deine Hilfe Karsten.
          Ich schaffe es irgendwie aber nicht ganz.... die Zeile: <br>dbgrid2.Canvas.TextOut(rect.Left+1,rect.top+1, field.asstring);<br>
          funktioniert bei mir an der Stelle ....,field.asstring) nicht. <br>
          Was soll diese Anweisung bewirken????
          <br><br>
          Viele Grüße,<br>
          Marc

          Comment


          • #6
            <p>Hallo Marco,<br>
            <br>
            für "Field.AsString" mußt Du das Tabellenfeld einsetzen, dass Du in dieser Spalte anzeigen willst.<br>
            <br>
            Gruß Thomas</p&gt

            Comment


            • #7
              Hallo Thomas,

              danke, das hat weitergeholfen! Aber meine Felder wechseln immer noch nicht die Farbe, ab einem bestimmten Wert.Meine Prozedure sieht jetzt so aus:<br><br>procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;<br>
              DataCol: Integer; Column: TColumn; State: TGridDrawState);<br>
              begin<br>
              if InterTab.FieldByName('DIF_IN_AB').AsInteger >1000 then<br>
              DBGrid1.Canvas.Font.Color := clRed;<br>
              DBGrid1.Canvas.FillRect(rect);<br>
              DBGrid1.Canvas.TextOut(rect.Left+1,rect.top+1,'DIF _IN_AB');<br>
              end;<br><br>
              Kannst Du mir da vielleicht noch einen Tip geben?
              <br><br>
              Gruß,
              Marc

              Comment


              • #8
                <p>Hallo Marco,<br>
                <br>
                folgendes Beispiel müsste eigentlich tun:<br>
                <br>
                <pre>
                procedure TDatenEditDlg.StammGridDrawColumnCell(Sender: TObject;
                const Rect: TRect; DataCol: Integer; Column: TColumn;
                State: TGridDrawState);
                var aFarbe:TColor;
                begin
                { Datacol gibt die Nummer des Feldes (beginnend ab 0) in der
                Tabelle zurück
                Im Beispiel wird das 1. Feld in der Tabelle angenommen }
                if (DataCol=0) then
                begin
                if (InterTab.Fields[0].AsInteger>1000) then aFarbe:=clRed else
                aFarbe:=clBlack;
                end else aFarbe:=clBlack;
                with TDBGrid(Sender), Canvas do
                begin
                Font.Color:=tc;
                FillRect(Rect);
                TextOut(Rect.Left+1, Rect.Top+1, InterTab.Fields[DataCol].AsString);
                end;
                end;
                </pre>
                <br>
                Bei mir tut's.<br>
                <br>
                Gruß Thomas</p&gt

                Comment


                • #9
                  <p>Hallo Marco,<br>
                  <br>
                  folgendes Beispiel müsste eigentlich tun:<br>
                  <br>
                  <pre>
                  procedure TDatenEditDlg.StammGridDrawColumnCell(Sender: TObject;
                  const Rect: TRect; DataCol: Integer; Column: TColumn;
                  State: TGridDrawState);
                  var aFarbe:TColor;
                  begin
                  { Datacol gibt die Nummer des Feldes (beginnend ab 0) in der
                  Tabelle zurück
                  Im Beispiel wird das 1. Feld in der Tabelle angenommen }
                  if (DataCol=0) then
                  begin
                  if (InterTab.Fields[0].AsInteger>1000) then aFarbe:=clRed else
                  aFarbe:=clBlack;
                  end else aFarbe:=clBlack;
                  with TDBGrid(Sender), Canvas do
                  begin
                  Font.Color:=tc;
                  FillRect(Rect);
                  TextOut(Rect.Left+1, Rect.Top+1, InterTab.Fields[DataCol].AsString);
                  end;
                  end;
                  </pre>
                  <br>
                  Bei mir tut's. Denke daran, im Grid die Eigenschaft <b>DefaultDrawing</b> auf False zu setzen.<br>
                  <br>
                  Gruß Thomas</p&gt

                  Comment


                  • #10
                    <p>Hallo Marco,<br>
                    <br>
                    folgendes Beispiel müsste eigentlich tun:<br>
                    <br>
                    <pre>
                    procedure TDatenEditDlg.StammGridDrawColumnCell(Sender: TObject;
                    const Rect: TRect; DataCol: Integer; Column: TColumn;
                    State: TGridDrawState);
                    var aFarbe:TColor;
                    begin
                    { Datacol gibt die Nummer des Feldes (beginnend ab 0) in der
                    Tabelle zurück
                    Im Beispiel wird das 1. Feld in der Tabelle angenommen }
                    if (DataCol=0) then
                    begin
                    if (InterTab.Fields[0].AsInteger>1000) then aFarbe:=clRed else
                    aFarbe:=clBlack;
                    end else aFarbe:=clBlack;
                    with TDBGrid(Sender), Canvas do
                    begin
                    Font.Color:=aFarbe;
                    FillRect(Rect);
                    TextOut(Rect.Left+1, Rect.Top+1, InterTab.Fields[DataCol].AsString);
                    end;
                    end;
                    </pre>
                    <br>
                    Bei mir tut's. Denke daran, im Grid die Eigenschaft <b>DefaultDrawing</b> auf False zu setzen.<br>
                    <br>
                    Gruß Thomas</p&gt

                    Comment


                    • #11
                      Hallo Thomas!

                      Danke für das super Beispiel. Das bewirkt fast das was ich möchte.
                      Die Farbe ändert sich bei deinem Beispiel in der ersten Spalte des Grids. Ich möchte, daß sich die Farbe in der letzten oder auch einer andern Spalte ändert. Wie muß ich da vorgehen???
                      Ach ja, wenn ich DefaultDrawing auf False setze und das Programm dann starte, sehe ich nur noch die Gitter des Grids aber den Inhalt nicht.
                      Ich habe den Wertt wieder auf True gesetzt und das ganze Funktioniert.
                      Merkwürdige Angelegenheit ?!?!?!

                      Gruß,
                      Marc

                      Comment


                      • #12
                        <p>Hallo Marco,<br>
                        <br>
                        Datacol gibt das Feld in der Tabelle zurück. Wenn Deine Tabelle z.B. 5 Felder besitzt, dann musst Du "Datacol=4" abfragen um das letzte Feld zu bekommen, da der Index bei 0 beginnt.<br>
                        <br>
                        0=1. Feld in der Tabelle<br>
                        1=2. Feld in der Tabelle<br>
                        usw...<br>
                        <br>
                        Ich hoffe, ich konnte mich verständlich ausdrücken.<br>
                        <br>
                        Gruß Thomas</p&gt

                        Comment


                        • #13
                          Hi Thomas,<br>
                          <br>
                          du hast dich sehr verständlich ausgedrückt.<br>
                          Ich denke, daß war heute meine letzte Frage.<br>
                          Hast mir sehr geholfen.<br>
                          Noch mals danke!<br>
                          <br>
                          Viele Grüße,<br>
                          Marc

                          Comment

                          Working...
                          X