PDA

View Full Version : دی بی گرید با ویژگی علامتگذاری!.!.!



nazanin20
شنبه 28 فروردین 1389, 12:05 عصر
سلام به همه دوستانم
بچه ها من میخام تو یه صفحه یه دی بی گرید داشته باشم و یه کلید که هر وقت رو کلید کلیک کردم کنار هر ردیف یه چک باکس بیاد و
کاربر بتونه رکوردهایه متناظر رو با علامت گذاری انتخاب کنه و بعدبا کلیک رو یه دکمه دیگه این رکوردها دیلیت بشن!!
مثه حالتی که تو موبایل وجود داره !!!
میشه راهنمااییم کنید
ممنونم

Felony
شنبه 28 فروردین 1389, 13:27 عصر
تو رویداد DrawColumnCell شئ مورد نظر خودتون رو برای هر رکورد بسازید و اضافه کنید .

smmhch
شنبه 28 فروردین 1389, 20:57 عصر
سلام
اگر بخوام با اجازه پاسخ SilverSoft (http://barnamenevis.org/forum/member.php?u=63881) را کامل کنم
یک سری به http://delphi.about.com بزن و Adding components to a DBGrid را جستجو کن کاملا بحث را باز کرده.

nazanin20
یک شنبه 29 فروردین 1389, 19:05 عصر
با تشکر از همه :
من این مطلبو یه جا خوندم :


برای استفاده چک باکس داخل خانه های دی بی گریدتون میتونید همانند مثلا زیر عمل کنید:



باید یه متغییر سراسری به این فرم تعریف کنید:

کد:



private FOriginalOptions : TDBGridOptions;




سل کلیک به این شکل میشه:
کد:



procedure TFrmFile.DBGridCellClick(Column: TColumn); begin if Self.DBGrid.SelectedField.DataType = ftBoolean then SaveBoolean(); end;




سیو بولین:
کد:



procedure TFrmFile.SaveBoolean; begin Self.DBGrid.SelectedField.Dataset.Edit; Self.DBGrid.SelectedField.AsBoolean := not Self.DBGrid.SelectedField.AsBoolean; Self.DBGrid.SelectedField.Dataset.Post; end;




طراحی چک باکس داخل سلول های دی بی گرید:
کد:



procedure TFrmFile.DBGridDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); Const CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); var CheckBoxRectangle : TRect; begin if Column.Field.DataType = ftBoolean then begin Self.DBGrid.Canvas.FillRect(Rect); CheckBoxRectangle.Left := Rect.Left + 2; CheckBoxRectangle.Right := Rect.Right - 2; CheckBoxRectangle.Top := Rect.Top + 2; CheckBoxRectangle.Bottom := Rect.Bottom - 2; DrawFrameControl(Self.DBGrid.Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end;




برای ثبت و داخل شدن به سلول و ستون:
کد:



procedure TFrmFile.DBGridColEnter(Sender: TObject); begin if Self.DBGrid.SelectedField.DataType = ftBoolean then begin Self.FOriginalOptions := Self.DBGrid.Options; Self.DBGrid.Options := Self.DBGrid.Options - [dgEditing]; end; end;




خروج از ستون:
کد:



procedure TFrmFile.DBGridColExit(Sender: TObject); begin if Self.DBGrid.SelectedField.DataType = ftBoolean then Self.DBGrid.Options := Self.FOriginalOptions; end;




موفق باشیدhttp://www.forum.parsiland.com/forum-643/images/Infusion/new-smilie/GA%20(12).gif


این اموزش نیاز به فیلد فالس و ترو تو جدول داره ،ولی من نمیخام فیلد فالس و ترو تو جدولم داشته باشم
میخام فقط تو دی بی گریدم باشه و من اعضایی رو انتخاب کنم وبعدش یه عملیاتی روش انجام بدم

Felony
یک شنبه 29 فروردین 1389, 21:19 عصر
سلام ،
یکم وقت آزاد داشتم براتون یه نمونه نوشتم برای خودم هم اینطور سوالات جالبه ، نمونه ای که براتون نوشتم و ضمیمه کردم یه مشکل داره اون هم این هست که اگر DBGrid شما اسکرول بخوره CheckBox ها همینطور ادامه پیدا میکنه و از فرم میره بیرون که اون رو هم اگر به کد دقت کنید با یکم تغییر میتونید درستش کنید .

nazanin20
دوشنبه 30 فروردین 1389, 17:31 عصر
/////////////////////////////////////////////////////
program Project1;
uses
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
begin
Application.Initialize;
//Application.MainFormOnTaskbar := True;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
//////////////////////////////////////////////////////////////////////////////
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, StdCtrls, Grids, DBGrids, ADODB;
type
TForm1 = class(TForm)
ADOTable1: TADOTable;
DBGrid1: TDBGrid;
Button1: TButton;
DataSource1: TDataSource;
ADOTable1Name: TWideStringField;
ADOTable1Age: TWideStringField;
ADOConnection1: TADOConnection;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
CHB: Array of TCheckBox;
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//------------------------------------------------------------------------
Procedure CreateCheckBox;
var
EachRecord, EachCheckBox: Integer;
begin
// if last time check box xreated free it & a gain create it ( Recreate )
if Assigned(Form1.CHB) then
for EachCheckBox:= 0 to Length(Form1.CHB) - 1 do
Form1.CHB[EachCheckBox].Free;
// Set CheckBox array length to record count of table
SetLength(Form1.CHB,Form1.ADOTable1.RecordCount);
// for each record in table create a checkbox
for EachRecord:= 0 to Form1.ADOTable1.RecordCount - 1 do
begin
Form1.CHB[EachRecord]:= TCheckBox.Create(Form1);
with Form1.CHB[EachRecord] do begin
Form1.CHB[EachRecord].Parent:= Form1;
Form1.CHB[EachRecord].Left:= Form1.DBGrid1.Left- 18;
if EachRecord=0 then
Form1.CHB[EachRecord].Top:= Form1.DBGrid1.Top + 20
else
Form1.CHB[EachRecord].Top := Form1.CHB[EachRecord-1].Top+ 18;
Form1.CHB[EachRecord].Width:= 15;
end
end;
end;
//----------------------------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
DeleteRec: Integer;
begin
for DeleteRec:= 0 to ADOTable1.RecordCount- 1 do
if CHB[DeleteRec].Checked then
begin
ADOTable1.RecNo:= DeleteRec+ 1;
ADOTable1.Delete;
end;
// ReCreate CheckBoxes
CreateCheckBox;
end;
//-----------------------------------------------------------------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
// Create CheckBoxes
CreateCheckBox;
end;
end.



ممنونم واقعا جالب بود و دستت درد نکنه !!
ولی میدونی من باید صورت مساله رو عوض کنم
چون این چک باکسا با اسکرول بالا پایین نمیان
مجبورم یه فیلد از نوع فالس و ترو تعریف کنم
ببینید برنامه ام اینجوری میخام قرعه کشی کنم بین اعضایی که کاربر انتخاب میکنه
و مثلا کاربر بیاد بین اشخاصی که انتخاب میکنه تو دی بی گیرید قرعه کشی کنه !!بهمین خاطر نیاز به چک باکس داشتم
راهی
روشی
چیزی به نظرتون میرسخ کمکم کنید
ممنونم

Felony
دوشنبه 30 فروردین 1389, 19:15 عصر
تو آرشیو نمونه کدهام فایل ضمیمه رو پیدا کردم ، شاید به کارتون بیاد .