Jak uzyskać obraz z tłem zaznaczonego rekordu w DBGrid?

0

Witajcie,

Nie wiem jak inaczej wpisać temat ale najlepiej będzie zaprezentować to na screenach. Mam dbgrida, który wyciąga dane z bazy. W jednej z kolumn mam zamiast tekstu obrazek (bmp). User sam za pomocą klik może dane pole w bazie zaznaczyć/odznaczyć co prezentuje się jako "haczyk" (Screen 1). Problem jest taki, że jak zaznaczę rekord z "haczykiem" to jego tło jest białe a chciałbym aby było takie jak jest ustawione w dbgirdzie (screen 2). Kod poniżej:

procedure TfmRachunki.dbgMonthBillsDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'payed' then
  begin
    if qMonthBills.FieldByName('payed').AsString = 'T' then
    begin
        DelphiDrawBitmap(dbgMonthBills.Canvas,Rect,bmpOK,bmpOK.TransparentColor,
                       dbgMonthBills.Canvas.Brush.Color)
    end
    else
      dbgMonthBills.Canvas.FillRect(Rect);
  end
end;

Kombinowałem z bmpOK.TransparentColor ale nie bardzo mi to działało. A chciałbym uzyskać taki efekt zaznaczenia jak na screenie2 ale z "haczykiem" jak na screenie1 (czyli aby pod "haczykiem" nie było białego tła)

0

i oczywiście nie wpadłeś na to aby dać najważniejszy kawałek czyli kod DelphiDrawBitmap.

0
procedure TfmRachunki.DelphiDrawBitmap(DestCanvas: TCanvas; DestRect: TRect; Bitmap: TBitmap; Color, BkColor: TColor);
begin
  DestCanvas.Brush.Color := BkColor;
  DestCanvas.FillRect(DestRect);
  SimpDrawBitmap(DestCanvas, DestRect, Bitmap, Color);
end;

procedure TfmRachunki.SimpDrawBitmap(DestCanvas: TCanvas; DestRect: TRect; Bitmap: TBitmap; Color: TColor);
var
  Len: Integer;
  BitRect: TRect;
begin
  BitRect := Bitmap.Canvas.ClipRect;

  Len := BitRect.Right - BitRect.Left;
  if Len < DestRect.Right - DestRect.Left then
    DestRect.Right := DestRect.Left + Len;

  Len := BitRect.Bottom - BitRect.Top;
  if Len < DestRect.Bottom - DestRect.Top then
    DestRect.Bottom := DestRect.Top + Len;

  DestCanvas.BrushCopy(DestRect, Bitmap, BitRect, Color)
end;
0

a możesz wytłumaczyć dlaczego rysujesz metodą BrushCopy

0

Przyznam się bez bicia, że baaardzo dawno temu potrzebowałem zrobić rysowanie na DBGridzie i był tam jakiś problem więc poszukałem w necie i znalazłem gotowy skrypt. Z tego co pamiętam lekko go przerobiłem i śmigało. Niestety po tak długim okresie czasu nie jestem w stanie sobie przypomnieć dlaczego akurat BrushCopy ..

0

Nigdy nie używałem BrushCopy. Ale działało mi StretchDraw z z Transparent oraz TransparentColor bitmapy.

1

Rozwiązałem temat. Co prawda trzeba było lekko pokombinować ale działa bez problemu :)

procedure TfmRachunki.dbgMonthBillsDrawColumnCell(Sender: TObject;
  const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = 'payed' then
  begin
    if qMonthBills.FieldByName('payed').AsString = '  ' then
    begin
      imList.Draw(TDBGrid(Sender).Canvas,Rect.Left+2,Rect.Top+2,1,True);
    end
    else
      TDBGrid(Sender).Canvas.FillRect(Rect);
  end
end;

Kombinacje polegały na tym, że w zapytaniu mam case (dla payed) aby nie zwracał T/N tylko ' ' gdy jest na TAK i ' ' gdy jest na NIE. W przypadku obrazka w postaci "check" to przy transparentnym tle pojawiało się częściowo napisane T więc użyłem dwóch spacji aby nie było wizualnego efektu. imList to oczywiście TImageList.

1 użytkowników online, w tym zalogowanych: 0, gości: 1