View Full Version : گذاشتن دکمه در هر سطر dbgrid
hamidele
سه شنبه 20 آذر 1386, 17:45 عصر
سلام
میخواستم یه dbgrid داشته باشم که در هر سطر اون یه ستون داشته باشیم که دکمه ای رو داشته باشه و عمل خاص خودش رو انجام بده! البته نمی خواستم که دکمه رو جداگانه ایجاد کنم!
گفتم شاید بشه با کمک canvas این کار رو انجام داد و مثلا بشه یک cell از هر سطر رو دارای خاصیت هایی کرد که یک دکمه داره مثل: رویداد های on rolin یا onenter یا onclik یا ....
کسی هست که بتونه کمکم کنه؟
-------------------------
راستی نمی دونم این dbgrid چه پدر کشتگی ای با برنامه نویسای تازه کار داره که می خوان پاشون رو تو حیطه ی data base بگذارن!!!!!!!!!
SYNDROME
سه شنبه 20 آذر 1386, 20:21 عصر
دوست عزیز اگر منظورت دکمه"..." در کنار یک سلول است جزء خواصیتهای DBGrid است.
1-بر روی DBGrid دابل کلیک کن.
2-بر روی یکی از ستونها کلیک کنید و خواصیتButtonStyle را برابر cbsEllipsis قرار بده.
3-سپس بر روی خود DBGrid کلیک کنید و در رویداد OnEditButtonClick ، کلیک بر روی دکمه را کنترل کنید.
موفق باشید
hamidele
سه شنبه 20 آذر 1386, 22:38 عصر
سلام
نه عزیزم! منظورم این نبود!
منظورم اینه که بتونیم یک یا هر چند از خانه های dbgrid رو که بخواهیم با عکس یا از این قبیل پر کنیم(به کمک canvas).بعد رویدادی براش بتونیم تعریف کنیم که مثلا اگر ماوس از روش رد بشه یا کلیک بشه یا فعال بشهیا... تغییر بکنه ویا عملی رو انجام بده!
فکر کنم کاپوننتی در این مورد سراغ داشته باشید؟
خواهش میکنم اگر کسی در این مورد کامپوننتی سراغ داره اینجا اسم یا لینکی از اون رو بگذاره....
بازم از اینکه جوابم رو دادیدممنونم!:لبخندساده:
unforgiven.
چهارشنبه 21 آذر 1386, 22:32 عصر
Take a L00k => http://www.ehlib.com/dbgrideh1.htm
hamidele
پنج شنبه 22 آذر 1386, 20:13 عصر
خوب بازم سلام
به نظر میاد که ابنجا دوستان چندان نمی تونن کمک کنند!
من چند تا کامپوننت دارم اما دقیقا نمی دونم طرز کارشون چیه ضمن اینکه اونطوری که من می خوام نیستند!
خوب بازم منتظر نظرات دوستانمون هستیم.....
hamidele
یک شنبه 25 آذر 1386, 06:11 صبح
سلام
به نظر می زسه که نمی شه اینجا جوابی گرفت . . .
پس ترجیحا نحوه ی پرسیدن سوالم رو عوض می کنم!!!
فرض کنیم که من می خواهم عنصری داشته باشم که هم خواص dbgrid رو داشته باشه و هم خواص stringgrid ! آیا میشه این عنصر از هر دو ارث ببره؟؟
یا اینکه مثل کد زیر باید تک تک خواص از یکی رو در دیگری تعریف کنم؟؟؟
unit HamidDBGrid2;
interface
uses
SysUtils
,Classes
, Controls
, Grids
, DBGrids
, Windows
;
type
THamidDBGrid = class(TDBGrid)
private
FOnDrawCell:TDrawCellEvent;
{ Private declarations }
protected
procedure DrawCell(ACol, ARow: Longint;
ARect: TRect; AState: TGridDrawState); override;
{ Protected declarations }
public
{ Public declarations }
published
property OnDrawCell: TDrawCellEvent read FOnDrawCell write FOnDrawCell;
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('hamid', [THamidDBGrid]);
end;
{ THamidDBGrid }
procedure THamidDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
begin
inherited;
if Assigned(FOnDrawCell) then FOnDrawCell(Self,ACol, ARow,ARect,AState);
end;
end.
در کد بالا خاصیت ondrawcell رو به عنصر dbgrid اضافه کردم!!!
بازهم منتظر نظرات شما هستم؟!
Cave_Man
یک شنبه 25 آذر 1386, 11:55 صبح
توی سایت delphi.about.com یک مورد در مورد Checkbox هست به نظرم خیلی به دردت میتونه بخوره بجای checkbox از Button استفاده کن و نتیجه رو ببین
hamidele
دوشنبه 26 آذر 1386, 22:13 عصر
با سلام به دوست عزیزمون Cave_Man و تشکر از ایشون!
دوست عزیز از اینکه توجه داشتین به این موضوع خیلی ممنونم... اما اگر دقت کنید متوجه میشین که نوع استفاده شده در اون کد ها checkbox نیست !!!!
در حقیقت dbcheckbox هست اینه که فکر نکنم بتونم عنصری مثل dbButton پیدا کنم که جایگزین اون کنم!
بازم از توجهتون متشکرم و باز هم منتظر جواب دوستان میمونم!!
Cave_Man
دوشنبه 26 آذر 1386, 22:56 عصر
تو که نمیخای توی Button اطلاعات فیلدی نمایش داده بشه لازم به نوع DBButton که نداری
اون قسمت هایی از کد هم که مربوط به DB هست که دیگه بدردت نمی خوره
با همون کد ها راحت میتونی این مشکلت رو حل کنی
Cave_Man
دوشنبه 26 آذر 1386, 23:24 عصر
بفرما این کد آماده :چشمک:
hamidele
سه شنبه 27 آذر 1386, 04:39 صبح
با سلام.
باز هم از اینکه توجه داشتید خیلی ممنونم!
می خواستم یکی دو تا سوال بپرسم!
اول اینکه چرا اکثر دوستان از اشیای ADO برای بانک های اطلاعاتیشون استفاده میکنن؟؟
و اینکه مثلا من که فقط کار با جداول BDE رو یاد دارم چطوری به حیطه ADO وارد بشم؟
ضمنا در مورد کد زیر هم مشکلی دارم که خیلی ممنون میشم اگه کسی علت اشکال اونو بگه!!
البته قبلش عرض میکتم که اشکال مورد نظر در زمان نمایش فرم و اون هم بدون اینکه برنامه اجرا بشه و در واقع در محیط دلفی رخ میده!!! زمانی که بخواهیم قبل از اجرای برنامه اندازه ی ستون ها رو تغییر بدهیم!!
unit hdbgrid;
interface
uses
SysUtils
,Classes
, Controls
, Grids
, DBGrids
, Windows
;
type
TCelPos=record
X:integer;
Y:integer;
end;
THOnCellClikEvent = procedure (Sender: TObject; ACol, ARow, RecNum: Longint) of object;
THOnCellKeyDownEvent = procedure (Sender: TObject; ACol ,ARow:Longint ; var Key: Word; Shift: TShiftState)of object;
THOnCellKeyPressEvent = procedure (Sender: TObject; ACol ,ARow:Longint ;var Key: Char) of object;
THOnCellMouseOutEvent = procedure (Sender: TObject; ACol, ARow: Longint) of object;
THOnCellMouseInEvent = procedure (Sender: TObject; ACol, ARow: Longint) of object;
THOnDrawCellEvent = procedure (Sender: TObject; ACol, ARow: Longint;
Rect: TRect; State: TGridDrawState) of object;
THOnCellHaveMouseChangeEvent = procedure (Sender: TObject; OldCell, NewCell: TCelPos) of object;
THDBgrid = class(TDBGrid)
private
FHCellHaveMouse:TCelPos;
FHOnDrawCell:THOnDrawCellEvent;
FHOnCellClick:THOnCellClikEvent;
FHOnCellKeyDown: THOnCellKeyDownEvent;
FHOnCellKeyPress: THOnCellKeyPressEvent;
FHOnCellMouseOut:THOnCellMouseOutEvent;
FHOnCellMouseIn:THOnCellMouseInEvent;
FHOnCellHaveMouseChange:THOnCellHaveMouseChangeEve nt;
protected
procedure DrawCell(ACol, ARow: Longint;
ARect: TRect; AState: TGridDrawState); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); override;
procedure KeyDown(var Key: Word; Shift: TShiftState); override;
procedure KeyPress(var Key: Char); override;
public
constructor Create(AOwner: TComponent); override;
property HCellHaveMouse:TCelPos read FHCellHaveMouse;
function HCellRect(ACol,ARow:Longint):TRect;
published
property OnDrawCell: THOnDrawCellEvent read FHOnDrawCell write FHOnDrawCell;
property HOnDrawCell: THOnDrawCellEvent read FHOnDrawCell write FHOnDrawCell;
property HOnCellClick: THOnCellClikEvent read FHOnCellClick write FHOnCellClick ;
property HOnCellMouseOut: THOnCellMouseOutEvent read FHOnCellMouseOut write FHOnCellMouseOut;
property HOnCellMouseIn: THOnCellMouseInEvent read FHOnCellMouseIn write FHOnCellMouseIn;
property HOnCellHaveMouseChange: THOnCellHaveMouseChangeEvent read FHOnCellHaveMouseChange write FHOnCellHaveMouseChange;
property HOnCellKeyDown: THOnCellKeyDownEvent read FHOnCellKeyDown write FHOnCellKeyDown;
property HOnCellKeyPress: THOnCellKeyPressEvent read FHOnCellKeyPress write FHOnCellKeyPress;
end;
procedure Register;
implementation
//__________________________________________________ ____________________________
procedure Register;
begin
RegisterComponents('hamid', [thdbgrid]);
end;
//__________________________________________________ _________________________
constructor THDBgrid.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FHCellHaveMouse.X:=1;
FHCellHaveMouse.Y:=1;
end;
//__________________________________________________ _________________________
procedure THDBGrid.DrawCell(ACol, ARow: Integer; ARect: TRect;
AState: TGridDrawState);
begin
inherited;
if Assigned(FHOnDrawCell) then FHOnDrawCell(Self,ACol, ARow,ARect,AState);
end;
//__________________________________________________ ____________________________
function thdbgrid.HCellRect(ACol, ARow:Longint): TRect;
begin
HCellRect:=CellRect(ACol,ARow);
end;
//__________________________________________________ ____________________________
procedure thdbgrid.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited;
if Assigned(FHOnCellKeyDown) then
FHOnCellKeyDown(Self,Col,Row,Key,Shift);
end;
//__________________________________________________ ____________________________
procedure thdbgrid.KeyPress(var Key: Char);
begin
inherited;
if Assigned(FHOnCellKeyPress) then
FHOnCellKeyPress(Self,Col,Row,key);
end;
//__________________________________________________ ____________________________
procedure thdbgrid.MouseMove(Shift: TShiftState; X, Y: Integer);
var
i:integer;
old:TCelPos;
begin
inherited;
old.X:=FHCellHaveMouse.X;
old.Y:=FHCellHaveMouse.Y;
try
if ((y-1) div (DefaultRowHeight+1))<old.Y then
begin
while((FHCellHaveMouse.y>1)and(((y-1) div (DefaultRowHeight+1))<FHCellHaveMouse.y))do
FHCellHaveMouse.y:=FHCellHaveMouse.y-1;
end
else
if (((y-1) div (DefaultRowHeight+1))>old.Y) then
begin
while((FHCellHaveMouse.y<RowCount)and(((y-1) div (DefaultRowHeight+1))>FHCellHaveMouse.y))do
FHCellHaveMouse.y:=FHCellHaveMouse.y+1;
end;
if (x < CellRect(FHCellHaveMouse.X,FHCellHaveMouse.Y).Left ) then
begin
while((FHCellHaveMouse.x>1)and(x<CellRect(FHCellHaveMouse.X,FHCellHaveMouse.Y).Left ))do
FHCellHaveMouse.x:=FHCellHaveMouse.x-1;
end
else
if (x > CellRect(FHCellHaveMouse.X+1,FHCellHaveMouse.Y).Le ft) then
begin
while((FHCellHaveMouse.x<ColCount)and(x > CellRect(FHCellHaveMouse.X+1,FHCellHaveMouse.Y).Le ft))do
FHCellHaveMouse.x:=FHCellHaveMouse.x+1;
end;
except
end;
if (old.X<>FHCellHaveMouse.X)or(old.Y<>FHCellHaveMouse.Y) then
begin
if Assigned(FHOnCellMouseOut) then
FHOnCellMouseOut(Self,old.x,old.y);
if Assigned(FHOnCellHaveMouseChange) then
FHOnCellHaveMouseChange(Self,old,FHCellHaveMouse);
if Assigned(FHOnCellMouseIn) then
FHOnCellMouseIn(Self,FHCellHaveMouse.x,FHCellHaveM ouse.y);
end;
end;
//__________________________________________________ ____________________________
procedure thdbgrid.MouseUp(Button: TMouseButton; Shift: TShiftState; X,
Y: Integer);
begin
inherited;
if Assigned(FHOnCellClick) then
FHOnCellClick(Self,FHCellHaveMouse.x,FHCellHaveMou se.y,DataSource.DataSet.RecNo);
end;
//__________________________________________________ ____________________________
end.
داشت یادم میرفت که در مورد این کد توضیح بدم!
در حقیقت در این یونیت من یه شی جدید از DBGrid به وجود آوردم که خصوصیات بیشتری نسبت به قبل داره!!!!
hamidele
سه شنبه 27 آذر 1386, 04:45 صبح
خوب برای راحتی شما دوستان یه نمونه از برنامه رو در اینجا قرار میدم:
hamidele
سه شنبه 27 آذر 1386, 04:53 صبح
ببخشید فراموش کردم که بگم که منظورم از گذاشتن دکمه در dbgrid این نیست که یه دکمه ایجاد کنیم و اون رو در محل خاصی ار dbgrid قرار بدیم!!
بلکه همونطور که قبلا گفتم منظورم اینه که با کمک خواص خود dbgrid ما بتونیم در یک یا چند تا از cell های dbgrid یه دکمه شبیه سازی کنیم.
در واقع این کد ها هم به پیرو همین مطلب به وجود آمده اند واینجا قرار داده شده اند!!!!
باز هم منتظر لطف و محبت بی دریغ شما دوستان برای پاسخ دادن به این مطلب خواهیم بود!
:لبخندساده:
vcldeveloper
سه شنبه 27 آذر 1386, 15:05 عصر
می خواستم یکی دو تا سوال بپرسم!
اول اینکه چرا اکثر دوستان از اشیای ADO برای بانک های اطلاعاتیشون استفاده میکنن؟؟
و اینکه مثلا من که فقط کار با جداول BDE رو یاد دارم چطوری به حیطه ADO وارد بشم؟
این سوال ربطی به این تاپیک نداره. در یک تاپیک مجزا آن را بپرسید.
ضمنا در مورد کد زیر هم مشکلی دارم که خیلی ممنون میشم اگه کسی علت اشکال اونو بگه!!
نگفتید مشکلتون با کد مربوطه چیه؛ همون نمایش دکمه در گرید، یا چیز دیگه؟
hamidele
سه شنبه 27 آذر 1386, 16:41 عصر
نگفتید مشکلتون با کد مربوطه چیه؛ همون نمایش دکمه در گرید، یا چیز دیگه؟
البته من بلافاصله بعد از نوشتن این جمله مشکلم رو مطرح کرده بودم!
ضمنا در مورد کد زیر هم مشکلی دارم که خیلی ممنون میشم اگه کسی علت اشکال اونو بگه!!
البته قبلش عرض میکتم که اشکال مورد نظر در زمان نمایش فرم و اون هم بدون اینکه برنامه اجرا بشه و در واقع در محیط دلفی رخ میده!!! زمانی که بخواهیم قبل از اجرای برنامه اندازه ی ستون ها رو تغییر بدهیم!!
خوب...
راستی اگر ارتباط کد گذاشته شده و موضوع تاپیک رو می خواین بهتر بدونین:
ببخشید فراموش کردم که بگم که منظورم از گذاشتن دکمه در dbgrid این نیست که یه دکمه ایجاد کنیم و اون رو در محل خاصی ار dbgrid قرار بدیم!!
بلکه همونطور که قبلا گفتم منظورم اینه که با کمک خواص خود dbgrid ما بتونیم در یک یا چند تا از cell های dbgrid یه دکمه شبیه سازی کنیم.
در واقع این کد ها هم به پیرو همین مطلب به وجود آمده اند واینجا قرار داده شده اند!!!!
و در ادامه اینکه کد مربوطه برای اضافه کردن چند تا خصوصیت به dbgrid به وجود امده که به کمک این خصوصیات تقریبا میشه خواسته ی مورد نظر رو بدست آورد.
در مورد دو سوال اول حق با شماست و دلیل اینکه اینجا مطرح شد بابت مثالی بود که
دوست عزیزمون Cave_Man در فایل الحاقیشون آورده بودند!
در آن مثال از عناصر ADO استفاده شده بود و من در استفاده از اونها مشکل داشتم!!!
باز هم از اینکه این موارد را تذکر دادید بسیار متشکرم!:لبخندساده:
Cave_Man
سه شنبه 27 آذر 1386, 17:00 عصر
در مورد دو سوال اول حق با شماست و دلیل اینکه اینجا مطرح شد بابت مثالی بود که
دوست عزیزمون Cave_Man در فایل الحاقیشون آورده بودند!
در آن مثال از عناصر ADO استفاده شده بود و من در استفاده از اونها مشکل داشتم!!!
این مثال برای BDE گرچه خودم هم بیشتر از BDE استفاده کردم اما چون بقیه بیشتر ADO هستن مثال رو روی ADO دادم
خودت هم میتونستی راحت تبدیلش کنی به BDE
hamidele
سه شنبه 27 آذر 1386, 21:35 عصر
ین مثال برای BDE گرچه خودم هم بیشتر از BDE استفاده کردم اما چون بقیه بیشتر ADO هستن مثال رو روی ADO دادم
خودت هم میتونستی راحت تبدیلش کنی به BDE
باز هم از لطف و محبت بی دریغ شما و مخصوصا دوست عزیز Cave_Man ممنونم!
البته من هم دقیقا کاری رو که گفتین انجام داده بودم! یعنی تبدیلش کردم! ولی به هر حال بنا به چیزی که گفته بودم ، این چیزی نبود که می خواستم!
دوباره از لطف و محبتتون ممنون!
الان منتظرم که اگه کسی میدونه که دقیقا اشکال کد مذکور در پست های قبل چیه اونو برای ما پست کنه!:لبخندساده:
MOJTABAATEFEH
پنج شنبه 23 دی 1389, 18:20 عصر
سلام دوستان عزیز Grid یا DBgrid به شکل زیر رو چطور می توان ایجاد کرد؟
و در کنار اون هم دو دکمه کلی تحت عنوان ردیف جدید و حذف ردیف؟
با تشکر
vcldeveloper
جمعه 24 دی 1389, 00:53 صبح
سلام دوستان عزیز Grid یا DBgrid به شکل زیر رو چطور می توان ایجاد کرد؟
بستگی داره که خودتون بخواید همچین گریدی بنویسید، یا اینکه از کامپوننت استفاده کنید. اگر میخواید از کامپوننت استفاده کنید، کامپوننت هایی مثل EhLib همچین قابلیتی را به طور آماده در اختیارتون میذارند. اگر بخواین کد بنویسید، باید یک کنترل گرید جدید بسازید، و در اون این اشیاء را رسم کنید. رسم میتونه به صورت ایجاد دکمه های حقیقی در هر سطر باشه، یا رسم دکمه حقیقی در سطر فعال، و رسم تصویر دکمه در سایر سطرها.
MOJTABAATEFEH
جمعه 24 دی 1389, 12:48 عصر
ممنون جناب کشاورز ولی تاجایی من با Ehlib کار کردم فقط دکمه ای تحت عنوان Edit Button و به شکل Combo میسازه و به این شکل نیست درسته؟
با تشکر
vcldeveloper
جمعه 24 دی 1389, 12:55 عصر
ولی تاجایی من با Ehlib کار کردم فقط دکمه ای تحت عنوان Edit Button و به شکل Combo میسازه و به این شکل نیست درسته؟
این نمونه با استفاده از EhLib هست:
65045
ب- تات
سه شنبه 05 بهمن 1389, 11:18 صبح
من هم فکر نکنم از قابلیتهای بالقوه Ehlib باشه. منظورم اون دکه در اولین فیلد سمت راست هست. امکانش هست توضیح بدین؟
جواد ملاولی
یک شنبه 10 بهمن 1389, 10:26 صبح
سلام دوستان عزیز Grid یا DBgrid به شکل زیر رو چطور می توان ایجاد کرد؟
و در کنار اون هم دو دکمه کلی تحت عنوان ردیف جدید و حذف ردیف؟
با تشکر
اگر میخواید از کامپوننت استفاده کنید، کامپوننت هایی مثل EhLib همچین قابلیتی را به طور آماده در اختیارتون میذارند.
جواب شرکت سازنده ی EHLib:
Unfortunately, DBGridEH can't show buttons in the cells.
It can show images from TImageList, but it will not act as a button
(that is change state of the image when you press mouse over the cell).
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.