PDA

View Full Version : گفتگو: همه چیز در مورد DBGrid



Hsimple11
سه شنبه 29 مرداد 1387, 22:35 عصر
سلام؛


همونطور که میدونید DBGrid عنصریه که کم و بیش در همه برنامه های بانک اطلاعاتی باهاش سر و کار داریم و یکی از اجزاییه که خیلی سوالا در موردش مطرح میشه و تو این سایتم میبینیم که همیشه سوالاتی در مورد این کنترل پرکاربرد مطرح میشه.

تصمیم داریم در این تاپیک منحصرا به بحث در مورد انواع ویژگی ها و ترفندهای DBGrid بپردازیم.

از دوستان عزیز خواهشمندم هر گونه کد یا ترفند و هرگونه اطلاعاتی که در مورد DBGrid دارند رو در این تاپیک قرار بدن.

فقط بازم میگم این تاپیک منحصرا در مورد این کنترل بحث میکنه و اگه دیگه چیزی باقی نموند بعدا به Grid های دیگه میپردازیم.


برای اولین پست هم از پایه DBGrid شروع میکنم :

.................................................. ........................

TDBGrid یکی از عناصر دیتا کنترله که اطلاعات یک منبع رو بصورت جدولی نشون میده. این اطلاعات میتونه اطلاعات یه Table، اطلاعات حاصل از یه SQL و با یه Stored Procedure باشه. توی این عنصر ستونها مطابق فیلدها و سطرها منطبق بر رکوردها هست. خاصیت DataSource این عنصر رو به منبع داده متصل میکنه و با Active شدن دیتاست، میتونیم اطلاعات رو ببینیم. تقریبا 3 عامل بر نمایش رکوردها در یک عنصر Grid تاثیر داره :

1- وجود ستونهای ثابت تعریف شده برای یک Grid با استفاده از ویرایشگر ستونها.
2- ایجاد فیلد ثابت برای مجموعه داده نمایش شده.
3- خاصیت ObjectView از دیتاست برای گریدهایی که فیلدهای آرایه ای رو نشون میدن.


یک کنترل گرید، خاصیتی بنام Columns دارد که از نوع TDBGridColumns می باشد. TDBGridColumns خود یک مجموعه از TColumn هست که تمام ستون های یه کنترل Grid رو نشون میده. در زمان طراحی میتونبید خواص ستونها رو همونطوری که میخواهید تنظیم کنید. یا از خاصیت Columns جهت دستیابی به خاصیتها، رویدادها و متدهای TDBGridColumns در Run-Time استفاده کنید.


خاصیت State از خاصیت Columns برای یک Grid، وجود ستونهای ثابت را مشخص میکنه (DBGrid.Columns.State). این خاصیت یک خاصیت زمان اجراست و مقدار پیش فرض اون CSDefault هست به معنی عدم وجود ستونهای ثابت. در این حالت نحوه نمایش رکوردها توسط خاصییت فیلدها در دیتاست ما مشخص میشه و ربطی به DBGrid نداره. ستونها بصورت دینامیک مطابق فیلدهای قابل نمایش Dataset ما ایجاد میشن و ترتیب ستونها در گرید هم مطابق با ترتیب فیلدها در Dataset هست. کنترل DBGrid بصورت دینامیک و پویا عمل میکنه و میتونیم در هر لحظه اطلاعات رو نشون بدیم. مثلا در یک لحظه اون رو به یه Table وصل کنیم و لحظه ای بعد اون رو به یه Query و لحظه ای دیگه به یه Stored Procedure.


خواص ستونهای پویا فقط تا زمانی وجود دارند که یک ستون با یک فیلد خاص مرتبط باشد. مثلا تغییر خاصیت Width یک ستون، مقدار خاصیت Display Width یک فیلد مرتبط با اون ستون رو عوض میکنه.


وقتی ستونهای ثابت تعریف میکنید اونا خواص خودشون رو از فیلدهای مرتبط بدست میارن مگر اینکه شما خودتون خواص ستونا رو طوری که میخواهید تغییر بدید. مثلا عنوان یک ستون متغیره ولی اگه عنوان یه ستون رو مقداردهی کنید دیگه اون عنوان ستون به خاصیت Display Label فیلد شما در Dataset وابسته نیست.


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


چون لازم نیست ستونهای ثابت حتما به یه فیلد متصل باشند و چون چندین ستون میتونه به یه فیلد وصل بشه، خاصیت FieldCount یک Grid میتونه کوچکتر یا مساوی با تعداد ستونهای Grid شما باشه. همچنین اگه ستون انتخاب شده به هیچ فیلدی مرتبط نباشه خاصیت SelectedField در اینجا Null و خاصیت SelectedIndex برابر با 1- خواهد بود.


در پست بعد ادامه می دیم.....

Hsimple11
چهارشنبه 30 مرداد 1387, 17:38 عصر
قبل از ادامه بحث قبل مقاله ای کلی در مورد رنگ کردن DBGrid که قبلا در سایت وجود داشت :

رنگ کردن DBGrid (http://barnamenevis.org/forum/attachment.php?attachmentid=19167&d=1213466876)

Hsimple11
پنج شنبه 31 مرداد 1387, 11:52 صبح
به ادامه خواص کلی DBGrid می پردازیم :


مشخص کردن منبع یک ستون

در زمان اجرا شما میتونید خاصیت AssignedValues یک ستون بفهمید که آیا یک ستون DBGrid مقدارش رو از یک فیلد بدست میاره یا نه :


DBGrid1.Columns[0].AssignedValues

این خصوصیت که از نوع TColumnValue است Caption، رنگ، فونت و سایر ویژگیهای یک ستون را به ما میدهد. میتونیم تمام این خواص یک ستون رو با RestoreDefaults بصورت پیش فرض و اولیه در بیاوریم.


ایجاد ستونهای ثابت (fixed)

برای Customize کردن یک گرید در زمان طراحی برنامتون، باید ستونها رو ویرایش کنیم. برای اینکار از ویرایشگر ستونها استفاده میکنیم. دوبار بر روی خاصیت Columns یا خود DBGrid کلیک میکنیم تا ویرایشگر ستونها نشان داده شود. کلید Add را در ویرایشگر ستونها فشار دهید. یک ستون جدید ایجاد میشود. خاصیت FieldName را به فیلدی که میخواهید این ستون به اون وصل شه مقدار دهی میکنیم. Titlle و Caption ستون را تغییر داده و ویرایشگر را جهت ثبت تغییرات می بندیم.

برای جابجایی ستونها هم در همین ویرایشگر ستونها، ستونها رو به دلخواه جابجا میکنیم.


تعریف ستونهای جستجو

اگر میخواهید ستونی یک لیست را از جدولی دیگه نشون بده، ابتدا باید یک فیلد جستجو تعریف کنید. بعد خاصیت FieldName را از ستون مورد نظر به اون فیلد جستجو مقداردهی کنید و خاصیت ButtonStyle را cbsAuto قرار دهید. هرگاه اون ستون انتخاب شود، یک لیست که محتویات آن از جدول جستجو می باشد نشان داده می شود.


در پست بعد ادامه میدیم...

Hsimple11
پنج شنبه 31 مرداد 1387, 11:53 صبح
دوستان اگه همکاری نکنند این تاپیک ، تاپیک جامعی نمیشه....

war1351
پنج شنبه 31 مرداد 1387, 12:20 عصر
دوست و استاد عزیز میخواستم بپرسم اگه بخام نام ستونهارو مثل datagridview فارسی کنم بدون آنکه تو اصل موضوع تغییر نکنه یعنی نام فیلدها تغییر نکنه چکار کنم
با تشکر

Hsimple11
پنج شنبه 31 مرداد 1387, 12:29 عصر
دوست و استاد عزیز میخواستم بپرسم اگه بخام نام ستونهارو مثل datagridview فارسی کنم بدون آنکه تو اصل موضوع تغییر نکنه یعنی نام فیلدها تغییر نکنه چکار کنم
با تشکر

اگه منظورتون فقط عنوان ستونهاست در Column Editor، خاصیت Title ستون مربوطه را تغییر دهید. Title فقط نام ظاهری ستون شماست.

tvg77
جمعه 01 شهریور 1387, 19:48 عصر
اگر بخواهیم زبانی غیر از فارسی و انگلیسی مثل چینی نمایش دهیم چه باید بکنیم من این سوال به عنوان یک تاپیک مطرح کردم لطفا راهنمایی کنید فونت و زبان ویندوز را نیز تغییر دادم ولی بازم نتیجه نگرفتم اطلاعات ستون مورد نظر به صورت ؟ نمایش داده می شود.
قسمت language for none unicode را نیز تغییر دادم ولی بازم نشد

Hsimple11
شنبه 02 شهریور 1387, 00:20 صبح
اگر بخواهیم زبانی غیر از فارسی و انگلیسی مثل چینی نمایش دهیم چه باید بکنیم من این سوال به عنوان یک تاپیک مطرح کردم لطفا راهنمایی کنید فونت و زبان ویندوز را نیز تغییر دادم ولی بازم نتیجه نگرفتم اطلاعات ستون مورد نظر به صورت ؟ نمایش داده می شود.
قسمت language for none unicode را نیز تغییر دادم ولی بازم نشد

این ستون مورد نظر چه نوع داده ای دارد؟

بعلاوه در سایت کلماتی نظیر -عدم نمایش- حروف به هم ریخته- بانک- را جستجو کنید. Character Set فونت شما در گرید، در پایگاه Collation و تنظیمات ویندوز همه در این امر تاثیر دارند. همه را چک کنید.

amin_alexi
شنبه 02 شهریور 1387, 10:24 صبح
سلام
با اجازه منم یه چیزی اضافه میکنم ... خیلیها معمولا سوال می کنن ...
اضافه کردن CheckBox یا Edit و ... در DbGrid

در این لینک آقای کرامتی به صورت کامل توضیح دادن دستشون درد نکنه ...
How to put components into a cell on a TDBGrid
http://barnamenevis.org/forum/showthread.php?t=1354

mortezakiaee
شنبه 02 شهریور 1387, 16:00 عصر
در مورد مرتب کردن(sort) ستون های یه DBGrid زیاد بحث شده این یه نمونه خوب برای سورت با کلیک بر روی عنوان ستون


procedure Tmain_frm.DBGrid1TitleClick(Column: TColumn);
var i: integer;
begin
if (Column.Title.Font.Style = [fsbold]) and (Column.Title.Font.Color = clWindowText)then begin
TADOQuery(Column.Grid.DataSource.DataSet).Sort:='['+Column.FieldName+']'+' DESC' ;
for i:=0 to TDBGrid(Column.Grid).Columns.Count-1 do begin
TDBGrid(Column.Grid).Columns[i].Title.Font.Style:=[];
TDBGrid(Column.Grid).Columns[i].Title.Font.Color:= clWindowText; end;
Column.Title.Font.Style:=[fsbold];
Column.Title.Font.Color:= clred; end
else begin
TADOQuery(Column.Grid.DataSource.DataSet).Sort:='['+Column.FieldName+']' ;
for i:=0 to TDBGrid(Column.Grid).Columns.Count-1 do begin
TDBGrid(Column.Grid).Columns[i].Title.Font.Style:=[];
TDBGrid(Column.Grid).Columns[i].Title.Font.Color:= clWindowText; end;
Column.Title.Font.Style:=[fsbold]; end;
end;


پ.ن. اگه بشه یه جوری این کد رو تغییر بدیم که یه فلش هم نشون بده عالی میشه:چشمک::قلب:

Hsimple11
شنبه 02 شهریور 1387, 22:14 عصر
با سلام و خسته نباشید.
در این پست ادامه مبحث مربوط به DBGrid رو ادامه میدیم.


تعریف ستون های لیستی

اگر میخواهید ستونی یک لیست ثابت رو نشون بدهو مقادیر اون از داخل یک لیست قابل انتخاب باشه (مثل یه ComboBox) مراحل زیر را انجام دهید :


1- ستون مورد نظر را از لیست ستون ها انتخاب کنید (ColumnEditor)
2- خاصیت ButtonStyle ستون رو cbsAuto قرار بدید.
3- بر روی خاصیت PickList در Object Inspector دوبار کلیک کنید. مقادیری را که میخواهید در ستون مورد نظر قابل انتخاب کردن باشند را در اینجا وارد کنید.


تعریف ستونهای کلیدی

یک ستون میتونه علامت (...) رو در قالب یک دکمه در سمت راست خودش نشون بده تا کاربر با کلیک بر روی اون و یا با Ctrl+Enter بتونه اطلاعات بیشتری راجع به اون فیلد ببینه. مثلا فرض کنید فیلد شما حاوی تصاویر است. میتونید ستون مرتبط با این فیلد رو به این صورت تعریف کنید تا هنگام انتخاب اون، یه فرم که تصویر انتخاب شده را نشون میده فعال شده و کاربر بتونه تصویر و یا توضیحات خاصی رو ببینه. برای ایجاد چنین ستونی مراحل زیر را باید انجام دهید :


1- ستون مورد نظر را انتخاب کنید. (در ویرایشگر ستونها)
2- خاصیت ButtonStyle را cbsEllipsis قرار دهید.
3- کد مربوط به کار مورد نظر خودتون رو (مثلا نمایش یه فرم دیگه یا توضیحات خاص یا...) در رویداد OnEditButtonClick مربوط به DBGrid بنویسید.


DBGrid Options

این خاصیت رو در Object Inspector برای یک عنصر DBGrid میبینید. که شامل گزینه های ذیل است :


☻ DgEditing

True : وقتی یک فیلد انتخاب می شوند در مد ویرایش باشد.
False : وقتی یک فیلد انتخاب می شود بصورت پیش فرض در مد ویرایش نباشد.


☻ DgAlwaysShowEditor

True : تمام فیلدهای انتخاب شده همواره در حالت ویرایش باشند.
False : که بصورت پیش فرض فعال است و فیلد همواره با کلیک بر روی آن در مد ویرایش نیست.


☻ DgTitles

True : نام فیلدها در بالای گرید نمایش داده شود.
False : نام فیلدها در بالای گرید نمایش داده نشود.


☻ DgIndicator

True : یک علامت اشاره در سمت چپ گرید نمایش داده می شود که رکورد انتخاب شده را نشان می دهد.
False : ایم علامت اشاره را نشان ندهد.


☻ DgColumnResize

True : ستونها در زمان اجرا توسط کاربر قابل تغییر سایز باشند.
False : ستونها این قابلیت رو نداشته باشند.


☻ DgCollines

True : خطهای جدا کننده ستونها را نشان دهد.


☻ DgRowLines

True : خط های بین سطر ها را نشان دهد.


☻ DgTabs

True : با کلید Tab میتوان بیت ستونها حرکت کرد.
False : فشردن Tab باعث خارج شدن فوکوس از گرید می شود.


☻ DgRowSelect

True : با انتخاب یه فیلد، تمام فیلدهای رکورد انتخاب می شوند.
False : انتخاب یک فیلد فقط همان فیلد را انتخاب میکند.


☻ DgAlwaysShowSelection

True : رکورد انتخاب شده همیشه نشان داده شود. حتی اگر فوکوس بر روی کنترل دیگری باشد.
False : رکورد انتخاب شده وقتی بصورت پررنگ است که Focus بر روی DBGrid باشد.


☻ DgConfirmDelete

True : اگر کاربر بخواهد رکوردی را حذف کند (Ctrl+Del) یک پیغام نمایش داده شود.


☻ DgCancelOnExit

True : اگر رکوردی را Insert کنید و بدون ثبت آن از گرید خارج شوید، این رکورد ثبت نمی شود.
False : رکورد Insert شده به هنگام خروج ثبت می شود.


☻ DgMultiSelect

True : به کاربر اجازه می دهد که چندین رکورد را با هم انتخاب کند.



امیدوارم این تاپیک کم کم تاپیک کاملی بشه.
در پست بعد ادامه میدیم....

ariobarzan
سه شنبه 05 شهریور 1387, 07:34 صبح
با تشكر خيلي زياد از زحمتي كه كشيديد و اين تاپيك رو ايجاد كرديد.
شايد يه موضوع كه خيلي از دوستان باهاش برخورد داشتند اين بوده كه چطور ميشه طول يك ستون در ديبي گريد را با توجه به اندازه طول بزرگترين مقدار فيلد در ديتا بيس بطور اتوماتيك تنظيم كرد؟
مثلا فرض كنيم فيلدي حاوي آدرس افراد باشه كه اندازه اون هم طبيعتا براي هر ركورد متغيره
حالا ميخواهيم ستون فيلد آدرس بر اساس اندازه بزرگترين آدرس تنظيم بشه جوري كه همه آدرس ها كامل ديده بشوند .
لطفا راهنمايي كنيد.
باز هم تشكر

Hsimple11
سه شنبه 05 شهریور 1387, 10:12 صبح
چطور ميشه طول يك ستون در ديبي گريد را با توجه به اندازه طول بزرگترين مقدار فيلد در ديتا بيس بطور اتوماتيك تنظيم كرد؟

البته این راه حل منطقی نیست. اما میتونید از خاصیت Canvas.TextWidth گرید خود استفاده کنید و با چند حلقه طولانی ترین رکورد را در فیلد بدست بیاورید و بعد عرض ستون را مطابق آن تنظیم کنید :


procedure SetGridColumnWidths(Grid: Tdbgrid);
const
DEFBORDER = 10;
var
temp, n: Integer;
lmax: array [0..30] of Integer;
begin
with Grid do
begin
Canvas.Font := Font;
for n := 0 to Columns.Count - 1 do
lmax[n] := Canvas.TextWidth(Fields[n].FieldName) + DEFBORDER;
grid.DataSource.DataSet.First;
while not grid.DataSource.DataSet.EOF do
begin
for n := 0 to Columns.Count - 1 do
begin
temp := Canvas.TextWidth(trim(Columns[n].Field.DisplayText))
+ DEFBORDER;
if temp > lmax[n] then lmax[n] := temp;
end; {for}
grid.DataSource.DataSet.Next;
end;
grid.DataSource.DataSet.First;
for n := 0 to Columns.Count - 1 do
if lmax[n] > 0 then
Columns[n].Width := lmax[n];
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetGridColumnWidths(DBGrid1);
end;


این دو لینک را در مورد AutoSize کردن ستونهای DBGRID ببینید :

1 (http://delphi.about.com/od/usedbvcl/a/dbgrid_autofit.htm)
2 (http://delphi.about.com/od/usedbvcl/l/aa050404a.htm)

nasr
چهارشنبه 06 شهریور 1387, 09:47 صبح
در مورد مرتب کردن(sort) ستون های یه DBGrid زیاد بحث شده این یه نمونه خوب برای سورت با کلیک بر روی عنوان ستون


procedure Tmain_frm.DBGrid1TitleClick(Column: TColumn);
var i: integer;
begin
if (Column.Title.Font.Style = [fsbold]) and (Column.Title.Font.Color = clWindowText)then begin
TADOQuery(Column.Grid.DataSource.DataSet).Sort:='['+Column.FieldName+']'+' DESC' ;
for i:=0 to TDBGrid(Column.Grid).Columns.Count-1 do begin
TDBGrid(Column.Grid).Columns[i].Title.Font.Style:=[];
TDBGrid(Column.Grid).Columns[i].Title.Font.Color:= clWindowText; end;
Column.Title.Font.Style:=[fsbold];
Column.Title.Font.Color:= clred; end
else begin
TADOQuery(Column.Grid.DataSource.DataSet).Sort:='['+Column.FieldName+']' ;
for i:=0 to TDBGrid(Column.Grid).Columns.Count-1 do begin
TDBGrid(Column.Grid).Columns[i].Title.Font.Style:=[];
TDBGrid(Column.Grid).Columns[i].Title.Font.Color:= clWindowText; end;
Column.Title.Font.Style:=[fsbold]; end;
end;
پ.ن. اگه بشه یه جوری این کد رو تغییر بدیم که یه فلش هم نشون بده عالی میشه:چشمک::قلب:




با این کد


if DBGrid1.DataSource.DataSet is TCustomADODataSet then
with TCustomADODataSet(DBGrid1.DataSource.DataSet) do
begin
try
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style :=
DBGrid1.Columns[PreviousColumnIndex].title.Font.Style - [fsBold];
except
end;

Column.title.Font.Style :=
Column.title.Font.Style + [fsBold];
PreviousColumnIndex := Column.Index;

if (Pos(Column.Field.FieldName, Sort) = 1) and (Pos(' DESC', Sort)= 0) then
Sort := Column.Field.FieldName + ' DESC'
else
Sort := Column.Field.FieldName + ' ASC';
end; }




و این کد هم میشه



if Column.Title.Font.Color = clRed then
begin
TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort := Column.Field.FieldName + ' ASC';
Column.Title.Font.Color := clBlack;
end else
begin
TCustomADODataSet(DBGrid1.DataSource.DataSet).Sort := Column.Field.FieldName + ' DESC';
Column.Title.Font.Color := clRed;
end;

hadisalahi2
چهارشنبه 06 شهریور 1387, 12:55 عصر
با اجازه بزرگترها من یه پیشنهاد دارم.
اول اینکه این تاپیک رو در قسمت اعلان ها قرار بدید تا همیشه در دسترس باشه
دوم اینکه هر کدوم از دوستا قبلا خودشون در باره این موضوع سوال کردند و یا جواب سوالی را دادند ، آدرس اون تاپیک رو هم بذارن
و سوم اینکه در مورد طریقه های مختلف رنگی کردن سطرهای DBGrid هم توضیح بدید.

Hsimple11
چهارشنبه 06 شهریور 1387, 20:25 عصر
اول اینکه این تاپیک رو در قسمت اعلان ها قرار بدید تا همیشه در دسترس باشه
دوم اینکه هر کدوم از دوستا قبلا خودشون در باره این موضوع سوال کردند و یا جواب سوالی را دادند ، آدرس اون تاپیک رو هم بذارن
و سوم اینکه در مورد طریقه های مختلف رنگی کردن سطرهای DBGrid هم توضیح بدید.

مرسی از پیشنهادهای شما.

در مورد اول هنوز این تاپیک کامل نشده و خیلی مونده تا نسبتا مرجع بشه.

در مورد دوم، بله من هم امیدوارم!

و د رمورد رنگ کردن در همین تاپیک مقاله ای با عنوان رنگ کردن DBGRID قرار داده ام. اگر مشکلی بود بفرمایید.

nasr
پنج شنبه 07 شهریور 1387, 07:37 صبح
این برای رنگی کردن رکوردها است



procedure TFormAnbar.DBGrid4DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
begin
if Rangi <> true then
Exit;

if not (gdSelected in state) then
begin
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 0 then
Color := clWindow; //RGB(224, 231, 223) //a color
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 1 then
Color := $006464FF; //RGB(224, 231, 223) //a color
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 2 then
Color := $0051FF51; //RGB(224, 231, 223) //a color
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 3 then
Color := $0080FFFF; //RGB(224, 231, 223) //a color
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 4 then
Color := $00F59D96; //RGB(224, 231, 223) //a color
if (TBScanerDetail.FieldByName('Quality2').AsInteger) = 5 then
Color := $002D7DF7; //RGB(224, 231, 223) //a color

Dbgrid4.Canvas.Brush.Color := Color;
Dbgrid4.Canvas.FillRect(Rect);
end;
DBGrid4.DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;

Hsimple11
پنج شنبه 07 شهریور 1387, 18:20 عصر
امروز متاسفانه زیاد وقت ندارم بخاطر پست کوتاهم عذرخواهی میکنم.


ویرایش در گرید

اگر بخواهیم در زمان اجرا داده های گریدمون رو ویرایش کنیم یا رکورد جدید ایجاد کنیم باید 2 شرط زیر برقرار باشه :

1- خاصیت CanModify از DataSet برابر با True باشد.
2- خاصیت ReadOnly از گرید، False باشه.

وقتی کاربر داده های یک رکورد رو ویرایش میکنه ، این تغییرات در یک بافر لوکال ذخیره میشه و اگر کاربر به رکورد بعدی بره، اونوقت این تغییرات در دیتاست شما ثبت میشه که اگه کلید Esc رو بزنید از تغییرات صرفنظر خواهد شد. اگر هم موقع بروزرسانی داده ها مشکلی پیش بیاد، مثلا محتولی یک فیلد بزرگتر از سایز اون در دیتاست باشه، اونوقت دلفی به شما پیغام خطا میده.


در پست بعد ادامه میدیم....

hadisalahi2
پنج شنبه 07 شهریور 1387, 20:07 عصر
آقای حامد خان من مقاله رنگی کردن سطرها رو خوندم .
حالا اگه من بخوام سطرهای من به صورت یک درمیان رنگ بشوند باید چی کار کنم.
مثل GRidView که در ASP.Net وجود داره.
ممنون از لطفتون
یا حق

Hsimple11
پنج شنبه 07 شهریور 1387, 22:25 عصر
باز هم قوانین سایت رو رعایت نکردید. جستجو میکردید. حتی مثال آن هم در سایت وجود دارد.

رنگ / سطر / Custom Row / و ... میتونن Keyword های شما باشند.

hadisalahi2
شنبه 09 شهریور 1387, 17:05 عصر
آقا حامد ، من توی سایت به حالتهای مختلف و با کلمات کلید گوناگون جستجو کردم ولی متاسفانه چیزی که در مورد رنگی کردن یک در میان رکورد ها نوشته شده باشه پیدا نکردم. اگه زحمتی نیست شما دو تا آدرس تاپیک بگذارید. ممنون میشم.

Hsimple11
شنبه 09 شهریور 1387, 20:54 عصر
من توی سایت به حالتهای مختلف و با کلمات کلید گوناگون جستجو کردم ولی متاسفانه چیزی که در مورد رنگی کردن یک در میان رکورد ها نوشته شده باشه پیدا نکردم.

آقا هادی خان! باید در هر جستجو کلمات کلیدی خودتون رو پیدا کنید.

http://www.barnamenevis.org/forum/showthread.php?t=74289&highlight=%D8%B1%D9%86%DA%AF+%D8%B3%D8%B7%D8%B1
http://www.barnamenevis.org/forum/showthread.php?t=59142&highlight=%D8%B1%D9%86%DA%AF+%D8%B3%D8%B7%D8%B1
http://www.barnamenevis.org/forum/showthread.php?t=57182&highlight=%D8%B1%D9%86%DA%AF+%D8%B3%D8%B7%D8%B1
http://www.barnamenevis.org/forum/showthread.php?t=41519&highlight=%D8%B1%D9%86%DA%AF+%D8%B3%D8%B7%D8%B1
http://barnamenevis.org/forum/showthread.php?t=56858&highlight=color+dbgrid#3

تازه فکر کنم تعداد تاپیکهای مرتبط بیشتر هم بود...

Hsimple11
یک شنبه 10 شهریور 1387, 12:12 عصر
با سلام و روز بخیر...

ادامه مبحث DBGrid ....



جابجایی ستون ها

در زمان طراحی : یک ستون را با ماوس انتخاب میکنیم و Drag میکنیم. همین!

در زمان اجرا : تنها در صورتی User ها میتونن ستونها رو در زمان اجرا جابجا کنند که خاصیت DragMode برابر با dmManual باشه یعنی بشه بصورت دستی تنظیمش کرد. اگر کاربر یک ستون را جابجا کند رویداد OnColumnMoved رخ میدهد که میتونیم متد خودمون رو اونجا بنویسیم تا به هنگام جابجایی ستون اجرا شود. برای جلوگیری از انتقال ستونها توسط کاربران در زمان اجرا خاصیت DragMode را به dmAutomatic تغییر دهید. (فکر میکنم این مسئله رو خیلی ها رعایت نمی کنند)


کنترل رسم

اولین سطح کنترل رسم گرید، تعیین خواص ستونها می باشد. این خواص چگونگی ظاهر شدن یک ستون را مشخص میکنند. گرید بصورت اتوماتیک از خواص فونت، رنگ و ... یک ستون برای رسم سلولها استفاده میکنه. متن داخل سلولها مطابق با خواص DisplayFormat یا EditFormat از فیلدهای مرتبط رسم میشه. اگر میخواهید رسم پیش فرض رو بهبود ببخشید، میتونید کد مورد نظرتون رو در رویداد OnDrawColumnCell بنویسید. اگر میخواهید رسم پیش فرض انجام بشه و بعد از اون رسم شما انجام بگیره خاصیت DefaultDrawing را True کنید. در اینصورت ابتدا رسم پیش فرض صورت میگیرد و بعد بلافاصله رسم شما انجام می شود. این کار وقتی به درد میخوره که مثلا میخواهید یک ستون ثابت خالی داشته باشید و بخواهید در آن تصویر رسم کنید.

اگر میخواهید رسم تمام گرید رو خودتون به دست بگیرید، خاصیت DefaultDrawing را False کنید و کد خودتون رو در رویداد OnDrawColumnCell بنویسید.

اگر میخواهید که رسم ستونهای خاصی رو خودتان انجام دهید و بقیه ستونها بصورت پیشفرض رسم شوند، میتوانید DefaultDrawColumnCell را در داخل رویداد OnDrawColumnCell فراخوانی کنید. مثال آن در مقاله رنگ کردن DBGrid موجود است.



در پست بعد ادامه میدیم....

Hsimple11
سه شنبه 12 شهریور 1387, 16:32 عصر
در چند پست آینده قصد دارم تمام تاپیکهایی که در مورد DBGrid بحث کرده اند رو قرار بدم. فکر میکنم برای کامل شدن این تاپیک مفید باشه :


1- قرار دادن آيكن در يكي از فيلدها در DBGRID (http://barnamenevis.org/forum/showthread.php?t=118611&highlight=Grid)
2- تبدیل گرید به فایل Excel (http://barnamenevis.org/forum/showthread.php?t=118009&highlight=Grid)
3- برنامه نمایش اشعار (http://barnamenevis.org/forum/showthread.php?t=110671&highlight=Grid)
4- چطوري ميشه به cell خاص از يه رديف انتخاب شده در dbgrid دسترسي داشت؟ (http://barnamenevis.org/forum/showthread.php?t=110375&highlight=Grid)
5- ایجاد Box در بالا و پایین ستونهای Grid (http://barnamenevis.org/forum/showthread.php?t=106056&highlight=Grid)
6- گذاشتن ComboBox در يكي از سلولهاي DBGrid (http://barnamenevis.org/forum/showthread.php?t=107634&highlight=Grid)
7- دیبی گرید شفاف (http://barnamenevis.org/forum/showthread.php?t=105629&highlight=Grid)
8- سه رقم شدن اعداد در هنگام تایپ درdbgrid (http://barnamenevis.org/forum/showthread.php?t=102989&highlight=Grid)
9- انتقال Grid به Excel (http://barnamenevis.org/forum/showthread.php?t=100231&highlight=Grid)
10- استفاده drop down lookup field in dbgrid (http://barnamenevis.org/forum/showthread.php?t=100003&highlight=Grid)

11- کمک خیلی فوری لطفا !!!!! DBGRID (http://barnamenevis.org/forum/showthread.php?t=39978&highlight=Grid)
12- استفاده از Grid بدون اتصال به DB (http://barnamenevis.org/forum/showthread.php?t=99109&highlight=Grid)
13- انتخاب سطر و ستون انتخابی در dbgrid (http://barnamenevis.org/forum/showthread.php?t=98743&highlight=Grid)
14- چاپ محتوای Grid در FastReport بصورت اتوماتیک (http://barnamenevis.org/forum/showthread.php?t=98253&highlight=Grid)
15- خروجی یک کئوری در چند dbgrid (http://barnamenevis.org/forum/showthread.php?t=96735&highlight=Grid)
16- رفتن به رکورد datagrid (http://barnamenevis.org/forum/showthread.php?t=94046&highlight=Grid)
17- ساخت کامپوننت (http://barnamenevis.org/forum/showthread.php?t=90959&highlight=Grid)
18- بروز رسانی dbgrid با استفاده از تایمر (http://barnamenevis.org/forum/showthread.php?t=90723&highlight=Grid)
19- اضافه کردن ردیف در dbgrid (http://barnamenevis.org/forum/showthread.php?t=87553&highlight=Grid)
20- تغییر رکورد در DBGRID با MOUSEWHEEL (http://barnamenevis.org/forum/showthread.php?t=86224&highlight=Grid)

Hsimple11
دوشنبه 18 شهریور 1387, 13:05 عصر
خوشحال میشم دوستان هم برای کامل شدن این تاپیک نظر بدهند.


موفق باشید.

Hsimple11
جمعه 22 شهریور 1387, 00:57 صبح
مثل اینکه متاسفانه یکی دیگه از مشکلات اینه که کاربران بیشتر صفحه اول هر تاپیکی رو مشاهده می کنند.

solook
جمعه 22 شهریور 1387, 08:12 صبح
کارتون واقعا جای تحسین داره

یک مطلب هم در مورد کپی کردن قسمت های انتخاب شده DBgrid بگید

Hsimple11
جمعه 22 شهریور 1387, 14:18 عصر
یک مطلب هم در مورد کپی کردن قسمت های انتخاب شده DBgrid بگید

فکر میکنم کامل باشه :

Copying and Pasting Cell Values in a DBGrid (http://www.automatedqa.com/community/Home/Articles/tabid/38/articleType/ArticleView/articleId/549/Default.aspx)

tagarg
چهارشنبه 27 شهریور 1387, 14:35 عصر
اگه بخوایم چند سطر تو دیبی گرید رو با هم انتخاب کنیم چه کاری میشه کرد؟
مثلا با Drag یا نگه داشتن Shift+Arrowkey؟؟؟
نیاز فوری دارم :ناراحت:

Hsimple11
چهارشنبه 27 شهریور 1387, 14:44 عصر
اگه بخوایم چند سطر تو دیبی گرید رو با هم انتخاب کنیم چه کاری میشه کرد؟

اگه قبل از مطرح کردن سوال همین تاپیک را کامل میخوندید متوجه می شدید.

در مورد Option های DBGrid در صفحه قبل توضیح داده شده است. (dgMultiSelect)

ariobarzan
پنج شنبه 28 شهریور 1387, 09:21 صبح
با تشكر از اطلاعات مفيدتون
من ميخوام تعدادي از ركورد هاي دي بي گريد توسط كاربر انتخاب بشه و بعد تغييراتي روي بعضي از فيلدهاي اون انجام بشه
خاصيت dgmultiselect را true كردم و حالا امكان انتخاب چند ركورد فراهم شده
تا اينجا خوب بوده ولي نميدونم چطور با اين ركورد هاي انتخاب شده ارتباط برقرار كنم و بعضي فيلد هاشونو ويرايش كنم
ممكنه راهنمايي بفرماييد
ممنون

Hsimple11
پنج شنبه 28 شهریور 1387, 13:23 عصر
از اونجا که این خاصیت معمولا با خاصیت dbRowSelect همزمان True می شود برای ویرایش داده ها استفاده نمی شود. اما میتوانید از متد GotoBookMark برای دسترسی به واحدهای انتخاب شده استفاده کنید. ذر واقع رکوردها یا ردیفهای انتخاب شده در DbGrid به عنوان BookMark هایی در خاصیت SelectedRows ثبت می شوند. اما باید توجه داشته باشید که نمیشه از این خاصیت برای هر منظوری استفاده کرد. مثلا میتونید با یک حلقه به تعداد رکوردهای انتخاب شده مقدار یک فیلد رو بخونید و بعد مثلا SUM اون رو حساب کنید یا .... این لینک ها را ببینید :

Summing multiple selected rows in a DBGrid (http://delphi.about.com/cs/adptips2000/a/bltip0600_5.htm)

DBGrid with MultiSelect (http://delphi.about.com/od/usedbvcl/l/aa032503a.htm)

ariobarzan
شنبه 30 شهریور 1387, 08:37 صبح
با سلام
ضمن تشكر از توجه شما من با استفاده از لينكي كه شما ذكر كرده بوديد كد زير را نوشتم
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
ADOTable1.Open;
for i := 1 to DBGrid1.SelectedRows.Count do
begin
ADOTable1.Edit;
ADOTable1.GotoBookmark(Pointer(DBGrid1.SelectedRow s.Items[i-1]));
ADOTable1.FieldValues['TitleOfCourtesy']:='Dr';
ADOTable1.Post;
end;
end;


ولي با وجود اينكه جدول در حالت اديت قرار داره ولي موقع اجرا پيام ميده كه جدول در حالت
edit يا insert قرار نداره
بانك برنامه northwind و جدول هم Employees انتخاب شده
با تشكر

Hsimple11
شنبه 30 شهریور 1387, 11:31 صبح
1- بهتر است حلقه خود را از 0 تا SelectedRows.Count-1 بگذارید.

2- زمانی که از متد GotoBookMark برای یافتن رکوردهای انتخاب شده استفاده میکنید DataSet شما از حالت Edit خارج می شود. بنابراین ADOTable.Edit را باید بعد از این متد قرار دهید.

موفق باشید.

ariobarzan
شنبه 30 شهریور 1387, 11:58 صبح
با سلام
از راهنمايتون ممنونم :تشویق::تشویق::تشویق::تشویق:: شویق::تشویق::تشویق::تشویق::ت ویق::تشویق::تشویق::تشویق::تش یق::تشویق::تشویق::تشویق:
مشكل حل شد :قهقهه::قهقهه::قهقهه:
البته وقتي شمارش از 0 تا 1- DBGrid1.SelectedRows.Count با شه پيغام خطا ميده
باز هم ممنون

Hsimple11
شنبه 30 شهریور 1387, 16:52 عصر
مشکل احتمالا چیز دیگری است.

net_ved
یک شنبه 31 شهریور 1387, 11:48 صبح
کسی کدی داره که بتونه قسمتی از متن جستجو شده رو رنگی کنه
یعنی مثلا اگه من دو حرف "در" را تایپ کردم ... اول از همه جدولم با یه فیلتر یا دستور اس کیو ال محدود بشه به اون رکرد هایی که شامل "در" هستند که تا اینجاشو بلدم که با Like %"در"% انجام می دم ... حالا می خوام توی تمام رکرد های یافت شده دو حرف "در" در فیلدها های لایت شود که نمایان باشد کجای جمله جستجو شده
امیدوارم واضح گفته باشم ...

Hsimple11
یک شنبه 31 شهریور 1387, 13:32 عصر
کدهای تمام چیزهایی که گفتید در سایت وجود داره. هم رنگ کردن رکوردها، هم یافتن حروف جستجو شده. فکر کنم با همین تاپیک بتوانید به هدف برسید.


موفق باشید.

carbon
شنبه 13 مهر 1387, 02:26 صبح
سلام و خسنه نباشيد براي مطالب جامعتون.
من دنبال راهي ميگردم كه بشه در سلول هاي يك dbgrid عكس زمينه گذاشت.
منظور يك عكس زمينه ثابت براي تمام سلول هاست.
و بعد از اون سلول انتخاب شده عكس زمينش عوض بشه.
تشكر.

carbon
دوشنبه 15 مهر 1387, 23:45 عصر
سلام
كسي خونه نيست.
بحث اين تاپيك مگه تموم شده؟؟؟
يكي به دادم برسه لطفا.:گریه::گریه::گریه: :گیج::گیج::گیج:
اين عكس رو مي خوام بذارم back سلول ها http://barnamenevis.org/forum/attachment.php?attachmentid=24153&stc=1&d=1226003905
و اينم وقتي يه cell انتخاب شد. http://barnamenevis.org/forum/attachment.php?attachmentid=24154&stc=1&d=1226003905

كه در آخر تبديل شه به اين
http://barnamenevis.org/forum/attachment.php?attachmentid=24155&stc=1&d=1226003905

tefos666
پنج شنبه 02 آبان 1387, 20:17 عصر
سلام
كسي خونه نيست.
بحث اين تاپيك مگه تموم شده؟؟؟
يكي به دادم برسه لطفا.:گریه::گریه::گریه: :گیج::گیج::گیج:
اين عكس رو مي خوام بذارم back سلول ها http://barnamenevis.org/forum/attachment.php?attachmentid=24153&stc=1&d=1226003905
و اينم وقتي يه cell انتخاب شد. http://barnamenevis.org/forum/attachment.php?attachmentid=24154&stc=1&d=1226003905

كه در آخر تبديل شه به اين
http://barnamenevis.org/forum/attachment.php?attachmentid=24155&stc=1&d=1226003905


دوست عزیز من راه رو پیدا کردم ولی نمیتونم سایزش رو درست کنم و در ضمن ایراد دوم اینه که وقتی تو حالت ادیت میره کل عکس پاک میشه من سورس رو از اینجا پیدا کردم ولی نتونستم استفاده کنم با تغییراتی که دادم موفق شدم اجراش کنم
تازه اگه اینو تو گوگل سرچ کنی کلی سایت در این مورد برات میاره

Drawing an image in a cell of a Delphi DBGrid

http://delphi.about.com/library/weekly/aa032205a.htm

اینم کد خودم بعد از دستکاری

در اینجا اسم گرید من DBGrid_ostan هستش دوتا فیلد name , id داره
اسم imagelist همون ImageList1 هستش توشم عکسها رو گذاشتم رنگ سبز index 0 هستش و نارنجی index 1 البته مجبور شدم عکسهات رو با فتوشاپ به bmp تبدیل کنم
چند تا کامپوننت هم پیدا کردم که همین کار رو میکنه ولی بهتره راه حل رو با خود گرید دلفی پیدا کنیم - کسی میتونه راهنمایی کنه ؟ تازه چطوری کدش رو بنویسیم که رنگها رو یکی در میون نشون بده ؟ میشه recordcount کل گرید رو گرفت و با تقسیم بر 2 باقیمانده ها رو ..... یه چیزی تو این مایه ها که فردها سبز باشند و زوجها نارنجی




procedure Tfrm_ostan.DBGrid_ostanDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
bitmap : TBitmap;
fixRect : TRect;
bmpWidth : integer;
imgIndex : integer;
begin
fixRect := Rect;
if DBGrid_ostan.Columns.Items[0].FieldName='id' then
begin
if DBGrid_ostan.Fields[0].Value > 1 then
imgIndex := 0
else if DBGrid_ostan.Fields[0].Value > 2 then
imgIndex := 1
else
imgIndex := 1;
bitmap := TBitmap.Create;
try

ImageList1.GetBitmap(imgIndex,bitmap);
bmpWidth := (Rect.Bottom - Rect.Top);
fixRect.Right := Rect.Left + bmpWidth;
DBGrid_ostan.Canvas.StretchDraw(fixRect,bitmap);
finally
bitmap.Free;
end;
fixRect := Rect;
fixRect.Left := fixRect.Left + bmpWidth;
end;
DBGrid_ostan.DefaultDrawColumnCell( fixRect, DataCol, Column, State);

end;

end.

qazwsx
پنج شنبه 02 آبان 1387, 22:24 عصر
سلام یه سوال دارم من یه DBGrid تو فرمم دارم که با دستورات sql از یه جدول یه جستجو رو نمایش میده حالا من میخوام تو این DBGrid ستون اول و سطر آخر رو بخونم باید چه کدی استفاده کنم

carbon
سه شنبه 07 آبان 1387, 00:06 صبح
دوست عزیز من راه رو پیدا کردم ولی نمیتونم سایزش رو درست کنم و در ضمن ایراد دوم اینه که وقتی تو حالت ادیت میره کل عکس پاک میشه من سورس رو از اینجا پیدا کردم ولی نتونستم استفاده کنم با تغییراتی که دادم موفق شدم اجراش کنم
تازه اگه اینو تو گوگل سرچ کنی کلی سایت در این مورد برات میاره

Drawing an image in a cell of a Delphi DBGrid

http://delphi.about.com/library/weekly/aa032205a.htm

اینم کد خودم بعد از دستکاری

در اینجا اسم گرید من DBGrid_ostan هستش دوتا فیلد name , id داره
اسم imagelist همون ImageList1 هستش توشم عکسها رو گذاشتم رنگ سبز index 0 هستش و نارنجی index 1 البته مجبور شدم عکسهات رو با فتوشاپ به bmp تبدیل کنم
چند تا کامپوننت هم پیدا کردم که همین کار رو میکنه ولی بهتره راه حل رو با خود گرید دلفی پیدا کنیم - کسی میتونه راهنمایی کنه ؟ تازه چطوری کدش رو بنویسیم که رنگها رو یکی در میون نشون بده ؟ میشه recordcount کل گرید رو گرفت و با تقسیم بر 2 باقیمانده ها رو ..... یه چیزی تو این مایه ها که فردها سبز باشند و زوجها نارنجی




procedure Tfrm_ostan.DBGrid_ostanDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
bitmap : TBitmap;
fixRect : TRect;
bmpWidth : integer;
imgIndex : integer;
begin
fixRect := Rect;
if DBGrid_ostan.Columns.Items[0].FieldName='id' then
begin
if DBGrid_ostan.Fields[0].Value > 1 then
imgIndex := 0
else if DBGrid_ostan.Fields[0].Value > 2 then
imgIndex := 1
else
imgIndex := 1;
bitmap := TBitmap.Create;
try

ImageList1.GetBitmap(imgIndex,bitmap);
bmpWidth := (Rect.Bottom - Rect.Top);
fixRect.Right := Rect.Left + bmpWidth;
DBGrid_ostan.Canvas.StretchDraw(fixRect,bitmap);
finally
bitmap.Free;
end;
fixRect := Rect;
fixRect.Left := fixRect.Left + bmpWidth;
end;
DBGrid_ostan.DefaultDrawColumnCell( fixRect, DataCol, Column, State);

end;

end.




سلام

من از tms component استفاده كردم. بد نيست ولي سلول جاري رو ار حالت عكس دار خارج مي كنه.
اين كد شما هم همينطوره ؟؟؟؟؟؟
دوم اين كه نوشته ها روي عكس ميان يا نه؟؟؟؟
ممنون.

در ضمن لينك رو هم قبلا ديده بودم.

carbon
سه شنبه 07 آبان 1387, 00:10 صبح
سلام یه سوال دارم من یه DBGrid تو فرمم دارم که با دستورات sql از یه جدول یه جستجو رو نمایش میده حالا من میخوام تو این DBGrid ستون اول و سطر آخر رو بخونم باید چه کدی استفاده کنم

يعني چي ستون اول و سطر آخر رو بخونيد.
بيشتر توضيح بديد.

براي سطر آخر ميتونيد از ADOQuery.last استفاده كنيد.
منظور از ستون اول رو هم متوجه نميشم.

negarin5340
یک شنبه 17 آذر 1387, 12:23 عصر
سلام من میخوام با انتخاب رکورد و زدن بر روی یک کلید اون رکورد رنگی شه در ضمن من از پارادوکس هم استفاده می کنم در ضمن اطلاعاتی که در این تایپک گذاشتید خوبه ممکنه این چیزی خواستم باشه در تایپیک اگه ممکنه linkاونو برام بذارید اگه منو راهنمایی کنید ممنون میشم

ariobarzan
دوشنبه 18 آذر 1387, 11:42 صبح
با تشكر از دوستان كه مطالب مفيدي را در اختيار ما قرار دادند

قبلا در مورد انتخاب تعداد خاصي از ركورد ها در دي بي گريد و ويرايش اطلاعات فيلد هاي اون بحث شد كه نتيجه خوبي هم داشت

حالا موضوع اينه كه اگه بخواهيم تغييراتي در اطلاعات افراد انتخاب نشده بديم
چكار بايد كرد؟

مثال براي افرادي كه كاربر انتخاب ميكنه پروسه A و براي افراد انتخاب نشده پروسه B
اجرا بشه .

ممنون از توجه شما

negarin5340
پنج شنبه 21 آذر 1387, 08:33 صبح
سلام
چرا اينجا كسي به سوال من جواب نمي ده اين سايت قبلا خيلي بهتر بود به سوال تمام كاربر ها جواب ميداد ولي الان نه من الان 2 هفته سوالمو توي تايپيك مربوطه و تايپيك جداگانه مطرح كردم ولي انگار نه انگار

دکمه64
پنج شنبه 21 آذر 1387, 08:47 صبح
سلام
چرا اينجا كسي به سوال من جواب نمي ده اين سايت قبلا خيلي بهتر بود به سوال تمام كاربر ها جواب ميداد ولي الان نه من الان 2 هفته سوالمو توي تايپيك مربوطه و تايپيك جداگانه مطرح كردم ولي انگار نه انگار

لطفا منتظر باشید من جواب سوالتون رو می دونم.

negarin5340
پنج شنبه 21 آذر 1387, 09:45 صبح
سلام
من مي خوام يك ركورد را انتخاب كنم و با زدن بر روي يك buttonرنگ ركورد انتخابي عوض شه ممنون

دکمه64
پنج شنبه 21 آذر 1387, 11:57 صبح
سلام
درمورد سوالتون:
من درست نمی دونم برنامتون چطوری هست اما یکی از دو راه زیر رو می تونید انجام بدین:
1) اگه رکورد های مورد نظر همشون دارای یک خصوصیت خاص هستند.مثلا همه این رکوردها که میخواهین رنگی بشه نامشون ali هست و باید هر رکوردی که نامش ali هست به رنگ قرمز باشند پس می تونید دستور زیر رو در خاصیت OnDrawDataCell اون DBGrid بنویسید:


procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect
;(Field: TField; State: TgridDrawState
begin

if TABLE1.FieldByName('NAME').AsString= 'ali' then
;DBGrid1.Canvas.Brush.Color:=clred
;(DBGrid1.Canvas.TextRect(rect,rect.left+2,rect.to p+2,field.AsString

;end

با این کار همه رکورد هایی که فیلد نام آن ali هست به رنگ قرمز در می آیند و اگه رکورد جدیدی هم وارد جدول شود که فیلد نام آن ali هست ،آن رکورد نیز قرمز رنگ می شود.
2) اما اگر این رکورد ها با بقیه رکوردهای جدول فرقی نمی کنند و کلید خاصی برای تشخیص آن وجود ندارد و باید خودتون مشخص کنید که کدام رکورد باید رنگش قرمز باشه،پس باید برنامتون رو طوری بنویسید که اگه یک بار دیگه وارد برنامه شدین اون رکوردهایی که رنگشون رو عوض کردین هنوز به همون رنگ باشند(برای همیشه).
پس به نظر من بهتره که اول برای اون جدولتون یک فیلد جدید اضافه کنید مثلا به نام recordcolor و از نوع number باشه حال در برنامه تون دستور زیر رو در اون دکمه که گفتین بنویسید:

;(procedure TForm1.Button1Click(Sender: TObject

begin



;TABLE1.edit


;TABLE1.FieldByName(' recordcolor').asinteger:=1


;Table1.post

;End
و در خاصیت OnDrawDataCell اون DBGrid بنویسید:


if TABLE1.FieldByName(' recordcolor').asinteger=1 then
;DBGrid1.Canvas.Brush.Color:=clred
;(DBGrid1.Canvas.TextRect(rect,rect.left+2,rect.to p+2,field.AsString

همین.
:خجالت:

دکمه64
پنج شنبه 21 آذر 1387, 14:30 عصر
یادم رفت بگم شما می تونید اون فیلد جدید رو که اضافه کردین رو مخفی کنید.تا تو برنامه معلوم نباشه.

negarin5340
شنبه 23 آذر 1387, 08:53 صبح
سلام
درمورد سوالتون:
من درست نمی دونم برنامتون چطوری هست اما یکی از دو راه زیر رو می تونید انجام بدین:
1) اگه رکورد های مورد نظر همشون دارای یک خصوصیت خاص هستند.مثلا همه این رکوردها که میخواهین رنگی بشه نامشون ali هست و باید هر رکوردی که نامش ali هست به رنگ قرمز باشند پس می تونید دستور زیر رو در خاصیت OnDrawDataCell اون DBGrid بنویسید:


procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect
;(Field: TField; State: TgridDrawState
begin


if TABLE1.FieldByName('NAME').AsString= 'ali' then
;DBGrid1.Canvas.Brush.Color:=clred
;(DBGrid1.Canvas.TextRect(rect,rect.left+2,rect.to p+2,field.AsString


;end

با این کار همه رکورد هایی که فیلد نام آن ali هست به رنگ قرمز در می آیند و اگه رکورد جدیدی هم وارد جدول شود که فیلد نام آن ali هست ،آن رکورد نیز قرمز رنگ می شود.
2) اما اگر این رکورد ها با بقیه رکوردهای جدول فرقی نمی کنند و کلید خاصی برای تشخیص آن وجود ندارد و باید خودتون مشخص کنید که کدام رکورد باید رنگش قرمز باشه،پس باید برنامتون رو طوری بنویسید که اگه یک بار دیگه وارد برنامه شدین اون رکوردهایی که رنگشون رو عوض کردین هنوز به همون رنگ باشند(برای همیشه).
پس به نظر من بهتره که اول برای اون جدولتون یک فیلد جدید اضافه کنید مثلا به نام recordcolor و از نوع number باشه حال در برنامه تون دستور زیر رو در اون دکمه که گفتین بنویسید:

;(procedure TForm1.Button1Click(Sender: TObject


begin




;TABLE1.edit



;TABLE1.FieldByName(' recordcolor').asinteger:=1



;Table1.post


;End
و در خاصیت OnDrawDataCell اون DBGrid بنویسید:


if TABLE1.FieldByName(' recordcolor').asinteger=1 then
;DBGrid1.Canvas.Brush.Color:=clred
;(DBGrid1.Canvas.TextRect(rect,rect.left+2,rect.to p+2,field.AsString

همین.
:خجالت:
سلام
من همين كد رو نوشتم ولي متاسفانه كاري انجام نداد همون كد اول رو نوشتم من يك فيلد هم دارم كه در صورتي تيغه خراب باشه درون اون فيلد عبارت خراب درج مي گردد يعني من عبارت خراب را اونجا نوشتم اصلا هيچ كاري انجام نمي ده نمي دونم چي كار كنم

negarin5340
شنبه 23 آذر 1387, 09:09 صبح
procedure TForm2.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
Field: TField; State: TGridDrawState);
begin
if form2.Table1.FieldByName('user').AsString= 'kharab' then
DBGrid1.Canvas.Brush.Color:=clBlue;
DBGrid1.Canvas.TextRect(rect,rect.left+2,rect.top+ 2,field.AsString);
end;
من اين كد رو نوشتم ولي در فيلد userركوردهايي كه kharab بود رو قرمز نكرد علت چيه؟

negarin5340
شنبه 23 آذر 1387, 09:10 صبح
ببخشيد آبي يا قرمز فرقي نمي كنه در كل رنگي نكرد

دکمه64
شنبه 23 آذر 1387, 21:45 عصر
من یه بار دیگه برنامه رو تست کردم.وبه یه نتیجه رسیدم:
نمی دونم چرا ولی اگه روی dbgrid1 دوبار کلیک کنید و اون کادر Editing باز بشه نباید فیلد های جدول رو در اون add کنید. چون اگه این کار رو کنید دیگه کار نمی کنه(رنگی نمیشه).
اگه خالی نیست همه رو انتخاب کنید و حذف کنید.

delafarin
یک شنبه 24 آذر 1387, 11:25 صبح
به ادامه خواص کلی DBGrid می پردازیم :


مشخص کردن منبع یک ستون

در زمان اجرا شما میتونید خاصیت AssignedValues یک ستون بفهمید که آیا یک ستون DBGrid مقدارش رو از یک فیلد بدست میاره یا نه :


DBGrid1.Columns[0].AssignedValues

این خصوصیت که از نوع TColumnValue است Caption، رنگ، فونت و سایر ویژگیهای یک ستون را به ما میدهد. میتونیم تمام این خواص یک ستون رو با RestoreDefaults بصورت پیش فرض و اولیه در بیاوریم.


ایجاد ستونهای ثابت (fixed)

برای Customize کردن یک گرید در زمان طراحی برنامتون، باید ستونها رو ویرایش کنیم. برای اینکار از ویرایشگر ستونها استفاده میکنیم. دوبار بر روی خاصیت Columns یا خود DBGrid کلیک میکنیم تا ویرایشگر ستونها نشان داده شود. کلید Add را در ویرایشگر ستونها فشار دهید. یک ستون جدید ایجاد میشود. خاصیت FieldName را به فیلدی که میخواهید این ستون به اون وصل شه مقدار دهی میکنیم. Titlle و Caption ستون را تغییر داده و ویرایشگر را جهت ثبت تغییرات می بندیم.

برای جابجایی ستونها هم در همین ویرایشگر ستونها، ستونها رو به دلخواه جابجا میکنیم.


تعریف ستونهای جستجو

اگر میخواهید ستونی یک لیست را از جدولی دیگه نشون بده، ابتدا باید یک فیلد جستجو تعریف کنید. بعد خاصیت FieldName را از ستون مورد نظر به اون فیلد جستجو مقداردهی کنید و خاصیت ButtonStyle را cbsAuto قرار دهید. هرگاه اون ستون انتخاب شود، یک لیست که محتویات آن از جدول جستجو می باشد نشان داده می شود.


در پست بعد ادامه میدیم...
----------------------------------------------------------------------------------------
ببخشید میشه در مورد این مطلب آخر کمی (تعریف ستونهای جستجو)بیشتر توضیح دهید
چون من تمام گفته های شما رو انجام دادم ولی نشد. البته در DBGridEh روی فیلد combo آمد ولی باز نمی شه.

negarin5340
یک شنبه 24 آذر 1387, 17:46 عصر
اينم يك كد كه آقاي حسين زاده برام گذاشتن منم براي شما مي ذارمش
روی این خاصیت دوبار کلیک کنید و دستورات زیر رو بنویسید.

اول DBGrid1رو انتخاب کنید

negarin5340
یک شنبه 24 آذر 1387, 17:47 عصر
هر كس مي خواد بگه تا براش كل فايل رو ايميل كنم

ariobarzan
دوشنبه 25 آذر 1387, 10:34 صبح
با تشكر از دوستان كه مطالب مفيدي را در اختيار ما قرار دادند

قبلا در مورد انتخاب تعداد خاصي از ركورد ها در دي بي گريد و ويرايش اطلاعات فيلد هاي اون بحث شد كه نتيجه خوبي هم داشت

حالا موضوع اينه كه اگه بخواهيم تغييراتي در اطلاعات افراد انتخاب نشده بديم
چكار بايد كرد؟

مثال براي افرادي كه كاربر انتخاب ميكنه پروسه A و براي افراد انتخاب نشده پروسه B
اجرا بشه .

ممنون از توجه شما


از دوستان كسي در اين مورد راه حلي نداره؟

delafarin
دوشنبه 25 آذر 1387, 11:01 صبح
اينم يك كد كه آقاي حسين زاده برام گذاشتن منم براي شما مي ذارمش
روی این خاصیت دوبار کلیک کنید و دستورات زیر رو بنویسید.

اول DBGrid1رو انتخاب کنید

--------------------------------------------------------------------
ببخشید دستورات رو یادتون رفته بذارین.

delafarin
دوشنبه 25 آذر 1387, 11:11 صبح
هر كس مي خواد بگه تا براش كل فايل رو ايميل كنم
-----------------------------------------------------------------

دکمه64
دوشنبه 25 آذر 1387, 21:57 عصر
من یه بار دیگه برنامه رو تست کردم.وبه یه نتیجه رسیدم:
نمی دونم چرا ولی اگه روی dbgrid1 دوبار کلیک کنید و اون کادر Editing باز بشه نباید فیلد های جدول رو در اون add کنید. چون اگه این کار رو کنید دیگه کار نمی کنه(رنگی نمیشه).
اگه خالی نیست همه رو انتخاب کنید و حذف کنید.



اما اگه شما حتما باید از کادر editingdbgrid1.columns استفاده کنید.مثلا برای فارسی نوشتن عنوان فیلدها.بهتره از یه روشی دیگه استفاده کنید:
شما میتونید بجای اینکه روی dbgrid دوبار کلیک کنید که کادرediting باز بشه،روی table1 دوبار کلیک کرده تا کادر کوچکی(تیتر آن:form1.table1) باز شود، در آن کلیک راست کرده و گزینه add allfileds را انتخاب کنید تا تمامی فیلدهای جدول نشان داده شود. حالا هرکدام از فیلدها را انتخاب کرده و در پانل خصوصیات آن،خصوصیت displaylabel را انتخاب کرده و نام فارسی آن را تایپ کنید .برای وسط چین کردن اطلاعات درون جدول از خصوصیت alignment استفاده کنید.
اگر فیلدها رو به فارسی نوشتین اما فونت آن مشکل داشت یا خواستید یه فونت دیگه داشته باشه ، dbgrid را انتخاب کنید ودر پانل خصوصیات آن،خصوصیت titlefont را انتخاب کرده که در آن می توانید فونت فیلدها را تغییر دهید.برای تغییر فونت اطلاعات درون جدول نیز می توانید از خاصیت font استفاده کنید.

delafarin
سه شنبه 26 آذر 1387, 10:43 صبح
با سلام
کاربر محترم و گرامی Hsimple11
من خیلی احتیاج به مورد اشاره شده شما دارم و تمام موارد شما رو هم به صورت زیر انجام دادم می شه لطف کنید اشکال کار رو بگید.
ابتدا یک دیتا ست جدا گذاشتم و اون رو ربط دادم به جدولی که می خواهم بعدا در combo بیاید بعد فیلد دیتا ستم که قرار است combo شود و به dbgrid وصل است
lookupdataset آنرا به دیتا ست جدولی که قرار است در combo قرار بگیرد ارتباط دادم و lookupkeyfeild آنرا فیلدی که می خوام در combo باشد قرار دادم
خاصیت بوتون استیل اون فیلد را روی قرار cdsauto دادم .ولی موقع اجرا combo ظاهر نمی شود .
یعنی من قسمتی را کسر یا اشتباه کردم .
----------------------------------------------------------------------------------------
تعریف ستونهای جستجو -----------> نوشته شده توسط Hsimple11
اگر میخواهید ستونی یک لیست را از جدولی دیگه نشون بده، ابتدا باید یک فیلد جستجو تعریف کنید. بعد خاصیت FieldName را از ستون مورد نظر به اون فیلد جستجو مقداردهی کنید و خاصیت ButtonStyle را cbsAuto قرار دهید. هرگاه اون ستون انتخاب شود، یک لیست که محتویات آن از جدول جستجو می باشد نشان داده می شود.

welcome_r
شنبه 19 اردیبهشت 1388, 12:39 عصر
با سلام
من ميخواهم براي كنترل وارد كردن اطلاعات در يك سل يك event بنويسم كه در صورتي كه اطلاعات وارد شده حائز شرايط نبود خروج از ان سل امكان پذير نباشد. كسي از دوستان ميتونه منو راهنمائي كنه
با تشكر

mr13668248
شنبه 13 شهریور 1389, 01:45 صبح
اینو بنویس جواب میده 100%

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
var
test1: Real;
RowNo: Integer;
farbe:TColor;
begin
with (Sender as TDBGrid) do
begin
if (gdSelected in State) then
begin
// Farbe für die Zelle mit dem Focus
// color of the focused row
Canvas.Brush.Color := clblue;
end
else
begin
// Zeile erfahren
// get the actual row number
rowno := ADOTable1.RecNo;
// gerade und ungerade Zeilen ermitteln
// odd or even ?
test1 := (RowNo / 2) - trunc(RowNo / 2);
// Zeile gerade…
// If it’s an even one…
if test1 = 0 then
begin
farbe := clSkyBlue
end
// …Zeile ungerade
// …else it’s an odd one
else
begin
farbe := $00FF80FF;
end;
Canvas.Brush.Color := farbe;
// Font-Farbe immer schwarz
// font color always black
Canvas.Font.Color := clBlack;
end;
Canvas.FillRect(Rect);
// Denn Text in der Zelle ausgeben
// manualy output the text
Canvas.TextOut(Rect.Left + 2, Rect.Top + 1, Column.Field.AsString);
end
end;

ما در خدمتیم
mr13668248@gmail.com:تشویق:

MOJTABAATEFEH
سه شنبه 06 مهر 1389, 18:07 عصر
سلام دوستان عزیز من در جدولم فیلدی از نوع Real دارم که به طور مثال در اون مقدار 15.69 ذخیره شده می خواستم بدونم چرا در DBgrid عدد 15.6899995803833 در صورتی که وقتی خود جدول رو در SQL باز می کنم همان 15.69 رو نمایش میده البته با نوع Float هم همینطور بود برای حل این مشکل باید چکار کرد که همان عددی که در جدول هست نمایش داده بشه؟

با تشکر

behyii
چهارشنبه 23 اسفند 1391, 10:24 صبح
سلام كسي الان آنلاين هست من ي سوال فوري دارم جوابم رو بده؟

behyii
چهارشنبه 23 اسفند 1391, 10:26 صبح
من مبتدي هستم مي خواهم با كليك روي عنوان ستون نام اصلي ستون رو به دست بياورم يعني بفهمم كه كاربر با كليك روي عنوان ستون روي كدوم عنوان ستون كليك كرده

SayeyeZohor
دوشنبه 05 فروردین 1392, 01:54 صبح
سورس هاي مربوط به دي بي گريد :
Database1 (http://s2.picofile.com/file/7702994301/Database1.rar.html)
QuickiesContest (http://s1.picofile.com/file/7702995478/QuickiesContest.rar.html)

1- Displaying and editing MEMO fiels in Delphi's TDBGrid (http://s2.picofile.com/file/7702529672/1_Displaying_and_editing_MEMO_fiels_in_Delphi_s_TD BGrid.rar.html)

2- Sorting records in Delphi DBGrid by Clicking on Column Title (http://s1.picofile.com/file/7702951177/2_Sorting_records_in_Delphi_DBGrid_by_Clicking_on_ Column_Title.rar.html)

3- Adding components to a DBGrid (http://s3.picofile.com/file/7702958488/3_Adding_components_to_a_DBGrid.rar.html)

4- Alternate DBGrid Row Color (http://s3.picofile.com/file/7702960749/4_Alternate_DBGrid_Row_Color_.rar.html)

5- Coloring DBGrid (http://s1.picofile.com/file/7702993010/5_Coloring_DBGrid.rar.html)

sasan_x3e8
شنبه 28 اردیبهشت 1392, 18:50 عصر
سلام خسته نباشین وقت بخیر
اساتید محترم لطفا کمک کنید فردا باید تحویل بدم 5 نمره داره (یعنی 29 اردیبهشت 92)
میخوام وقتی روی دکمه انجام کلیک میشه رکورد ها با هم جمع بشن یعنی اولی و اضافه کنه بعد همونو با بعدی جمع و الی آخر مثل ِ عکس
خیلی گشتم موفق نشدم عاجزانه درخواست کمک دارم چون حرفه ای هم نیستم ممنون
http://upload.tehran98.com/img1/hm4h06bzv80mkikzlbp.jpg

یوسف زالی
شنبه 28 اردیبهشت 1392, 21:13 عصر
این چه کاریه آخه؟
یک قانون رو چند بار باید گوشزد کرد؟
از طرفی کار شما چه ربطی به گرید داره؟
نشستید نشستید شب تحویل اومدید اینجا انتظار دارید براتون کسی کاری انجام بده؟
نکنید عزیز من

t0r1st
شنبه 11 خرداد 1392, 11:55 صبح
سلام دوستان امکانش هست
یه سمپل کوچیک از قرار دادن عکس در بک گراند dbgrid بگذارید
با تشکر
یاعلی مدد

MNosouhi
یک شنبه 12 خرداد 1392, 13:31 عصر
سلام.
کار سختی نیست. در مورد calculeted fields جستجو نمایید .

یوسف زالی
یک شنبه 12 خرداد 1392, 14:46 عصر
کار سختی نیست. در مورد calculeted fields جستجو نمایید .

چه ربطی داره؟ مگر می خواد پشت هر فیلد عکس بذاره؟!!
شما باید متدهای Paint رو OverRide کنید.

pink_sbn
یک شنبه 16 تیر 1392, 20:38 عصر
درود دوستان
میخوام alignment فقط یک ستون از datagridview رو left to right کنم. چیکار کنم؟
مرسی

یوسف زالی
یک شنبه 16 تیر 1392, 20:47 عصر
سلام.
روی گرید دو بار کلیک کرده و تک تک ستونهایی رو که لازم دارید اد کنید و دیتای متصل بهش رو هم مشخص کنید.
بر روی ستونی که می خواهید، در همین ادیتور کلیک کرده و آیتم های مربوط به title رو اصلاح کنید.
در حالت ران تایم هم می تونید با داشتن اندیس یک ستون، همین کار رو براش انجام بدید.

pink_sbn
دوشنبه 17 تیر 1392, 16:38 عصر
ممنون ، اما من می خوام alignment فقط یک ستون از gridview رو خودم به صورت دستی ( توو برنامه نویسی) LeftToRight کنم. چطور می شه؟

یوسف زالی
دوشنبه 17 تیر 1392, 16:49 عصر
گفتم که بهتون. تست کنید.

pink_sbn
دوشنبه 17 تیر 1392, 18:25 عصر
هر کاری کردم نشد. میشه یه نمونه واسم بنویسید لطفا

یوسف زالی
دوشنبه 17 تیر 1392, 19:22 عصر
..........

sempaisaleh
پنج شنبه 20 شهریور 1393, 08:30 صبح
با سلام خدمت دوستان
يه مشكلي تو رنگي كردن DBgrid دارم.
كلا وقتي رو خاصيت DrawColumnCell تو قسمت Event دابل كليك ميكنم ميره پروسيژورش رو اتوماتيك ايجاد ميكنه و حالا كه كدها رو نوشتم و كامپايل كردم از خود پروسيژور اين ارور رو ميگيره.

[dcc32 Error] Unit3.pas(113): E2003 Undeclared identifier: 'TRect'
از تعريف پروسيژور تو Type از اين خط:

procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
تو سايت هاي خارجي گشتم يه چيزايي نوشته بود گفته بود بايد فايل pas‌يا dcu‌رو تو مسير گتابهانه بذاري. (يه همچين چيزايي :لبخند:)

یوسف زالی
دوشنبه 24 شهریور 1393, 14:23 عصر
سلام.
مشکل شما قدری عجیبه. بعید می دونم اشکال مربوط به اینجایی باشه که گفتید. بررسی کنید ببینید اشتباهی به جای Rect جایی ننوشتید TRect ؟

sempaisaleh
سه شنبه 25 شهریور 1393, 06:25 صبح
سلام.
مشکل شما قدری عجیبه. بعید می دونم اشکال مربوط به اینجایی باشه که گفتید. بررسی کنید ببینید اشتباهی به جای Rect جایی ننوشتید TRect ؟

با تشكر از جوابتون
من جايي از ract يا TRect استفاده نكردم. فقط تو تعريف خود پروسيژور هست.

یوسف زالی
سه شنبه 25 شهریور 1393, 09:15 صبح
Windows رو در یوزز بیاورید دوباره چک کنید.

sempaisaleh
چهارشنبه 26 شهریور 1393, 13:55 عصر
Windows رو در یوزز بیاورید دوباره چک کنید.

مرسي از جوابتون.
اون مشكل حل شد ولي حالا اين اين خطوط ارور ميگيره.

if ((ADOQuery1.FieldByName('taeed').Value = '0') or (ADOQuery1.FieldByName('taeed').Value = '')) then
(Sender as tdbgrid).Canvas.Brush.Color :=clWhite; //or any color
if ADOQuery1.FieldByName('taeed').Value = '1' then
(Sender as tdbgrid).Canvas.Brush.Color := clblue; //or any color
if ADOQuery1.FieldByName('taeed').Value = '2' then
(Sender as tdbgrid).Canvas.Brush.Color := clTeal; //or any color

(Sender as tdbgrid).Canvas.FillRect(Rect);
(Sender as tdbgrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
اين پيام خطا مياد كه موندم چه ربطي داره آخه.

Could not convert variable of type (UnicodeString) into type (Double)

یوسف زالی
چهارشنبه 26 شهریور 1393, 14:15 عصر
مقادیر عددی چرا کوتیشن دارند؟

grand_ceasare
سه شنبه 27 تیر 1396, 21:58 عصر
برای جابجایی یک سطر از DBGrid از کد زیر استفاده کنید :
متغیر های زیر رو به یونیتتون اضافه کنید:


var
Form1: TForm1;
.
.
.
Pt: TGridCoord;
First,Last:integer;
FirstRec,LastRec:String;
.
.
.
implementation

{$R *.dfm}


در رویداد OnMouseMove ءDBGrid کدهای زیر را اضافه کنید:


if ssLeft in Shift then
begin
dbgrid1.BeginDrag(true);
First:=Pt.y;
end;


و در رویداد OnDragOver ءDBGrid نیز :


pt:= dbGrid1.MouseCoord( x, y ) ;
Last:=Pt.y;


و در پایان در رویداد OnDragDrop ءDBGrid یک متغیر از نوع Integer تعریف میکنیم و سپس کد زیر را مینویسیم :

i : Integer;



if (First>0) and (First<>Last) then
begin
FirstRec:='';
for i:=1 to Table1.FieldCount-1 do FirstRec:=FirstRec+Table1.Fields[i].AsString+'|';

Table1.MoveBy(Last-First);

LastRec:='';
for i:=1 to Table1.FieldCount-1 do LastRec:=LastRec+Table1.Fields[i].AsString+'|';

for i:=1 to Table1.FieldCount-1 do
begin
Table1.Edit;
Table1.Fields[i].AsString:=Copy(FirstRec,1,Pos('|',FirstRec)-1);
Delete(FirstRec,1,Pos('|',FirstRec));
Table1.Post;
end;

Table1.MoveBy(First-Last);

for i:=1 to Table1.FieldCount-1 do
begin
Table1.Edit;
Table1.Fields[i].AsString:=Copy(LastRec,1,Pos('|',LastRec)-1);
Delete(LastRec,1,Pos('|',LastRec));
Table1.Post;
end;

Table1.MoveBy(Last-First);
end;


همونطور که میبینین در این کد از Table برای اتصال به بانک استفاده شده , شما اگر از AdoQuery استفاده میکنین , در همین تابع آخر , هرجا Table بود کافیه به جاش نام ADOQueryتون رو قرار بدین.
موفق باشین.

HosseinFCB
یک شنبه 08 مرداد 1396, 21:07 عصر
سلام















من از کامپوننت Ehlib تو برنامم استفاده میکنم


میخواستم بدونم چطور میشه تعداد کاراکتر های ورودی رو توی DBGRID کنترل کرد که از یه مقداری بیشتر نشه


چون داخل برنامه ارور نشون میده به کاربر.

ayubtanha
چهارشنبه 11 تیر 1399, 19:54 عصر
سلام دوستان، من یه سوال داشتم، ممنون میشم اگه جواب بدید، من میخوام عنوان جدولم(dbgrid) فارسی باشه، جدول وقتی به adotable وصل باشه میشه این کارو کرد ولی وقتی به ado query وصل باشه و هر بار جدول رو clear کرد چه جوری title رو فارسی کنم؟ در ضمن دیتابیسم حتما باید انگلیسی باشه