View Full Version : سوال: قرار داد button در تمام سلول های یک فیلد در DBGride
  
meysam_212
جمعه 02 آبان 1393, 21:01 عصر
سلام
می خوام یک باتن رو توی سلول های دیبی گرید بسازم
نمی خوام فقط تو حالت سلکت این کلید رو داشته باشم، با یه روش این کلید رو ساختم اما مشکلی که در صورت عدم نمایش اون فیلد (مثلا با اسکرول کردن) کلید ساخته شده همچنان باقی میمونه یه بهتر بگم مختصات کلید با سلول به طور اتوماتیک ست نمیشه و وقتی پرنت کلید رو دیبی گرید مورد نظر میزارم مختصات کلید درست میشه ولی به طور صحیح نمایش داده نمیشه
ممنون
خلاصه نمونه کدی که استفاده کردم:
(...)procedure form.DBGridDrawColumnCell
begin
  btn := TBitBtn.Create(form);
  btn.Parent := DBGride;
  btn.BoundsRect := CellRect;
end
BORHAN TEC
جمعه 02 آبان 1393, 21:36 عصر
با عرض سلام،
به نمونه کد زیر توجه کنید:
unit Unit1;
interface
uses
  // ...
type
  TForm1 = class(TForm)
     //...
  private
    FCellDown: TGridCoord;
    FButtonCol: Integer; // شماره ستون
    //...
  end;
implementation
procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
  r: TRect;
  style: DWORD;
  FCellDown: TGridCoord;
begin
  r:= Rect;
  if (not (gdFixed in State)) and (DataCol = FButtonCol) then
  begin
    TDBGrid(Sender).Canvas.Brush.Color := clBtnFace;
    TDBGrid(Sender).Canvas.Font.Color  := clBtnText;
    style := DFCS_BUTTONPUSH or DFCS_ADJUSTRECT or DFCS_FLAT;
    if (FCellDown.X = DataCol) Then
      style := style or DFCS_PUSHED;
    DrawFrameControl( TDBGrid(Sender).Canvas.Handle, r, DFC_BUTTON, style );
  end;
  TDBGrid(Sender).DefaultDrawColumnCell(R, DataCol, Column, State);
end;
type TMyGrid = class(TCustomGrid);
procedure TForm1.DBGrid1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  cell: TGridCoord;
  FCellDown: TGridCoord;
begin
  if (Button = mbLeft) and ((Shift - [ssLeft]) = []) then
  begin
    cell :=  TCustomGrid(Sender).MouseCoord(X, Y);
    if (cell.X >= 1) and (cell.Y >= 1) then
    begin
      FCellDown := cell;
      TMyGrid(Sender).InvalidateCell( cell.X, cell.Y );
    end;
    TMyGrid(Sender).InvalidateCell( FCellDown.X, FCellDown.Y );
  end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  FButtonCol := 0;
  FCellDown.X := 999;
  FCellDown.Y := 999;
end;
// ...
موفق باشید...
meysam_212
جمعه 02 آبان 1393, 22:10 عصر
خیلی ممنون
من میخوام از کلاس باتن استفاده کنم و درکل از کانوس استفاده نکنم و آیدی ردیف رو مثلا توی helpcontext باتن قرار بدم
اگه امکان داره در مورد TGridCoord یا Coord و InvalidateCell توضیح بدین
این کد رو امتحان کردم ولی رو رویداد mouseDwon اتفاقی نمیافتاد
    if (FCellDown.X = DataCol) Then
      style := style or DFCS_PUSHED;
این شرط برقرار نمیشد و وقتی روی true قرار دادم روی رویداد mouseDown اتفاقی نمیافتاد و تغییراتی در رویداد mouseDown دیبی گرید دادم که تقریبا نتیجه داد اما این رویداد فقط وقتی روی فضای خالی دیبی گرید کلیک می کردم فراخوانی میشد در صورتی که برای mouseUp کار میکرد
 
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.