PDA

View Full Version : نمایش Custom Field در گرید



seyed_farid
پنج شنبه 04 خرداد 1396, 15:05 عصر
با سلام
یک فیلد boolean دارم که بجای True/False من auto/Manual در دیتابیس Access قرار دادم ولی در Db Grid که نمایش میدم بصورت True/False نمایش میده .
کار با adotable انجام شده.
دوستان میتونن راهنمایی کنن چطور میشه بصورت auto/Manual نشونش داد؟

seyed_farid
جمعه 05 خرداد 1396, 02:15 صبح
این هم راهش


procedure TDatamodule1.DBGridDrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState);

var
sText : String;

begin

if (UpperCase(Column.Field.FieldName) = 'STATE') or
(UpperCase(Column.Field.FieldName) = 'AUTO')) then
begin
if Column.Field.Value = True then
sText := 'Auto'
Else
If Column.Field.Value = False Then
sText := 'Manual'
Else

sText := '';
(Sender as TDBGrid).Canvas.FillRect(Rect);
(Sender as TDBGrid).Canvas.TextRect(Rect, Rect.Left+3, Rect.Top+2, sText);
end
Else
Begin { I added this to draw all other columns as defaultdrawing is off }
(Sender as TDBGrid).defaultdrawcolumncell(Rect, DataCol, Column, State);
End;
end;

Mahmood_M
جمعه 05 خرداد 1396, 22:29 عصر
به جای تغییر متن Grid باید توی رویداد onGetText مربوط به Field مثلا به صورت زیر متنی که قصد دارید نمایش داده بشه رو تغییر بدید :

case Sender.AsBoolean of
True : Text := 'Auto';
False : Text := 'Manual';
else
Text := '-';
end;
در حالت کلی برای نمایش مقداری متفاوت از چیزی که درون فیلد ذخیره میشه باید از رویداد OnGetText مربوط به Field استفاده کنید
استفاده از این رویداد باعث تغییر متن در سطح فیلد میشه و متن هر کامپوننتی که به فیلد وصل هستش تغییر می کنه، مثل DBGrid یا DBLabel یا ...
رویداد DrawColumnCell مربوط به Grid دفعات زیادی اجرا میشه و تغییر متن Cell توی این رویداد می تونه باعث کند شدن Grid بشه

seyed_farid
دوشنبه 15 خرداد 1396, 20:19 عصر
با سلام و تشکر از راهنمایی تون
من چون تیبل رو در اجرای برنامه باز میکنم و فیلدها رو دستکاری نمیکنم لذا در حین برنامه ریزی آیتم مربوط به فیلدها حاضر نیست.
چطور و کجا میشه این خطوط که شما نوشتید رو نوشت و جواب گرفت؟

Mahmood_M
دوشنبه 15 خرداد 1396, 21:39 عصر
یک Procedure برای فرم یا DataModule با Signature مشابه رویداد OnGetText مربوط به Field بسازید به این صورت :

procedure TForm1.MyFieldGetText(Sender: TField; var Text: String;
DisplayText: Boolean);
begin
case Sender.AsBoolean of
True : Text := 'Auto';
False : Text := 'Manual';
else
Text := '-';
end;
end;

در رویدادی مثل OnAfterOpen مربوط به Query می تونید به این صورت، رویداد OnGetText مربوط به فیلد ها رو ست کنید :

procedure TDM.MyQueryAfterOpen(DataSet: TDataSet);
begin
MyQuery.Fields[0].OnGetText := Form1.MyFieldGetText;
end;