27-04-2016, 04:25 PM
السلام عليكم ورحمة الله
--
سؤال كيف اظهار قيمة حقل فى dbgrid على شكل hint ؟
الاجابة :
فى الحقيقة اجابة هذا السؤال سهلة للغاية فالكمبوننت dbgrid غنى جدا بالخصائص وممكن تطويعه لعمل اشياء كثيرة ولكن يلزمه قليل من التعديل
تخيل ان عندنا جدول به مجموعة من الصفوف والاعمدة نريد اظهار قيمة الحقل عند المرور عليه بالmouse
مبدئيا نحتاج للتعامل مع الحدث onMouseMove الخاص بال dbgrid
ونحدد مكان الحقل
ثم ننتقل الى الحقل المراد اظهاره ونقراه من ال Activelink
ثم نقوم باظهاره على شكل hint
الطريقة وحدة وحدة
نعرف متغير من النوع TGridCoord
ونجعله ياخذ قيمته من الدالة mousecoord
نحن نريد ان نستثنى كل من العمود المخصص للindicator والصف المخصص للtitle
لذلك سنبحث فى الoptions الخاصة بالdbgrid عن كل من الخاصيتين
الان نريد ان نعرف اذا كانت الdbgrid متصلة بمصدر بيانات ام لا لذلك نلجا الى اختبار الdatalink.active ولكن انتظر
الخاصية datalink هى خاصية محمية فى dbgrid فما العمل
العمل هو الوراثة ----
"الخواص المحمية فى المورث يمكن استخدامها بشكل عام فى الوارث"
بالفعل الخاصية Datalink محمية protected
لذلك سنلجا الى الوراثة وهنا انا قمت بانشاء كمبوننت جديد لمجرد اضافة هذه الخاصية ولكن بعدها تراجعت عن استخدامه وقمت بعملية الوراثة فى الunit نفسها التى اعمل عليها بتعريف نوع جديد كالاتى
الان يمككنا اختبار اذا كان الdatalink فى الوضع Active او لا
كل الاشياء القادمة سهلة للغاية
اول شئ نحفظ المكان الاصلى للdatalink.ActiveRecord وهو من النوع integer
ثم ننقل الActiveRecord الى الصف الذى يشير اليه الmouse بالاستعانة بCell.Y
ثم نقرا الfield المشار اليه بالmouse بالاستعانة بالcell.x
نسند قيمة الحقل المقرؤه الى الhint الخاصة بالdbgrid
وفى النهاية نرجع الى المكان الاصلى الخاص بالActiveRecord
ليصبح الكود النهائى على الشكل التالى
هذا كل شئ والسلام عليكم ورحمة الله
اللهم ارحم ابى وانر قبره وتجاوز عن سيئاته وزد فى احسانه
--
سؤال كيف اظهار قيمة حقل فى 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;
هذا كل شئ والسلام عليكم ورحمة الله
اللهم ارحم ابى وانر قبره وتجاوز عن سيئاته وزد فى احسانه