Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
CxGrid CustomDrawCell kullanımı
#1
Quantum Grid(CxGrid) içinde CustomDrawCell ile belirli kritere uyan satırların tamamını veya belirli kriterlere uyan satırdaki bir veya birkaç hücreyi boyama yapmak istediğimde doğru sonucu alamıyorum. Neyi eksik yapıyorum anlamadım.

procedure TfrmX.grdXCustomDrawCell(
 Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
 AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
 AMultiLine, AShowEndEllipsis: Boolean;
begin
 if kosullu boyama olmalı then
 begin
   //x hücresinde font rengi kırmızı olsun. Fakat X hücresini nereden anlarım. AViewInfo veya Sender ile mi?
   AMultiLine := False;
   AShowEndEllipsis := True;
   ACanvas.Font.Color := clRed;
   ACanvas.DrawTexT(AViewInfo.Text, AViewInfo.Bounds, taLeftJustify, vaCenter, AMultiLine, AShowEndEllipsis);
   //buradaki boyama çalışıyor fakat. boyaması gereken satır haricindekileride anlamsız bir şekilde boyuyor.
 end;
end;

//aşağıdaki kod doğru çalışırken neden yukarıdaki klasik gird renklendirme için kullanılan drawcell işlemini doğru bir şekilde yapamıyorum.
procedure TfrmImlBitAgirlikSaseleri.grdTVBaseStylesGetContentStyle(
 Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
 AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
begin
  //burada boyama işlemi doğru bir şekilde oluyor.
  //fakat burada da "ARecord.Values[1]" bu şekilde kullanmak istemiyorum dinamik olmalı kolonların sırası değişebilir. Burası unutalabilir.
  //bu nedenle ben field name bilgisini referans alarak işlem yapamaz mıyım?
 if ARecord.Index > 0 then
 begin
   if ARecord.ValueCount > 0 then
   begin
     if ((ARecord.Values[1]) = True) then  //iptal edilenler kırmızı renkle gösterilsin
       AStyle := cxstylRed;
   end;
 end;
end;
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#2
Performans açısında OnGetContentStyle tavsiye edildiği için onu kullanmanı tavsiye ederim.
ARecord.Values'teki indeksi, sütun isminden giderek bulabilirsin:
ARecord.Values[IlgiliSutunIsmi.Index]
There's no place like 127.0.0.1
WWW
Cevapla
#3
(09-06-2020, Saat: 18:18)3ddark Adlı Kullanıcıdan Alıntı: Quantum Grid(CxGrid) içinde CustomDrawCell ile belirli kritere uyan satırların tamamını veya belirli kriterlere uyan satırdaki bir veya birkaç hücreyi boyama yapmak istediğimde doğru sonucu alamıyorum. Neyi eksik yapıyorum anlamadım.

procedure TfrmX.grdXCustomDrawCell(
 Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
 AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
 AMultiLine, AShowEndEllipsis: Boolean;
begin
 if kosullu boyama olmalı then
 begin
   //x hücresinde font rengi kırmızı olsun. Fakat X hücresini nereden anlarım. AViewInfo veya Sender ile mi?
   AMultiLine := False;
   AShowEndEllipsis := True;
   ACanvas.Font.Color := clRed;
   ACanvas.DrawTexT(AViewInfo.Text, AViewInfo.Bounds, taLeftJustify, vaCenter, AMultiLine, AShowEndEllipsis);
   //buradaki boyama çalışıyor fakat. boyaması gereken satır haricindekileride anlamsız bir şekilde boyuyor.
 end;
end;

//aşağıdaki kod doğru çalışırken neden yukarıdaki klasik gird renklendirme için kullanılan drawcell işlemini doğru bir şekilde yapamıyorum.
procedure TfrmImlBitAgirlikSaseleri.grdTVBaseStylesGetContentStyle(
 Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
 AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
begin
  //burada boyama işlemi doğru bir şekilde oluyor.
  //fakat burada da "ARecord.Values[1]" bu şekilde kullanmak istemiyorum dinamik olmalı kolonların sırası değişebilir. Burası unutalabilir.
  //bu nedenle ben field name bilgisini referans alarak işlem yapamaz mıyım?
 if ARecord.Index > 0 then
 begin
   if ARecord.ValueCount > 0 then
   begin
     if ((ARecord.Values[1]) = True) then  //iptal edilenler kırmızı renkle gösterilsin
       AStyle := cxstylRed;
   end;
 end;
end;

Merhabalar,

Umarım yanlış anlaşılma olmamıştır.

Örnek kod olarak da paylaşım mevcut.

Umarım faydası olur.
Kolay gelsin.


   


.zip   cxGridCellColor_Sample.zip (Dosya Boyutu: 54,48 KB / İndirme Sayısı: 94)
Amaç, bilginin de/aklın da zekat'ını vermek.
Cevapla
#4
(09-06-2020, Saat: 23:33)hi_selamlar Adlı Kullanıcıdan Alıntı:
(09-06-2020, Saat: 18:18)3ddark Adlı Kullanıcıdan Alıntı: Quantum Grid(CxGrid) içinde CustomDrawCell ile belirli kritere uyan satırların tamamını veya belirli kriterlere uyan satırdaki bir veya birkaç hücreyi boyama yapmak istediğimde doğru sonucu alamıyorum. Neyi eksik yapıyorum anlamadım.

procedure TfrmX.grdXCustomDrawCell(
 Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
 AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
 AMultiLine, AShowEndEllipsis: Boolean;
begin
 if kosullu boyama olmalı then
 begin
   //x hücresinde font rengi kırmızı olsun. Fakat X hücresini nereden anlarım. AViewInfo veya Sender ile mi?
   AMultiLine := False;
   AShowEndEllipsis := True;
   ACanvas.Font.Color := clRed;
   ACanvas.DrawTexT(AViewInfo.Text, AViewInfo.Bounds, taLeftJustify, vaCenter, AMultiLine, AShowEndEllipsis);
   //buradaki boyama çalışıyor fakat. boyaması gereken satır haricindekileride anlamsız bir şekilde boyuyor.
 end;
end;

//aşağıdaki kod doğru çalışırken neden yukarıdaki klasik gird renklendirme için kullanılan drawcell işlemini doğru bir şekilde yapamıyorum.
procedure TfrmImlBitAgirlikSaseleri.grdTVBaseStylesGetContentStyle(
 Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
 AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
begin
  //burada boyama işlemi doğru bir şekilde oluyor.
  //fakat burada da "ARecord.Values[1]" bu şekilde kullanmak istemiyorum dinamik olmalı kolonların sırası değişebilir. Burası unutalabilir.
  //bu nedenle ben field name bilgisini referans alarak işlem yapamaz mıyım?
 if ARecord.Index > 0 then
 begin
   if ARecord.ValueCount > 0 then
   begin
     if ((ARecord.Values[1]) = True) then  //iptal edilenler kırmızı renkle gösterilsin
       AStyle := cxstylRed;
   end;
 end;
end;

Merhabalar,

Umarım yanlış anlaşılma olmamıştır.

Örnek kod olarak da paylaşım mevcut.

Umarım faydası olur.
Kolay gelsin.

Ayrıca sizin örnek kodunuzda FilterRow özelliği aktif edildiğinde AItem <> nil kontrolü eklemek gerekir. Aksi durumda AItem ilk filtre satırında nil olarak geliyor ve hataya neden oluyor.

Bu şekilde kullandım ve işimi gördü. Sabit index bilgileri yerine FieldName bağlı Column bulup onun indexi üzerinden işlemi yapıyorum.
Fakat klasik şekilde boyama kodu event var ve doğru çalışmıyor veya kullanmanı tavsiye etmiyorsa, DevEx bu özelliği son kullanıcıya göstermemeli. DevEx için çok daha faydalı olacaktır. Kullanıcı da benim gibi neden olmuyor diye bocalamaz.

procedure TfrmX.grdXStylesGetContentStyle(
 Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
 AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
var
 ADate: TDate;
 AColIptal, AColDurumID, AColTarih: TcxGridDBColumn;
begin
 //iptal edilenler kırmızı renkle gösterilsin
 if ARecord.Index > 0 then  //üstteki filter barın boyanmaması için eklendi.
 begin
   if ARecord.ValueCount > 0 then  //datalar runtime getirildiği için bu kontrol eklendi. 0 gelme durumu oluyor.
   begin
     ADate := DateOf(Now);
     AColIptal := TcxGridDBTableView(Sender).GetColumnByFieldName('IsIptal_FieldName');
     AColDurumID := TcxGridDBTableView(Sender).GetColumnByFieldName('UretimDurumuID_FieldName');
     AColTarih := TcxGridDBTableView(Sender).GetColumnByFieldName('Tarih_FieldName');
     if (AColIptal <> nil) and (AColDurumID <> nil) and (AColTarih <> nil) then
       if ((ARecord.Values[AColIptal.Index]) = True)
       or ((ARecord.Values[AColDurumID.Index] <> Ord(TUretimDurumu.Bitti))
       and (ARecord.Values[AColTarih.Index] < ADate))
       then
       begin
         AStyle := cxstylRed;
       end;
   end;
 end;
end;
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla
#5
CustomDrawCell'de sıkıntı yaşamanızın sebebi ADone parametresini kullanmamış olmanız. Kendiniz boyama yaptığınız durumlarda ADone'ı True diğer durumlarda False yapmak lazım.
There's no place like 127.0.0.1
WWW
Cevapla
#6
(10-06-2020, Saat: 17:22)SimaWB Adlı Kullanıcıdan Alıntı: CustomDrawCell'de sıkıntı yaşamanızın sebebi ADone parametresini kullanmamış olmanız. Kendiniz boyama yaptığınız durumlarda ADone'ı True diğer durumlarda False yapmak lazım.

ADone ilk aşamada kullandım fakat aynı sıkıntıyı yaşadım.
PostgreSQL - Linux - Delphi, Poliüretan
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Pasfmt-rad Code Formatter kurulumu ve kullanımı Mr.X 4 762 10-04-2026, Saat: 16:22
Son Yorum: Mr.X
  Mikrotik – Lazarus-Delphi API Kullanımı SercanTEK 7 6.418 18-08-2024, Saat: 13:32
Son Yorum: SercanTEK
  BroadcastReceiver kullanımı AliZairov 3 4.924 15-12-2021, Saat: 20:24
Son Yorum: AliZairov
  Devexpress cxGrid Server Mode UniDac Component faktoral 14 14.704 05-11-2020, Saat: 11:44
Son Yorum: Halil Han BADEM
  Özelleştirilmiş ayarlarıyla Skype (ver.8) kullanımı sabanakman 1 2.993 31-01-2019, Saat: 07:55
Son Yorum: hi_selamlar



Konuyu Okuyanlar: 1 Ziyaretçi