• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

کار کردن با DBGRID

صنم

کاربر تازه وارد
تاریخ عضویت
27 فوریه 2005
نوشته‌ها
125
لایک‌ها
0
سلام
می خواستم بدونم چه طور ی می توان با کلیک کردن روی یک سطر از dbgrid تمام سطر به رنگ خاصی نمایش داده شود.
با تشکر
 

littlerabbit

مدیر بازنشسته
کاربر فعال
تاریخ عضویت
13 جولای 2003
نوشته‌ها
678
لایک‌ها
6
سن
43
محل سکونت
Iran
ميتونيد از رويدادDrawColumnCell براي اينكار استفاده كنيد منتها مشكل اينجاست كه در اين حالت رويداد Paint همه Cell ها رو تحت تاثير قرار نميده و ممكنه مشكل پيش بياد من يه كد نصفه نيمه نوشتم كه همش رو از VCL خود دلفي گرفتم و ميتونه كمك كنه (اما جواب كاملي نيست )

کد:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, DBTables, Grids, DBGrids, Math, DBCtrls;

type
  TForm1 = class(TForm)
    DBGrid1: TDBGrid;
    DataSource1: TDataSource;
    Table1: TTable;
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Private declarations }
    function UseRightToLeftAlignmentForField(const AField: TField;
      Alignment: TAlignment): Boolean;
  public
    { Public declarations }
  end;

var
  Form1             : TForm1;

implementation

{$R *.dfm}

procedure WriteText(ACanvas: TCanvas; ARect: TRect; DX, DY: Integer;
  const Text: string; Alignment: TAlignment; ARightToLeft: Boolean);
const
  AlignFlags        : array[TAlignment] of Integer =
    (DT_LEFT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
    DT_RIGHT or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX,
    DT_CENTER or DT_WORDBREAK or DT_EXPANDTABS or DT_NOPREFIX);
  RTL               : array[Boolean] of Integer = (0, DT_RTLREADING);
var
  B, R              : TRect;
  Hold, Left        : Integer;
  I                 : TColorRef;
  DrawBitmap        : TBitmap;
begin
  DrawBitmap := TBitmap.Create;
  I := ColorToRGB(ACanvas.Brush.Color);
  if GetNearestColor(ACanvas.Handle, I) = I then
  begin                                 { Use ExtTextOut for solid colors }
    { In BiDi, because we changed the window origin, the text that does not
      change alignment, actually gets its alignment changed. }
    if (ACanvas.CanvasOrientation = coRightToLeft) and (not ARightToLeft) then
      ChangeBiDiModeAlignment(Alignment);
    case Alignment of
      taLeftJustify:
        Left := ARect.Left + DX;
      taRightJustify:
        Left := ARect.Right - ACanvas.TextWidth(Text) - 3;
    else                                { taCenter }
      Left := ARect.Left + (ARect.Right - ARect.Left) shr 1
        - (ACanvas.TextWidth(Text) shr 1);
    end;
    ACanvas.TextRect(ARect, Left, ARect.Top + DY, Text);
  end
  else begin                            { Use FillRect and Drawtext for dithered colors }
    DrawBitmap.Canvas.Lock;
    try
      with DrawBitmap, ARect do         { Use offscreen bitmap to eliminate flicker and }
      begin                             { brush origin tics in painting / scrolling.    }
        Width := Max(Width, Right - Left);
        Height := Max(Height, Bottom - Top);
        R := Rect(DX, DY, Right - Left - 1, Bottom - Top - 1);
        B := Rect(0, 0, Right - Left, Bottom - Top);
      end;
      with DrawBitmap.Canvas do
      begin
        Font := ACanvas.Font;
        Font.Color := ACanvas.Font.Color;
        Brush := ACanvas.Brush;
        Brush.Style := bsSolid;
        FillRect(B);
        SetBkMode(Handle, TRANSPARENT);
        if (ACanvas.CanvasOrientation = coRightToLeft) then
          ChangeBiDiModeAlignment(Alignment);
        DrawText(Handle, PChar(Text), Length(Text), R,
          AlignFlags[Alignment] or RTL[ARightToLeft]);
      end;
      if (ACanvas.CanvasOrientation = coRightToLeft) then
      begin
        Hold := ARect.Left;
        ARect.Left := ARect.Right;
        ARect.Right := Hold;
      end;
      ACanvas.CopyRect(ARect, DrawBitmap.Canvas, B);
    finally
      DrawBitmap.Canvas.Unlock;
    end;
  end;
end;

function TForm1.UseRightToLeftAlignmentForField(const AField: TField;
  Alignment: TAlignment): Boolean;
begin
  Result := False;
  if SysLocale.MiddleEast and (DBGrid1.BiDiMode <> bdLeftToRight) then
    Result := OkToChangeFieldAlignment(AField, Alignment);
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  Value             : string;
begin
  //Change Code in this If
  if DataCol= DBGrid1.SelectedIndex then
    DBGrid1.Canvas.Brush.Color := clRed
  else
    DBGrid1.Canvas.Brush.Color := clWindow;
  Value := '';
  if Assigned(Column.Field) then
    Value := Column.Field.DisplayText;
  WriteText(DBGrid1.Canvas, Rect, 2, 2, Value, Column.Alignment,
    UseRightToLeftAlignmentForField(Column.Field, Column.Alignment));
end;

end.

فقط خصيصه DefaultDrawing بايد False باشه.
 

hkiani

کاربر تازه وارد
تاریخ عضویت
18 آگوست 2004
نوشته‌ها
21
لایک‌ها
0
محل سکونت
Khorasan, Iran
يك راه ساده تر هم براي اينكار وجود دارد و آن هم تنظيم گزينه هاي دي بي گريد است:
کد:
In Object Inspector window change this settings for your DBGrid:
Options
dgRowSelect = true
با تنظيم فوق تمام سطر جاري بصورت انتخاب شده در مي آيد (نمي دانم آيا منظورتان همين است يا نه).
چند گزينه ي ديگر هم در اين رابطه وجود دارد كه شايد برايتان مفيد باشد: گزينه
کد:
dgShowAlwaysSelection
سبب مي شود كه رديف جاري از جدول هميشه نمايان باشد حتي اگر گريد ما كنترل جاري نباشد.
همچنين گزينه
کد:
dgMultiSelect
به ما امكان مي دهد كه چند رديف را در گريد انتخاب كنيم (با پايين نگه داشتن كليد كنترل و كليك بر روي آنها).
 
بالا