سؤال

أرغب في الحصول على جميع الصفوف حيث يوجد اسم حقل معين "Hello" للحصول على اللون الأخضر الملون.لقد حاولت هذا customdrawcell:

if abstable1.fieldbyname('somename').asstring = 'Hello' then
  cxgrid.canvas.brush.color:=clGreen

لكنها لن تنجح...ما الذي أفتقده هنا؟

هل كانت مفيدة؟

المحلول

لا تحاول تغيير ألوان القماش في الشبكة.بالأحرى - وأجد هذا ل دائماً يكون صحيحا--تغيير الألوان في منظرمعالج OnDrawCell، كما في هذا المثال:

procedure T_fmTabSnapList.View1CustomDrawCell(Sender: TcxCustomGridTableView;
  ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if abstable1.fieldbyname('somename').asstring = 'Hello' then 
    ACanvas.Brush.Color := clGreen
end;

يعد cxGrid مجرد حاوية لطرق العرض.المشاهدات هي المكان الذي تحدث فيه كل اللوحة.س

نصائح أخرى

استخدم الحدث OnGetContentStyle للأعمدة الفردية أو لكائن الشبكة.يعد التعامل مع الأنماط أسهل بكثير من العبث باللوحة القماشية.

يتعين عليك إلقاء نظرة على البيانات الداخلية لكل صف عرض بدلاً من بيانات الموضع الحالي في الجدول.استفد أيضًا من اللوحة القماشية المتوفرة في حدث OnCustomDrawCell().

procedure TForm1.YourViewCustomDrawCell(
  Sender: TcxCustomGridTableView; ACanvas: TcxCanvas;
  AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean);
begin
  if(AViewInfo.GridRecord.Values[YourColumn.Index] = 'Hello') then
    ACanvas.Brush.Color := clGreen;
end;
procedure Tfm1.Grid1StylesGetContentStyle(Sender: TcxCustomGridTableView;
  ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem;
  out AStyle: TcxStyle);
Var
 Style1: TcxStyle;
begin
 if AItem = nil then exit;

 if ARecord.Values[Grid1Med.Index] = true then
   AStyle := cxStyleMed;

 if ARecord.Values[Grid1CP.Index] = true then
   AStyle := cxStyleHost;

 if (ARecord.Values[Grid1Med.Index] = true) and
    (ARecord.Values[Grid1CP.Index] = true) then
   AStyle := cxStyleHostAndCP;

  if not VarIsNull(ARecord.Values[colColor.Index]) then
  begin
    if not Assigned(AStyle) then
      AStyle := TcxStyle.Create(Sender);
    AStyle.Color := ARecord.Values[colColor.Index];
  end;
end;

إليك بعض أكواد العمل من أحد البرامج الخاصة بي والتي تقوم بشيء مماثل.

procedure TDoDockets.grDocketsDrawColumnCell(Sender: TObject;
            const Rect: TRect; DataCol: Integer; Column: TColumn;
            State: TGridDrawState);
begin
 with grDockets do
  begin
   if (qDocketsOpenCost.asinteger > 1) and (datacol = 5)
    then canvas.font.color:= clRed;

   if datacol = 9 then // status
    if qDocketsColour.Value <> 0
     then Canvas.font.color:= tcolor (qDocketsColour.Value);

   if datacol = 10 then // attention
    if qDocketsAttention.asinteger = 1
     then canvas.brush.color:= clRed;

   if qDocketsUrgent.asinteger = 1 then canvas.brush.color:= 10092543;
   // light yellow
   DefaultDrawColumnCell (Rect, DataCol, Column, State);
  end
end;

grDockets هي الشبكة، وqDockets هو الاستعلام الذي يتم عرضه داخل الشبكة.قد يتم رسم أعمدة معينة بلون مختلف اعتمادًا على القيمة المعروضة، وفي حالة واحدة (qDocketsUrgent = 1)، يتغير لون خلفية السطر بأكمله.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top