هل تريد إنشاء أفضل شبكة لتحرير البيانات على الإطلاق؟ فيما يلي إرشادات حول إنشاء واجهة مستخدم لتحرير حقول البحث داخل DBGrid. على وجه التحديد ، سننظر في كيفية وضع DBLookupComboBox في خلية DBGrid.
ما سيفعله هذا هو استدعاء معلومات من مصدر بيانات سيتم استخدامها لملء مربع منسدل.
لإظهار DBLookupComboBox داخل خلية من DBGrid، تحتاج أولاً إلى توفير واحد في وقت التشغيل ...
إنشاء بحث باستخدام DBLookupComboBox
حدد صفحة "عناصر التحكم في البيانات" في لوحة المكونات واختر DBLookupComboBox. إسقاط واحد في أي مكان في النموذج وترك الاسم الافتراضي "DBLookupComboBox1." لا يهم المكان الذي وضعته فيه معظم الوقت ، سيكون غير مرئي أو عائمًا على الشبكة.
إضافة مكون آخر DataSource و DataSet "لملء" مربع التحرير والسرد بالقيم. قم بإسقاط TDataSource (باسم DataSource2) و TAdoQuery (أطلق عليه اسم AdoQuery1) في أي مكان في النموذج.
لكي يعمل DBLookupComboBox بشكل صحيح ، يجب تعيين العديد من الخصائص ؛ هم مفتاح اتصال البحث:
- مصدر البيانات و حقل البيانات تحديد الاتصال الرئيسي. DataField هو حقل نقوم بإدراج قيم البحث فيه.
- ListSource هو مصدر مجموعة بيانات البحث.
- KeyField يحدد المجال في ListSource يجب أن تتطابق مع قيمة حقل البيانات حقل.
-
ListFields هو حقل (حقول) مجموعة بيانات البحث التي يتم عرضها فعليًا في التحرير والسرد. يمكن أن يعرض ListField أكثر من حقل واحد ولكن يجب فصل المضاعفات بفواصل منقوطة.
يجب عليك تعيين قيمة كبيرة بما يكفي لـ DropDownWidth (من ComboBox) لرؤية أعمدة متعددة من البيانات.
إليك كيفية تعيين جميع الخصائص المهمة من التعليمات البرمجية (في النموذج حدث OnCreate معالج):
إجراء TForm1.FormCreate (المرسل: TObject) ؛
إبتدئ ب DBLookupComboBox1 دوبيجين
مصدر البيانات: = DataSource1؛ // -> AdoTable1 -> DBGrid1
ListSource: = DataSource2؛
DataField: = 'AuthorEmail'؛ // من AdoTable1 - يتم عرضه في DBGrid
KeyField: = 'Email'؛
ListFields: = 'Name؛ البريد الإلكتروني'؛
مرئي: = خطأ ؛
النهاية;
DataSource2.DataSet: = AdoQuery1؛
AdoQuery1.Connection: = AdoConnection1؛
AdoQuery1.SQL.Text: = 'SELECT Name، Email from FROM Authors'؛
AdoQuery1.Open ؛
النهاية;
ملحوظة: عندما تريد عرض أكثر من حقل في DBLookupComboBox ، كما في المثال أعلاه ، عليك التأكد من أن جميع الأعمدة مرئية. يتم ذلك عن طريق تعيين الخاصية DropDownWidth.
ومع ذلك ، سترى أنه في البداية ، يجب عليك تعيين هذا على قيمة كبيرة جدًا مما يؤدي إلى عرض القائمة المنسدلة على نطاق واسع جدًا (في معظم الحالات). أحد الحلول هو تعيين DisplayWidth لحقل معين كما هو موضح في قائمة منسدلة.
يضمن هذا الرمز ، الموجود داخل حدث OnCreate للنموذج ، عرض كل من اسم المؤلف والبريد الإلكتروني الخاص به داخل القائمة المنسدلة:
AdoQuery1.FieldByName ("البريد الإلكتروني") DisplayWidth: = 10؛
AdoQuery1.FieldByName ('Name'). DisplayWidth: = 10؛
AdoQuery1.DropDownWidth: = 150؛
ما عليك فعله هو فعلاً تحريك مربع التحرير والسرد فوق خلية (عندما تكون في وضع التحرير) ، عرض حقل AuthorEmail. أولاً ، نحتاج إلى التأكد من نقل DBLookupComboBox1 وحجمه فوق الخلية التي يتم فيها عرض حقل AuthorEmail.
إجراء TForm1.DBGrid1DrawColumnCell
(المرسل: الكائن ؛
ثابت Rect: TRect؛
DataCol: عدد صحيح؛
العمود: TColumn ؛
الدولة: TGridDrawState) ؛
تبدأ (gdFocused في حالة) ثم بينجيف (عمود. حقل. FieldName = DBLookupComboBox1.DataField) ثم مع DBLookupComboBox1 فعل
ابدأ
اليسار: = Rect. Left + DBGrid1.Left + 2 ؛
الأعلى: = Rect. أعلى + DBGrid1.Top + 2 ؛
العرض: = مستطيل. حق - مستطيل. اليسار؛
العرض: = مستطيل. حق - مستطيل. اليسار؛
الارتفاع: = Rect. أسفل - مستطيل. أعلى؛
مرئي: = صحيح ؛
النهاية;
النهاية
النهاية;
بعد ذلك ، عندما نغادر الخلية ، يجب أن نخفي مربع التحرير والسرد:
إجراء TForm1.DBGrid1ColExit (المرسل: TObject) ؛
تبدأ DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField ثم
DBLookupComboBox1.Visible: = False
النهاية;
لاحظ أنه عندما تكون في وضع التحرير ، فإن كل ضغطات المفاتيح ستنتقل إلى خلية DBGrid ولكن يجب أن نتأكد من إرسالها إلى DBLookupComboBox. في حالة DBLookupComboBox ، نحن مهتمون بشكل أساسي بمفتاح [Tab] ؛ يجب أن ينقل تركيز الإدخال إلى الخلية التالية.
إجراء TForm1.DBGrid1KeyPress (المرسل: TObject؛ مفتاح var: Char) ؛
تبدأ (المفتاح = Chr (9)) ثم خروج؛
إذا (DBGrid1.SelectedField. FieldName = DBLookupComboBox1.DataField) ثم تبدأ
DBLookupComboBox1.SetFocus ؛
SendMessage (DBLookupComboBox1.Handle، WM_Char، word (Key)، 0)؛
النهاية
النهاية;
عند اختيار عنصر ("الصف") من DBLookupComboBox ، القيمة أو المقابل KeyField يتم تخزين الحقل كقيمة حقل البيانات حقل.