29.04.2017, Vladimír Klaus, navštíveno 2508x

Delphi

Komponenta cxGrid je skvělá, má i docela zajímavé možnosti jak nastavit jiný styl pro určité části mřížky (pozadí, řádky, záhlaví, skupiny apod.). Vytvoříte si příslušný styl přes TcxStyleRepository a pak přiřadíte. Na tom není nic těžkého.

Pokud ale chcete daný styl aplikovat jen za určitých podmínek, je to už trochu programování. Slouží k tomu událost/metoda OnGetContentStyle. V níže uvedeném příkladu si nejprve zjistím hodnu pole "JeZExcelu". Pak ověřím, zda je hodnota opravdu typu bool, což je velmi důležité. Kdyby totiž něco selhalo nebo byl aplikován filtr nebo bych žádnou řádku neměl, tak bych v proměnné v mohl mít třeba null a to by hned dále pěkně krachlo.

procedure TMainForm.SmlouvyGridViewStylesGetContentStyle(
  Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord;
  AItem: TcxCustomGridTableItem; var AStyle: TcxStyle);
var
  AColumn: TcxCustomGridTableItem;
  v: variant;

begin
  //záznamy mimo import z Excelu budou fialové
  AColumn:=(Sender as TcxGridDBTableView).GetColumnByFieldName('JeZExcelu');
  v:=ARecord.Values[AColumn.Index];
  if VarType(v)=varBoolean then begin
    if not v then begin
      AStyle:=cxStyleMimoExcel;
    end;
  end;
end;

Záznamy v mřížce pak vypadají takto. A to nám také většinou úplně stačí.

Jenže velice brzy narazíte na problém, že když budete mít danou řádnou vybranou, použitý styl se neaplikuje. To samozřejmě nemusí vadit, ale pokud je pro vás zvýraznění nějakým důležitým signálem, je třeba ho vidět i pokud je řádek vybraný.

Zdánlivě by se vše dalo řešit jen tím, že se ve výše uvedeném příkladu ještě zeptám "if ARecord.Selected" a pak bych aplikoval zase třeba ještě jiný styl, jenže bohužel to funguje jen částečně a vývojáři DevEx toto zatím nechtějí řešit. Tak se musí přistoupit k dalšímu programování. Tentokrát se musí použít událost/metoda OnCustomDrawCell, ve které se opět budeme ptát na obsah pole JeZExcelu a pokud nebude, tak nastavíme barvu písma stejnou, jako máme v našel stylu "cxStyleMimoExcel".

procedure TMainForm.SmlouvyGridViewCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
var
  v: variant;

begin
  v:=AViewInfo.GridRecord.Values[KlientiGridViewJeZExcelu.Index];
  if AViewInfo.Selected then begin
    if VarType(v)=varBoolean then begin
      if not v then begin
        ACanvas.Font.Color:=cxStyleMimoExcel.TextColor;
        //ACanvas.FillRect(AViewInfo.Bounds, clYellow);
      end;
    end;
  end;
end;

V ukázce je i naznačeno, jak se dá nejen změnit barva písma, ale pozadí celé selektované řádky na žlutou.

Asi je z uvedeného příkladu zřejmé, že by se vše mohlo řešit jen přes OnCustomDrawCell, ale já jsem chtěl ukázat všechny tři postupné kroky, při práci se styly.