PDA

View Full Version : سوال: قرار داد button در تمام سلول های یک فیلد در DBGride



meysam_212
جمعه 02 آبان 1393, 20:01 عصر
سلام

می خوام یک باتن رو توی سلول های دیبی گرید بسازم
نمی خوام فقط تو حالت سلکت این کلید رو داشته باشم، با یه روش این کلید رو ساختم اما مشکلی که در صورت عدم نمایش اون فیلد (مثلا با اسکرول کردن) کلید ساخته شده همچنان باقی میمونه یه بهتر بگم مختصات کلید با سلول به طور اتوماتیک ست نمیشه و وقتی پرنت کلید رو دیبی گرید مورد نظر میزارم مختصات کلید درست میشه ولی به طور صحیح نمایش داده نمیشه
ممنون

خلاصه نمونه کدی که استفاده کردم:

(...)procedure form.DBGridDrawColumnCell
begin
btn := TBitBtn.Create(form);
btn.Parent := DBGride;
btn.BoundsRect := CellRect;
end

BORHAN TEC
جمعه 02 آبان 1393, 20: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, 21:10 عصر
خیلی ممنون
من میخوام از کلاس باتن استفاده کنم و درکل از کانوس استفاده نکنم و آیدی ردیف رو مثلا توی helpcontext باتن قرار بدم
اگه امکان داره در مورد TGridCoord یا Coord و InvalidateCell توضیح بدین

این کد رو امتحان کردم ولی رو رویداد mouseDwon اتفاقی نمیافتاد
if (FCellDown.X = DataCol) Then
style := style or DFCS_PUSHED;
این شرط برقرار نمیشد و وقتی روی true قرار دادم روی رویداد mouseDown اتفاقی نمیافتاد و تغییراتی در رویداد mouseDown دیبی گرید دادم که تقریبا نتیجه داد اما این رویداد فقط وقتی روی فضای خالی دیبی گرید کلیک می کردم فراخوانی میشد در صورتی که برای mouseUp کار میکرد