التخطي إلى المحتوى الرئيسي

سؤال كيف اظهار قيمة حقل فى dbgrid على شكل hint ؟

السلام عليكم ورحمة الله
--
سؤال كيف اظهار قيمة حقل فى dbgrid على شكل hint ؟

الاجابة :
فى الحقيقة اجابة هذا السؤال سهلة للغاية فالكمبوننت dbgrid غنى جدا بالخصائص وممكن تطويعه لعمل اشياء كثيرة ولكن يلزمه قليل من التعديل
تخيل ان عندنا جدول به مجموعة من الصفوف والاعمدة نريد اظهار قيمة الحقل عند المرور عليه بالmouse
مبدئيا نحتاج للتعامل مع الحدث onMouseMove الخاص بال dbgrid
ونحدد مكان الحقل
ثم ننتقل الى الحقل المراد اظهاره ونقراه من ال Activelink
ثم نقوم باظهاره على شكل hint

الطريقة وحدة وحدة
نعرف متغير من النوع TGridCoord 
ونجعله ياخذ قيمته من الدالة mousecoord


var
   Cell : TGridCoord;
Cell := DBGrid1.MouseCoord(X, Y);
نحن نريد ان نستثنى كل من العمود المخصص للindicator والصف المخصص للtitle
لذلك سنبحث فى الoptions الخاصة بالdbgrid عن كل من الخاصيتين
if dgTitles in DBGrid1.Options then
   Dec(Cell.Y);
   if dgIndicator in DBGrid1.Options then
   Dec(Cell.X);

الان نريد ان نعرف اذا كانت الdbgrid متصلة بمصدر بيانات ام لا لذلك نلجا الى اختبار الdatalink.active ولكن انتظر
الخاصية datalink هى خاصية محمية فى dbgrid فما العمل
العمل هو الوراثة ----
"الخواص المحمية فى المورث يمكن استخدامها بشكل عام فى الوارث"
بالفعل الخاصية Datalink  محمية protected
لذلك سنلجا الى الوراثة وهنا انا قمت بانشاء كمبوننت جديد لمجرد اضافة هذه الخاصية ولكن بعدها تراجعت عن استخدامه وقمت بعملية الوراثة فى الunit نفسها التى اعمل عليها بتعريف نوع جديد كالاتى
type TmyCustomDBbgrid = class (TDBGrid);
الان يمككنا اختبار اذا كان الdatalink فى الوضع Active او لا
TmyCustomDBbgrid(DBGrid1).DataLink.Active
كل الاشياء القادمة سهلة للغاية
اول شئ نحفظ المكان الاصلى للdatalink.ActiveRecord وهو من النوع integer
ثم ننقل الActiveRecord الى الصف الذى يشير اليه الmouse بالاستعانة بCell.Y
ثم نقرا الfield المشار اليه بالmouse بالاستعانة بالcell.x
نسند قيمة الحقل المقرؤه الى الhint الخاصة بالdbgrid
وفى النهاية نرجع الى المكان الاصلى الخاص بالActiveRecord
try
   ActiveRecordBok := TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord;
   TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord := Cell.Y;
   DBGrid1.Hint := DBGrid1.Fields[Cell.x].AsString;
   Application.ActivateHint(DBGrid1.ClientToScreen(point(x, y)));
  finally
   TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord := ActiveRecordBok;
  end;

ليصبح الكود النهائى  على الشكل التالى
procedure TFrMain.DBGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  var
   Cell : TGridCoord;
   ActiveRecordBok : Integer;
  begin
   Cell := DBGrid1.MouseCoord(X, Y);
   if dgTitles in DBGrid1.Options then
   Dec(Cell.Y);
   if dgIndicator in DBGrid1.Options then
   Dec(Cell.X);
if (TmyCustomDBbgrid(DBGrid1).DataLink.Active) and (Cell.X >= 0) and (cell.Y >= 0) then
begin
  try
   ActiveRecordBok := TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord;
   TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord := Cell.Y;
   DBGrid1.Hint := DBGrid1.Fields[Cell.x].AsString;
   Application.ActivateHint(DBGrid1.ClientToScreen(point(x, y)));
  finally
   TmyCustomDBbgrid(DBGrid1).DataLink.ActiveRecord := ActiveRecordBok;
  end;
end;

end;

تعليقات

المشاركات الشائعة من هذه المدونة

برنامج اطلس 10 لادارة الصيدلية الاصدار الاخيرة

بسم الله الرحمن الرحيم  الصلاة والسلام على سيدنا محمد عبده ورسوله بعد البحث عن برنامج لادارة الصيدلية وقع اختيار على برنامج اطلس 10 اصدارة 2011 برنامج اطلس للصيدليات وبالفع اشتريته وكانت المفاجات تتوالى. فالبرنامج لا يتمتع بالمرونة وينقصه الكثير من التطوير باستخدامه  وجدت الاتى وتسالت؟؟

اغلق الكمبيوتر بعد اتمام تحميل التورنت Shutdown When Downloads Complete

بسم الله الرحمن الرحيم اعشق التحميل عن طريق التورنت لما يوفره من امكانات ربما لا تتوفر فى طرق التحميل الا خرى ولكنى افضل التحميل خلال الليل وذلك حتى لا يؤثر على سرعة الانترنت خلال ساعات النهار وهنا ياتى شئ مهم فربما لا يستغرق التحميل مدة زمنية كبيرة فمن الممكن ان يكون ساعة او ساعتين او اربع ساعات فلماذا اترك الكمبيوتر يعمل بقية الليل ؟

الغاء التكليف يوم عبر مشوار الحياة

بسم الله الرحمن الرحيم منذ صغرى وانا احب العمل الحر ولا اريد ان اعمل فى جو من الروتين الحكومى واهرب الهروب الكبير من العمل فى جو يبنى اساسا على امضاء ورقة هنا وختم هناك واشياء قد تودى بحياتى لما اتمتع به من روح ضيقة وسرعة انفعال المهم وكخطوة فى طريق حياتى حان الوقت لتغير المهنة فى البطاقة الشخصية من طالب (انتهى من الدراسة منذ عامين) الى المهنة التى امارسها حاليا وهى