PDA

View Full Version : مشکل با رنگ کردن سطر در dbgrid



farzad_az_shiraz
جمعه 06 فروردین 1389, 21:03 عصر
سلام به هم دوستان
سال نو مبارک و ایشالا که سال خوبی داشته باشید.

من می خوام به جای حذف رکوردهای جدول ، وقتی اونارو توی dbgrid نشون میدم به یه رنگ دیگه در بیارم و این تغییر رنگ هم همیشگی باشه و هر وقت برنامه اجرا میشه اون رکوردهایی که قبلا مثلا قرمز شده الان هم قرمز باشه.
با سرچ توی سایت به یه کد رسیدم که تونستم این کارو انجام بدم ، کد زیر را پیدا کردم



if (ADOQuery1.FieldValues['cla']=Edit10.Text) or(ADOQuery1.FieldValues['cla']=1) then
DBGrid1.Canvas.Font.Color:=clFuchsia;
DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column, State);






اما این کد حتما باید توی رویداد DBGrid1DrawColumnCell مربوط به dbgrid نوشته بشه و اکه جای دیگه نوشته بشه به خط زیر ارور میده :



DBGrid1.DefaultDrawColumnCell(Rect,DataCol,Column, State);


من دوتا سوال دارم
1) کار این کد چی هست و جه کاری انجام میده ؟
2) من میخوام کد اصلی را توی یه button بنویسم ، به جای این خط چی بنویسم که ارور نده ؟
با تشکر

Modernidea
شنبه 07 فروردین 1389, 01:57 صبح
سلام
انشاالله شما هم سال خوب داشته باشید.


1) کار این کد چی هست و جه کاری انجام میده ؟این کد تعدای مشخصه(Rect,DataCol,Column,State) دارد که فقط هنگام DrawColumnCell به آنها دسترسی دارید به همین دلیل امکان استفاده از این کد در جای دیگری نیست.


2) من میخوام کد اصلی را توی یه button بنویسم ، به جای این خط چی بنویسم که ارور نده ؟فکر میکنم بهترین راهش همین راهی که پیدا کردید باشه، البته اگر از DBGrid پیشفرض دلفی استفاده میکنید.
یعنی اگر از کاپوننتی مثل TMS استفاده کنید، به راحتی میتونید از هر جای برنامه سلول یا ردیف مربوطه را رنگ کنید.

موفق باشید.

farzad_az_shiraz
یک شنبه 08 فروردین 1389, 12:52 عصر
از دستمون به خاطر پاسخش ممنونم ، اگه کسی از دوستان میتونه کاملتر جواب بده ممنون میشم یا یه کامپوننتی که به جای dbgrid ازش استفاده کنم
بازم ممنون

alinikaein
یک شنبه 08 فروردین 1389, 13:11 عصر
سلام دوست عزيز؛

شما ابتدا بايستي فيلدي در بانك براي تعيين رنگ سطر مورد نظر داشته باشيد (حالا يا رنگ يا از نوع منطقي براي درك حذف شدن سطر و يا...)

در مرحله‌ي دوم، هنگام ترسيم DBGrid بر اساس فيلد مورد نظري كه تعريف كرديد رنگ سطر را مشخص مي‌كنيد.
در كدي كه شما نوشتيد، بر اساس اين كه مقدار فيلد cla چي هست، (مقدار يك يا مقداري برابر edit) رنگ فونت را قرمز مي‌كنه. البته بهتره از يك else هم استفاده بشه و رنگ فونت به مقدار مثلاً مشكي براي ساير سطرها تنظيم بشه.


يا علي... موفق باشيد...

Modernidea
یک شنبه 08 فروردین 1389, 15:48 عصر
از دستمون به خاطر پاسخش ممنونم ، اگه کسی از دوستان میتونه کاملتر جواب بده ممنون میشم یا یه کامپوننتی که به جای dbgrid ازش استفاده کنم
بازم ممنون

کدام قسمت رو متوجه نشدید؟

کامپننتی که من معرفی کردم یکی از بهترین هاست.

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

آدرس سایت این کامپوننت : کلیک کنید (http://www.tmssoftware.com/site/gridpack.asp)

اگر این کامپوننت رو خواستید. با پیام خصوصی به من اطلاع بدبد.

موفق باشید.

farzad_az_shiraz
یک شنبه 08 فروردین 1389, 17:48 عصر
کامپننتی که من معرفی کردم یکی از بهترین هاست.


واقعا ممنونم اما این پروژه چون صدرصد نشده نمی خوام فعلا هزینه کنم. اگه میشه روی همون dbgrid منو راهنمایی کنید.

hadisalahi2
یک شنبه 08 فروردین 1389, 20:11 عصر
استفاده از کامپوننت های TMS Grid به هیچ عنوان توصیه نمیشه.
برای رنگی کردن سطرها کد زیر رو پیشنهاد میکنم. به جای شرطی که من گذاشتم شما میتونی هر شرطی که دلت خواست بذاری




procedure TDataBaseForm.artgrid(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if ((Sender as tdbgrid).DataSource.DataSet.RecNo mod 2) = 0 then
(Sender as tdbgrid).Canvas.Brush.Color :=$00EEDFD3; //or any color
else (Sender as tdbgrid).Canvas.Brush.Color :=clWhite; ; //or any color
end;

Modernidea
یک شنبه 08 فروردین 1389, 23:59 عصر
استفاده از کامپوننت های TMS Grid به هیچ عنوان توصیه نمیشه.

لطفا دلیلش رو یا اینجا یا پیام خصوصی بگید.

کنجکاو شدم که بدونم!

موفق باشید.

farzad_az_shiraz
سه شنبه 10 فروردین 1389, 22:01 عصر
ممنون از لطف همه دوستان ، حتما کد راتست می کنم




استفاده از کامپوننت های TMS Grid به هیچ عنوان توصیه نمیشه.


ممنون می شم دلیلش را بگید تا من هم بدونم

farzad_az_shiraz
یک شنبه 22 فروردین 1389, 22:42 عصر
سلام
ببخشید من یه کار واسم پیش اومد نتونستم زودتر سوالم را ادامه بدم
میشه بگید این کد را باید کجا بنویسم ؟

Modernidea
دوشنبه 23 فروردین 1389, 11:04 صبح
در رویداد DrawColumnCell مربوط به Grid

farzad_az_shiraz
چهارشنبه 25 فروردین 1389, 05:34 صبح
ممنون از شما اما کدی را که آقای صالحی گفته بودن نوشتم و هر چی بالا و پایینش کردم هیچ تغییری نکرد
ممنون میشم کمکم کنید

Modernidea
پنج شنبه 26 فروردین 1389, 02:18 صبح
ممنون از شما اما کدی را که آقای صالحی گفته بودن نوشتم و هر چی بالا و پایینش کردم هیچ تغییری نکرد
ممنون میشم کمکم کنید

حق باشماست.
کدی که ایشون گذاشتن 2 تا دستور کم داره !
کلا، کدی که ایشون گذاشتن فقط باعث میشه که سطرهای گرید، یکی در میان رنگش فرق کنه.
همچنین ذکر کردند که میتونید بجای این شرط هر شرطی بزارید.

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

شما برای اینکه همیشه در برنامه رکوردهای حذف شده را به رنگ مشخصی در بیاورید باید یک فیلد به جدولتان اظافه کنید که مشخص کند این رکورد عضو رکوردهای حذف شده است یا نه.
به عنوان مثال فیلدی به نام Del از نوع Boolean بسازید.
برای رکورد های حذف شده باید این فیلد را برابر True و برای رکوردهای حذف نشده برابر False قرار بدید.

با استفاده از کد ذیل میتونید به هدفتون برسید.

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin

if ADOTable1.FieldByName('Del').AsBoolean = True then
(Sender as tdbgrid).Canvas.Brush.Color :=$00EEDFD3 //or any color
else
(Sender as tdbgrid).Canvas.Brush.Color :=clWhite ; //or any color
(Sender as tdbgrid).Canvas.FillRect(Rect);
(Sender as tdbgrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;

لطفا نتیجه را اعلام کنید.

موفق باشید.

farzad_az_shiraz
جمعه 27 فروردین 1389, 10:07 صبح
Modernidea ممنون از اینکه وقت میزاری اما من کد شما را با یه تغییر کوچیک به صورت زیر نوشتم که البته با کد شما فرقی نمیکنه اما جواب نگرفتم.





if ADOQuery1.FieldByName('Del').Value='t' then
(Sender as tdbgrid).Canvas.Brush.Color :=$00EEDFD3 //or any color
else
begin
(Sender as tdbgrid).Canvas.Brush.Color :=clWhite ; //or any color
(Sender as tdbgrid).Canvas.FillRect(Rect);
(Sender as tdbgrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);
end;



که البته begin و end ، مربوط به else را هم برداشتم اما بازم فرقی نکرد

در ضمن فیلد del از نوع char هست که با t و f مقداردهی میشه

Modernidea
جمعه 27 فروردین 1389, 13:42 عصر
ظاهرا پایگاه داده شما Sql Server است.

به دو علت تغییرات برای شما اعمال نمیشه :
1. فیلد رو از نوع nvarchar انتخاب کنید.
2. Begin .. end را حذف کنید. زیرا دو دستور آخر باید جدا از شرت به همه سطرها اعمال شود.

procedure TForm1.dbgrd1DrawColumnCell(Sender: TObject; const Rect: TRect;
DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
if ADOQuery1.FieldByName('Del').Value= 't' then
(Sender as tdbgrid).Canvas.Brush.Color :=$00EEDFD3 //or any color
else
(Sender as tdbgrid).Canvas.Brush.Color :=clWhite ; //or any color

(Sender as tdbgrid).Canvas.FillRect(Rect);
(Sender as tdbgrid).DefaultDrawColumnCell(Rect, DataCol, Column, State);

end;



موفق باشید.

farzad_az_shiraz
جمعه 10 اردیبهشت 1389, 10:16 صبح
سلام دوست عزیز
من هرکاری کردم این دستور بهم جواب نداد
ببین من میخوام زمانی که دکمه حذف را میزنم به جای حذف یه رکورد اونو واسم مثلا رنگ قرمز کنه و این تغییر رنگ همیشه باقی بمونه
آیا این کار شدنی هست ؟
من یه فیلد به نام del از نوعchar (که به پیشنهاد دوستمون nvarchar هم انتخاب کردم ولی جواب نداد) دارم که هر رکوردی که تغییر رنگ کنه را از نوع T ، در غیر این صورت اون فیلد با حرف F مقدار دهی میشه. این کار برای اینه که من همیشه اون رکورد حذف شده را با مثلا رنگ قرمز داشته باشم.
سوال من اینه که چطوری اون رکورد را تغییر رنگ بدم ؟؟؟؟چ
ممنون میشم کمکم کنید

Modernidea
جمعه 10 اردیبهشت 1389, 13:41 عصر
سلام دوست عزیز
من هرکاری کردم این دستور بهم جواب نداد
ببین من میخوام زمانی که دکمه حذف را میزنم به جای حذف یه رکورد اونو واسم مثلا رنگ قرمز کنه و این تغییر رنگ همیشه باقی بمونه
آیا این کار شدنی هست ؟
من یه فیلد به نام del از نوعchar (که به پیشنهاد دوستمون nvarchar هم انتخاب کردم ولی جواب نداد) دارم که هر رکوردی که تغییر رنگ کنه را از نوع T ، در غیر این صورت اون فیلد با حرف F مقدار دهی میشه. این کار برای اینه که من همیشه اون رکورد حذف شده را با مثلا رنگ قرمز داشته باشم.
سوال من اینه که چطوری اون رکورد را تغییر رنگ بدم ؟؟؟؟چ
ممنون میشم کمکم کنید

سلام

کدی که من قرار دادم همینی که شما میخوای رو انجام میده و مشکلی نداره.

شما کد مربوط به قسمتی که فیلد DEL رو مقدار دهیی میکنید را اینجا قرار بدید.

موفق باشید

farzad_az_shiraz
جمعه 10 اردیبهشت 1389, 14:43 عصر
دوست خوبم ممنون از راهنماییت مشکلم حل شد.
دلیلی که کد واسه من تغییر نمیکرد این بود که یکی ار رکورها با t مقدار دهی شده بود و کد شما اون رکورد را قرمز نمیکرد اما یه بار دیگه مقدار دهی کردم درست شد.