إضافة تعليق جديد

TDBGrid في دلفي 2007 و دلفي 2009 مشكلة و حل

في الحقيقة برامجي التي أطورها والتي تستخدم قواعد بيانات مازالت على دلفي 2006 ، لكني منذ يومين بدأت مشروعاًَ صغيراً (قواعد بيانات) و اخترت أن أبدأه على دلفي2009 ، وقد تفاجئت بوجود ثغرة واضحة في مكون TDBGrid  هذه الثغرة تظهر مع تغيير خاصية الـ BiDiMode إلى bdRightToLeft لتتلائم مع اللغة العربية في الكتابة من اليمين إلى اليسار:
- قم بانشاء مشروع VCL جديد.
- ضع مكون TDBGrid على النموذج و غير خاصية BiDiMode  إلى BdRightToLeft
- أربط DBGrid مع Datasource بحيث تحوي الشبكة على بضعة صفوف.
- قم بتشغيل التطبيق، حاول أن تحرك النموذج تحت أي نافذة أخرى أو تحت شريط المهام مثلاً ستلاحظ في النهاية أن الشبكة قد تشوهت وربما ستشاهد منظراً كهذا
TDBGrid Bug
هذه المشكلة موجودة في دلفي2007 و دلفي2009 و دلفي2009 التحديث الأول (التحديث الثاني لم أحصل عليه حتى الآن ) أجريت بحثاً على جوجل و على Quality Central ولم أجد أي أشارة لهذه الثغرة، ربما يكون السبب أن دلفي ليس لديها شعبية كبيرة في المنطقة العربية (ربما!) أو ربما بسبب أن المطورين لم يقوموا بترقية مشاريعهم لنسخ دلفي تلك ...مثلي :)
المهم حاولت البحث عن سبب هذه المشكلة، و هذا أمر لم يكن سهلاً بسبب التعقيد في بنية TGrid و TDBGrid و صعوبة تنقيح مثل هكذا خطأ، في النهاية (بعد عدة ساعات) أليكم سبب المشكلة و الحل:
السبب في البداية هو أن كودغير انتقلت مع دلفي 2007 إلى نسخة جديدة من TWinControl.WMPaint الذي يقوم بتطبيق الرسالة WM_PAINT في هذه النسخة الجديدة نقوم برسم فقط المربع الذي يجب تحديثه وليس كامل النافذة كما في النسخة القديمة و ذلك بستخدام تابع الـ API  BeginPaint الذي يبدو أنه لايعمل (في حالة TDBGrid) بشكل جيد. فإذاً الحل السريع لدي هو إعادة صياغة وتطبيق التابع WMPaint في TCustomDBGrid بحيث نجبره على إعادة رسم كامل النافذة في حال كان أتجاهها من اليمين إلى اليسار


private
procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
.
.
.

procedure TCustomDBGrid.WMPaint(var Message: TWMPaint);
var Rect: Trect;
begin
if UseRightToLeftAlignment then
Begin
Rect.TopLeft := ClientRect.TopLeft;
Rect.BottomRight := ClientRect.BottomRight;
InvalidateRect(Handle,@Rect,false);
End;
Inherited;
end;

قمت بإضافة هذه الثغرة إلى Quality Central برقم 70075
هذا كان حلاً سريعاً وبالتأكيد أي إقتراح آخر سيكون مرحباً به.

Articles Categories: