# Native Code > برنامه نویسی در Delphi > بانک های اطلاعاتی در Delphi > گفتگو: همه چیز در مورد DBGrid

## Hsimple11

سلام؛


همونطور که میدونید 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

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

رنگ کردن DBGrid

----------


## Hsimple11

به ادامه خواص کلی DBGrid می پردازیم :


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

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

DBGrid1.Columns[0].AssignedValues

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


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

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

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


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

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


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

----------


## Hsimple11

دوستان اگه همکاری نکنند این تاپیک ، تاپیک جامعی نمیشه....

----------


## war1351

دوست و استاد عزیز میخواستم بپرسم اگه بخام نام ستونهارو مثل datagridview  فارسی کنم بدون آنکه تو اصل موضوع تغییر نکنه یعنی نام فیلدها تغییر نکنه چکار کنم 
با تشکر

----------


## Hsimple11

> دوست و استاد عزیز میخواستم بپرسم اگه بخام نام ستونهارو مثل datagridview  فارسی کنم بدون آنکه تو اصل موضوع تغییر نکنه یعنی نام فیلدها تغییر نکنه چکار کنم 
> با تشکر


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

----------


## tvg77

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

----------


## Hsimple11

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


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

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

----------


## amin_alexi

سلام
با اجازه منم یه چیزی اضافه میکنم ... خیلیها معمولا سوال می کنن ...
اضافه کردن CheckBox یا Edit و ... در DbGrid

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

----------


## mortezakiaee

در مورد مرتب کردن(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

با سلام و خسته نباشید. 
در این پست ادامه مبحث مربوط به 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

با تشكر خيلي زياد از زحمتي كه كشيديد و اين تاپيك رو ايجاد كرديد.
شايد يه موضوع كه خيلي از دوستان باهاش برخورد داشتند اين بوده كه چطور ميشه طول يك ستون در ديبي گريد  را با توجه به اندازه طول بزرگترين مقدار فيلد در  ديتا بيس بطور اتوماتيك تنظيم كرد؟
مثلا فرض كنيم فيلدي حاوي آدرس افراد باشه كه اندازه اون هم طبيعتا براي هر ركورد متغيره
حالا ميخواهيم ستون فيلد آدرس بر اساس اندازه بزرگترين آدرس تنظيم بشه جوري كه همه آدرس ها كامل ديده بشوند .
لطفا راهنمايي كنيد.
باز هم تشكر

----------


## Hsimple11

> چطور ميشه طول يك ستون در ديبي گريد را با توجه به اندازه طول بزرگترين مقدار فيلد در ديتا بيس بطور اتوماتيك تنظيم كرد؟


البته این راه حل منطقی نیست. اما میتونید از خاصیت 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
2

----------


## nasr

> در مورد مرتب کردن(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:=[];
> ...





با این کد 

  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

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

----------


## Hsimple11

> اول اینکه این تاپیک رو در قسمت اعلان ها قرار بدید تا همیشه در دسترس باشه 
> دوم اینکه هر کدوم از دوستا قبلا خودشون در باره این موضوع سوال کردند و یا جواب سوالی را دادند ، آدرس اون تاپیک رو هم بذارن
> و سوم اینکه  در مورد طریقه های مختلف رنگی کردن سطرهای DBGrid   هم  توضیح بدید.


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

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

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

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

----------


## nasr

این برای رنگی کردن رکوردها است


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

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


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

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

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

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


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

----------


## hadisalahi2

آقای حامد خان من مقاله رنگی کردن سطرها رو خوندم .
حالا اگه من بخوام سطرهای من به صورت یک درمیان رنگ بشوند باید چی کار کنم.
مثل GRidView  که در ASP.Net  وجود داره.
ممنون از لطفتون
یا حق

----------


## Hsimple11

باز هم قوانین سایت رو رعایت نکردید. جستجو میکردید. حتی مثال آن هم در سایت وجود دارد. 

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

----------


## hadisalahi2

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

----------


## Hsimple11

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


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

http://www.barnamenevis.org/sh...B3%D8%B7%D8%B1
http://www.barnamenevis.org/sh...B3%D8%B7%D8%B1
http://www.barnamenevis.org/sh...B3%D8%B7%D8%B1
http://www.barnamenevis.org/sh...B3%D8%B7%D8%B1
https://barnamenevis.org/showth...color+dbgrid#3

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

----------


## Hsimple11

با سلام و روز بخیر...

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



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

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

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


*کنترل رسم*

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

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

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



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

----------


## Hsimple11

در چند پست آینده قصد دارم تمام تاپیکهایی که در مورد DBGrid بحث کرده اند رو قرار بدم. فکر میکنم برای کامل شدن این تاپیک مفید باشه :


1- قرار دادن آيكن در يكي از فيلدها در DBGRID
2- تبدیل گرید به فایل Excel 
3- برنامه نمایش اشعار
4- چطوري ميشه به cell خاص از يه رديف انتخاب شده در dbgrid دسترسي داشت؟
5- ایجاد Box در بالا و پایین ستونهای Grid
6- گذاشتن ComboBox در يكي از سلولهاي DBGrid  
7- دیبی گرید شفاف
8- سه رقم شدن اعداد در هنگام تایپ درdbgrid 
9-  انتقال Grid به Excel  
10- استفاده drop down lookup field in dbgrid

11- کمک خیلی فوری لطفا !!!!! DBGRID  
12- استفاده از Grid بدون اتصال به DB  
13- انتخاب سطر و ستون انتخابی در dbgrid
14- چاپ محتوای Grid در FastReport بصورت اتوماتیک
15- خروجی یک کئوری در چند dbgrid  
16- رفتن به رکورد datagrid 
17- ساخت کامپوننت
18- بروز رسانی dbgrid با استفاده از تایمر 
19- اضافه کردن ردیف در dbgrid
20- تغییر رکورد در DBGRID با MOUSEWHEEL

----------


## Hsimple11

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


موفق باشید.

----------


## Hsimple11

مثل اینکه متاسفانه یکی دیگه از مشکلات اینه که کاربران بیشتر صفحه اول هر تاپیکی رو مشاهده می کنند.

----------


## solook

کارتون واقعا جای تحسین داره

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

----------


## Hsimple11

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


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

Copying and Pasting Cell Values in a DBGrid

----------


## tagarg

اگه بخوایم چند سطر تو دیبی گرید رو با هم انتخاب کنیم چه کاری میشه کرد؟
مثلا با Drag یا نگه داشتن Shift+Arrowkey؟؟؟
نیاز فوری دارم  :ناراحت:

----------


## Hsimple11

> اگه بخوایم چند سطر تو دیبی گرید رو با هم انتخاب کنیم چه کاری میشه کرد؟


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

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

----------


## ariobarzan

با تشكر از اطلاعات مفيدتون
من ميخوام تعدادي از ركورد هاي دي بي گريد  توسط كاربر انتخاب بشه و  بعد تغييراتي روي بعضي از فيلدهاي اون انجام بشه 
خاصيت  dgmultiselect   را  true   كردم  و حالا  امكان انتخاب چند ركورد فراهم شده
تا اينجا خوب بوده  ولي نميدونم  چطور با اين ركورد هاي انتخاب شده  ارتباط برقرار كنم و  بعضي فيلد هاشونو  ويرايش كنم 
ممكنه راهنمايي بفرماييد 
ممنون

----------


## Hsimple11

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

Summing multiple selected rows in a DBGrid

 DBGrid with MultiSelect

----------


## ariobarzan

با سلام
ضمن تشكر  از توجه شما  من با استفاده از لينكي كه شما  ذكر كرده بوديد  كد زير را نوشتم
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

1- بهتر است حلقه خود را از 0 تا SelectedRows.Count-1 بگذارید.

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

موفق باشید.

----------


## ariobarzan

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

----------


## Hsimple11

مشکل احتمالا چیز دیگری است.

----------


## net_ved

کسی کدی داره که بتونه قسمتی از متن جستجو شده رو رنگی کنه
یعنی مثلا اگه من دو حرف "در" را تایپ کردم ... اول از همه جدولم با یه فیلتر یا دستور اس کیو ال محدود بشه به اون رکرد هایی که شامل "در" هستند که تا اینجاشو بلدم که با Like %"در"% انجام می دم ... حالا می خوام توی تمام رکرد های یافت شده دو حرف "در" در فیلدها های لایت شود که نمایان باشد کجای جمله جستجو شده
امیدوارم واضح گفته باشم ...

----------


## Hsimple11

کدهای تمام چیزهایی که گفتید در سایت وجود داره. هم رنگ کردن رکوردها، هم یافتن حروف جستجو شده. فکر کنم با همین تاپیک بتوانید به هدف برسید.


موفق باشید.

----------


## carbon

سلام و خسنه نباشيد براي مطالب جامعتون.
من دنبال راهي ميگردم كه بشه در سلول هاي يك dbgrid عكس زمينه گذاشت.
منظور يك عكس زمينه ثابت براي تمام سلول هاست.
و بعد از اون سلول انتخاب شده عكس زمينش عوض بشه.
تشكر.

----------


## carbon

سلام
كسي خونه نيست.
بحث اين تاپيك مگه تموم شده؟؟؟
يكي به دادم برسه لطفا. :گریه:  :گریه:  :گریه:   :گیج:  :گیج:  :گیج: 
اين عكس رو مي خوام بذارم back سلول ها  
 و اينم وقتي يه cell انتخاب شد.  

كه در آخر تبديل شه به اين

----------


## tefos666

> سلام
> كسي خونه نيست.
> بحث اين تاپيك مگه تموم شده؟؟؟
> يكي به دادم برسه لطفا. 
> اين عكس رو مي خوام بذارم back سلول ها  
>  و اينم وقتي يه cell انتخاب شد.  
> 
> كه در آخر تبديل شه به اين



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

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

سلام یه سوال دارم من یه DBGrid تو فرمم دارم که با دستورات sql از یه جدول یه جستجو رو نمایش میده حالا من میخوام تو این DBGrid ستون اول و سطر آخر رو بخونم باید چه کدی استفاده کنم

----------


## carbon

> دوست عزیز من راه رو پیدا کردم ولی نمیتونم سایزش رو درست کنم و در ضمن ایراد دوم اینه که وقتی تو حالت ادیت میره کل عکس پاک میشه من سورس رو از اینجا پیدا کردم ولی نتونستم استفاده کنم با تغییراتی که دادم موفق شدم اجراش کنم 
> تازه اگه اینو تو گوگل سرچ کنی کلی سایت در این مورد برات میاره 
> 
> Drawing an image in a cell of a Delphi DBGrid
> 
> http://delphi.about.com/library/weekly/aa032205a.htm
> 
> اینم کد خودم بعد از دستکاری 
> 
> ...


سلام

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

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

----------


## carbon

> سلام یه سوال دارم من یه DBGrid تو فرمم دارم که با دستورات sql از یه جدول یه جستجو رو نمایش میده حالا من میخوام تو این DBGrid ستون اول و سطر آخر رو بخونم باید چه کدی استفاده کنم


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

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

----------


## negarin5340

سلام من میخوام با انتخاب رکورد و زدن بر روی یک کلید اون رکورد رنگی شه در ضمن من از پارادوکس هم استفاده می کنم در ضمن اطلاعاتی که در این تایپک گذاشتید خوبه ممکنه این چیزی خواستم باشه در تایپیک اگه ممکنه linkاونو برام بذارید اگه منو راهنمایی کنید ممنون میشم

----------


## ariobarzan

با تشكر از دوستان كه مطالب مفيدي را در اختيار ما قرار دادند

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

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

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

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

----------


## negarin5340

سلام 
چرا اينجا كسي به سوال من جواب نمي ده اين سايت قبلا خيلي بهتر بود به سوال تمام كاربر ها جواب ميداد ولي الان نه من الان 2 هفته سوالمو توي تايپيك مربوطه و تايپيك جداگانه مطرح كردم ولي انگار نه انگار

----------


## دکمه64

> سلام 
> چرا اينجا كسي به سوال من جواب نمي ده اين سايت قبلا خيلي بهتر بود به سوال تمام كاربر ها جواب ميداد ولي الان نه من الان 2 هفته سوالمو توي تايپيك مربوطه و تايپيك جداگانه مطرح كردم ولي انگار نه انگار


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

----------


## negarin5340

سلام
من مي خوام يك ركورد را انتخاب كنم و با زدن بر روي يك buttonرنگ ركورد انتخابي عوض شه ممنون

----------


## دکمه64

سلام
درمورد سوالتون:
من درست نمی دونم برنامتون چطوری هست اما یکی از دو راه زیر رو می تونید انجام بدین:
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

یادم رفت بگم شما می تونید اون فیلد جدید رو که اضافه کردین رو مخفی کنید.تا تو برنامه معلوم نباشه.

----------


## negarin5340

> سلام
> درمورد سوالتون:
> من درست نمی دونم برنامتون چطوری هست اما یکی از دو راه زیر رو می تونید انجام بدین:
> 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
> ...


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

----------


## negarin5340

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

ببخشيد آبي يا قرمز فرقي نمي كنه در كل رنگي نكرد

----------


## دکمه64

*من یه بار دیگه برنامه رو تست کردم.وبه یه نتیجه رسیدم:*
*نمی دونم چرا ولی اگه روی* *dbgrid1** دوبار کلیک کنید و اون کادر* *Editing** باز بشه نباید فیلد های جدول رو در اون* *add** کنید. چون اگه این کار رو کنید دیگه کار نمی کنه(رنگی نمیشه).*
*اگه خالی نیست همه رو انتخاب کنید و حذف کنید.*

----------


## delafarin

> به ادامه خواص کلی DBGrid می پردازیم :
> 
> 
> *مشخص کردن منبع یک ستون*
> 
> در زمان اجرا شما میتونید خاصیت AssignedValues یک ستون بفهمید که آیا یک ستون DBGrid مقدارش رو از یک فیلد بدست میاره یا نه :
> 
> DBGrid1.Columns[0].AssignedValues
> 
> ...


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

----------


## negarin5340

اينم يك كد كه آقاي حسين زاده برام گذاشتن منم براي شما مي ذارمش
*روی این خاصیت دوبار کلیک کنید و دستورات زیر رو بنویسید.*

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

----------


## negarin5340

هر كس مي خواد بگه تا براش كل فايل رو ايميل كنم

----------


## ariobarzan

> با تشكر از دوستان كه مطالب مفيدي را در اختيار ما قرار دادند
> 
> قبلا در مورد انتخاب تعداد خاصي از ركورد ها در دي بي گريد و ويرايش اطلاعات فيلد هاي اون بحث شد كه نتيجه خوبي هم داشت
> 
> حالا موضوع اينه كه اگه بخواهيم تغييراتي در اطلاعات افراد انتخاب *نشده* بديم
> چكار بايد كرد؟
> 
> مثال براي افرادي كه كاربر انتخاب ميكنه پروسه A و براي افراد انتخاب نشده پروسه B 
> اجرا بشه .
> ...


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

----------


## delafarin

> اينم يك كد كه آقاي حسين زاده برام گذاشتن منم براي شما مي ذارمش
> *روی این خاصیت دوبار کلیک کنید و دستورات زیر رو بنویسید.*
> 
> *اول* *DBGrid1**رو انتخاب کنید*


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

----------


## delafarin

> هر كس مي خواد بگه تا براش كل فايل رو ايميل كنم


-----------------------------------------------------------------

----------


## دکمه64

> *من یه بار دیگه برنامه رو تست کردم.وبه یه نتیجه رسیدم:*
> *نمی دونم چرا ولی اگه روی* *dbgrid1** دوبار کلیک کنید و اون کادر* *Editing** باز بشه نباید فیلد های جدول رو در اون* *add** کنید. چون اگه این کار رو کنید دیگه کار نمی کنه(رنگی نمیشه).*
> *اگه خالی نیست همه رو انتخاب کنید و حذف کنید.*


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

----------


## delafarin

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

----------


## welcome_r

با سلام 
من ميخواهم براي كنترل  وارد كردن اطلاعات در يك سل يك event  بنويسم كه در صورتي كه اطلاعات وارد شده حائز  شرايط نبود خروج از ان سل امكان پذير نباشد. كسي از دوستان ميتونه منو راهنمائي كنه
 با تشكر

----------


## mr13668248

اینو بنویس جواب میده 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

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

با تشکر

----------


## behyii

سلام كسي الان آنلاين هست من ي سوال فوري دارم جوابم رو بده؟

----------


## behyii

من مبتدي هستم مي خواهم با كليك روي عنوان ستون نام اصلي ستون رو به دست بياورم يعني بفهمم كه كاربر با كليك روي عنوان ستون روي كدوم عنوان ستون كليك كرده

----------


## SayeyeZohor

سورس هاي مربوط به دي بي گريد :
Database1
QuickiesContest

1- Displaying and editing MEMO fiels in Delphi's TDBGrid

2- Sorting records in Delphi DBGrid by Clicking on Column Title

3- Adding components to a DBGrid

4- Alternate DBGrid Row Color

5- Coloring DBGrid

----------


## sasan_x3e8

سلام   خسته نباشین وقت  بخیر   
اساتید محترم   لطفا کمک  کنید فردا  باید  تحویل  بدم  5 نمره داره    (یعنی  29 اردیبهشت 92)
میخوام   وقتی  روی  دکمه  انجام کلیک میشه   رکورد  ها با  هم  جمع  بشن    یعنی  اولی و  اضافه کنه  بعد همونو  با بعدی  جمع  و الی آخر  مثل ِ   عکس  
خیلی  گشتم  موفق  نشدم   عاجزانه  درخواست  کمک  دارم  چون  حرفه ای  هم نیستم  ممنون

----------


## یوسف زالی

این چه کاریه آخه؟
یک قانون رو چند بار باید گوشزد کرد؟
از طرفی کار شما چه ربطی به گرید داره؟
نشستید نشستید شب تحویل اومدید اینجا انتظار دارید براتون کسی کاری انجام بده؟
نکنید عزیز من

----------


## t0r1st

سلام دوستان امکانش هست
یه سمپل کوچیک از قرار دادن عکس در بک گراند dbgrid بگذارید
با تشکر 
یاعلی مدد

----------


## MNosouhi

سلام.
کار سختی نیست. در مورد calculeted fields جستجو نمایید .

----------


## یوسف زالی

> کار سختی نیست. در مورد calculeted fields جستجو نمایید .


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

----------


## pink_sbn

درود دوستان 
میخوام alignment فقط یک ستون از datagridview رو left to right  کنم. چیکار کنم؟
مرسی

----------


## یوسف زالی

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

----------


## pink_sbn

ممنون ، اما من می خوام alignment فقط یک ستون از  gridview رو خودم به صورت دستی ( توو برنامه نویسی)   LeftToRight   کنم. چطور می شه؟

----------


## یوسف زالی

گفتم که بهتون. تست کنید.

----------


## pink_sbn

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

----------


## یوسف زالی

..........

----------


## sempaisaleh

با سلام خدمت دوستان
يه مشكلي تو رنگي كردن 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‌رو تو مسير گتابهانه بذاري. (يه همچين چيزايي  :لبخند گشاده!: )

----------


## یوسف زالی

سلام.
مشکل شما قدری عجیبه. بعید می دونم اشکال مربوط به اینجایی باشه که گفتید. بررسی کنید ببینید اشتباهی به جای Rect جایی ننوشتید TRect ؟

----------


## sempaisaleh

> سلام.
> مشکل شما قدری عجیبه. بعید می دونم اشکال مربوط به اینجایی باشه که گفتید. بررسی کنید ببینید اشتباهی به جای Rect جایی ننوشتید TRect ؟


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

----------


## یوسف زالی

Windows رو در یوزز بیاورید دوباره چک کنید.

----------


## sempaisaleh

> 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)

----------


## یوسف زالی

مقادیر عددی چرا کوتیشن دارند؟

----------


## grand_ceasare

برای جابجایی یک سطر از 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

*سلام**

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

----------


## ayubtanha

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

----------

