Announcement

Collapse
No announcement yet.

Bitmap in einem TDBGrid darstellen

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

  • Bitmap in einem TDBGrid darstellen

    Hallo,

    wie kann ich ganz einfach in einem TDBGrid
    eine Spalte mit Bitmaps füllen.

    Ich habe eine Spalte mit den Inhalten 1, 2 und 3 und
    möchte statt der Zahl eine entsprechende Grafik
    einsetzen.

    Wie kann ich unter Delphi 5 das schnellst möglich
    lösen ?

    Danke.

  • #2
    Hallo,

    indem eine Ereignisbehandlungsmethode für das <b>OnDrawColumnCell</b>-Ereigniss vom TDBGrid geschrieben wird. Dies könnte zum Beispiel so aussehen (wenn man eine eigene Komponente von TDBGrid ableiten will):
    <pre>
    procedure TOSBmpDBGrid.DrawColumnCell(const Rect: TRect; DataCol: Integer;
    Column: TColumn; State: TGridDrawState);
    var
    aBmp : TBitmap;
    OutRect : TRect;
    begin
    if FLinesPerRow = 1 then
    inherited DrawColumnCell(Rect, DataCol, Column, State)
    else
    begin
    if Columns[DataCol].FieldName = FIconFieldName then
    begin
    Canvas.FillRect(Rect);
    OutRect := Rect;
    InflateRect (OutRect, -2, -2);
    if (Column.Field is TGraphicField) or
    (Column.Field is TBlobField) then
    begin
    if not Column.Field.IsNull then
    begin
    aBmp := TBitmap.Create;
    try
    aBmp.Assign(Column.Field);
    Canvas.Draw(OutRect.Left, OutRect.Top, aBmp);
    finally
    aBmp.Free;
    end;
    end;
    end
    end
    else
    // Zeile vertikal zentriert ausgeben
    DrawText(Canvas.Handle,
    PChar(Column.Field.DisplayText),
    Length(Column.Field.DisplayText),
    OutRect, dt_vcenter or dt_SingleLine or dt_NoPrefix);
    end;
    end;
    </pre&gt

    Comment


    • #3
      Sehr geehrter Herr Kosch,

      vielen Dank für Ihre Antwort. Leider ist diese Thematik für
      mich ziemlich neu. Das o.g. Beispiel funktioniert bei mir
      leider nicht so. Größtes Problem ist mein Spalte. Die Spalte mit
      dem Werten (1,2 und 3) ist eine Integerspalte, wie bekomme ich
      es also hin, das ich in diese Spalte zeichnen kann ?

      Vielen Dank für die Rückantwort

      Comment


      • #4
        Sehr geehrter Herr Kosch,

        vielen Dank für Ihre Antwort. Leider ist diese Thematik für
        mich ziemlich neu! Das o.g. Beispiel funktioniert beim mir
        nicht! Meine Spalte auf die ich Zugreife ist eine Integerspalte
        Werte 1 oder 2 oder 3. Wie stell ich es an, dass ich in diese
        Spalte zeichen kann ?
        Bei mir wird nur die Spalte geleert. Das Programm verzweigt dann
        nicht in die If Schleife das es sich um eine Integerspalte handelt!

        Vielen Dank für Ihre erhoffe Rückantwort

        Comment


        • #5
          Hallo,

          das folgende vollständige Beispielprojekt ist übersichtlicher. Immer dann, wenn in der Tabellenspalte "RISK_LEVEL" der Wert "LOW" vorgefunden wird, soll eine andere Grafik im TDBGrid angezeigt werden als beim Eintrag "MED":
          <pre>
          unit OwnerDrawDBGridForm;

          interface

          uses
          Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          Grids, DBGrids, Db, DBTables, ImgList, ExtCtrls, DBCtrls;

          type
          TForm1 = class(TForm)
          Table1: TTable;
          DataSource1: TDataSource;
          DBGrid1: TDBGrid;
          ImageList1: TImageList;
          DBNavigator1: TDBNavigator;
          procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
          private
          { Private-Deklarationen}
          public
          { Public-Deklarationen}
          end;

          var
          Form1: TForm1;

          implementation

          {$R *.DFM}

          { DefaultDrawing = FALSE }

          procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumn; State: TGridDrawState);
          begin
          with Sender as TDBGrid do
          begin
          if Columns[DataCol].FieldName = 'RISK_LEVEL' then
          begin
          Canvas.FillRect(Rect);
          if Columns[DataCol].Field.Value = 'LOW' then
          ImageList1.Draw(Canvas, Rect.Left + 4, Rect.Top, 0, True)
          else
          if Columns[DataCol].Field.Value = 'MED' then
          ImageList1.Draw(Canvas, Rect.Left + 4, Rect.Top, 2, True)
          else
          ImageList1.Draw(Canvas, Rect.Left + 4, Rect.Top, 4, True);
          end
          else
          DefaultDrawColumnCell(Rect, DataCol, Column, State);
          end;
          end;

          end.
          </pre>
          Die Grafiken kommen dabei aus der TImageList-Instanz

          Comment

          Working...
          X