MultiSelected modunda DBGrid boyama.

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

MultiSelected modunda DBGrid boyama.

Mesaj gönderen name »

İyi çalışmalar.
Aşağıdaki kodu istediğim bir satırın renklendirilmesi için kullanıyorum. Kod çalışıyor. Ancak çoklu seçim yapıldığında sadece aktif satır seçili gözüküyor. Yani çoklu seçim yapılıyor fakat sadece tek bir satır seçilmiş gibi boyama yapılıyor. Bu problem koddanda anlaşılacağı gibi sadece bu "Fieldbyname('ISPRINT').AsInteger = 0" şartın sağlandığı satırlarda oluşuyor. Çoklu seçim var ise aşağıdaki kodun seçili satırlara uygulanmasını istemiyorum. Ne yaptıysam bunu başaramadım. Yardımcı olacak arkadaşlara şimdiden teşekkürler.

Kod: Tümünü seç

procedure TGelir_List.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
begin
  if gdselected in State then exit;
  with DBGrid1 do
    begin
      if DataSource.DataSet.Fieldbyname('ISPRINT').AsInteger = 0 then
        begin
          canvas.Brush.Color := $00FFD5D5;
          canvas.Font.Color := clblack;
          defaultdrawcolumncell(rect, datacol, column, state);
        end;
    end;

  label1.Caption := format('%d', [DBGrid1.SelectedRows.Count]);
end;
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Çok uzun zaman olduğu standartgrid i kullanmayalı unuttum class özelliklerini :) Akıma gelen bi alicengiz örneği vereyim. Bir byte yada boolean field tanımla, kullanıcı bunun üzerinde space e yada dblclick yaptığında bu alanın içindeki değeri değiştirirsin. Boyama yaptığın yerde is bu alana göre işlem yaptırtabilirsin.

birde gönderdiğin kodda gözüme takılan
if gdselected in State then exit;
with DBGrid1 do
begin
if DataSource.DataSet.Fieldbyname('ISPRINT').AsInteger = 0 then
begin
canvas.Brush.Color := $00FFD5D5;
canvas.Font.Color := clblack;
defaultdrawcolumncell(rect, datacol, column, state);
end;
end;

Kod: Tümünü seç

if DBGrid1.DataSource.DataSet.Fieldbyname('ISPRINT').AsInteger = 0 then
yerine

Kod: Tümünü seç

if Query1.Fieldbyname('ISPRINT').AsInteger = 0 then
neden kullanmadın ? kodu bazen uzun yazmak yerine kısa yazmak daha anlaşılır oluyor
birde bu event e gelen TColumn da kullanılabilinir, tabi bu yapılmak istenene göre değişir

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
name
Kıdemli Üye
Mesajlar: 243
Kayıt: 09 Ağu 2003 02:11
Konum: İstanbul

Mesaj gönderen name »

@freeman35 Dediğiniz gibi bir işaret koyma olayı zaten çoklu seçim yapılırken "DBGrid1.SelectedRows" özelliğinde bileşen tarafından otomatikmen yapılıyor. Aşağıdaki kod ile istediğimi yapmayı başardım. Boyama işleminin yapılıp yapılmamasını sağlayan "if gdselected in State then exit;" satırı yerine bu "if SelectedRows.Find(qry_gelir_list.Bookmark, i) then exit;" daha çok işe yarıyor bundan sonra bu şekilde kullanıcam. Ayrıca gördümki benzeri işlemlerde bookmark kullanmak oldukça zaman kazandırıyor.

Birde kısa kod yazmak benim için bir takıntı. Kodu hızlı yazdığım için gözden kaçmış. Ancak uzun kullanım da bazen avantaj sağlayabilir.

Kod: Tümünü seç

procedure TGelir_List.DBGrid1DrawColumnCell(Sender: TObject;const Rect: TRect; DataCol: Integer; Column: TColumn;State: TGridDrawState);
var
  i: integer;
begin
  with DBGrid1 do
    begin
      if SelectedRows.Find(qry_gelir_list.Bookmark, i) then exit;
      if qry_gelir_list.Fieldbyname('ISPRINT').AsInteger = 0 then
        begin
          canvas.Brush.Color := $00FFD5D5;
          canvas.Font.Color := clblack;
          defaultdrawcolumncell(rect, datacol, column, state);
        end;
    end;
end;
Cevapla