لي شياو بينغ / جامعة عمال البترول بشمال الصين في غوان، مقاطعة خبي
---- بغض النظر عن نوع البرنامج الذي تم تطويره، فإن إدخال البيانات أمر لا غنى عنه. مما لا شك فيه أن إنشاء واجهة إدخال جميلة بسرعة سيؤدي إلى تحسين كفاءة تطوير البرنامج بشكل كبير. غالبًا ما تكون الضوابط الأصلية للنظام غير مرضية. في دلفي، إذا كانت مخصصة لحقل معين، فإن عناصر التحكم الاختيارية هي DBLabel، DBEdit، وما إلى ذلك؛ وإذا كانت مخصصة لإدخال الجدول بأكمله، فهناك DBGrid. عند استخدام عناصر تحكم مثل Dbedit، يجب على المستخدمين ترتيب مواضع كل حقل بشكل كامل. على الرغم من أنه يمكن أن يحقق تأثيرات جميلة، إلا أنه سيكون بلا شك مزعجًا للغاية إذا كان هناك العديد من الحقول. إذا تم استخدام DBGrid، بغض النظر عن عدد الحقول الموجودة، فإن عنصر تحكم واحد فقط يكفي. إنه أمر بسيط، ولكن يتم ترتيب الحقول واحدًا تلو الآخر، وهو أمر غير مريح بعض الشيء للاستخدام. بالنسبة للمستخدمين العاديين، يعد الإدخال في شكل جدول مريحًا وجميلًا. هذه هي المشكلة التي تهدف هذه المقالة إلى حلها.
----المفتاح الفني
----الوظيفة الرئيسية لعنصر التحكم هذا هي تحرير حقول قاعدة البيانات. وفقًا للقواعد العامة، يجب أن يحتوي عنصر التحكم على كائن TdataLink وأن ينفذ سلسلة من الأساليب المتعلقة بـ TdataLink، إلا أن ذلك سيستهلك الكثير من التعليمات البرمجية. كلما زاد حجم التعليمات البرمجية، كلما زاد تعقيد النظام وزاد احتمال حدوث الأخطاء. تتمثل فكرة تطوير عنصر التحكم هذا في تحقيق أكبر عدد من الوظائف بأقل قدر من التعليمات البرمجية. لذلك، قم بتحرير حقول البيانات مباشرةً باستخدام عنصر التحكم TDBComboBox.
---- من أجل تحقيق العالمية، يتم الاحتفاظ بمصفوفة التحكم في تحرير الحقل ومصفوفة عنوان الحقل داخل عنصر التحكم. على النحو التالي:
المحررين: مجموعة من TDBComboBox؛
->مجموعة محددة من عناصر التحكم في البيانات المستخدمة للتحرير، والتي يتم إنشاؤها ديناميكيًا
التسميات: مجموعة من TLabel؛
->يتم إنشاء عنوان كل حقل بشكل حيوي
----تتمثل ميزة استخدام TDBComboBox في أنه لا يحتوي على وظائف تحرير عامة فحسب، بل يمكنه أيضًا إضافة معلومات سريعة مقابلة لكل حقل. الرمز هو كما يلي:
{طريقة إضافة معلومات سريعة إلى الحقل الأول}
الإجراء TDBPanel.AddHits
(ItemIndex: عدد صحيح؛ الزيارات: مجموعة من السلسلة)؛
فار
م، ن، ط: عدد صحيح؛
يبدأ
ن := الطول(المحررين);
م := الطول(الزيارات);
إذا كان ItemIndex< n فابدأ
بالنسبة إلى i:=0 إلى m-1، قم بإجراء Editors[ItemIndex].Items.Add(Hits[i]);
نهاية؛
نهاية؛
---- تختلف التطبيقات المحددة بشكل كبير، لذا يحتاج التحكم أيضًا إلى ترك ما يكفي من واجهات معالجة الأحداث للمبرمجين لتنفيذ وظائف خاصة لتطبيقات محددة. يتطلب هذا تحديد أساليب معينة لمعالجة الأحداث في عنصر التحكم ليتمكن المستخدمون من تنفيذها. ما يتم توفيره هنا هو حدث OnOkClick، وهو المعالجة التي يتم إجراؤها عند تحرير جميع الحقول. الرمز هو كما يلي:
أوكبوتون: تيبوتون؛
->يتم استخدام زر موافق المُضاف الأخير لتنفيذ إجراء الإرسال.
الخاصية OnOkClick: قراءة TNotifyEvent FClick والكتابة FCclick؛
---- من خلال تطبيق طريقة OnOKClick، يمكن للمستخدمين إكمال مهام المعالجة المختلفة مثل الإرسال واختبار عقلانية البيانات. الشيء الآخر الذي يتطلب معاملة خاصة هو التحكم في التحويل بين المجالات المختلفة. الافتراضي هو النقر بالماوس. ومع ذلك، فإن عادة المستخدمين هي في كثير من الأحيان استخدام مفاتيح الأسهم الأربعة "لأعلى ولأسفل ولليسار ولليمين" على لوحة المفاتيح. لتنفيذ هذه الوظيفة، يجب تحديد الطريقتين التاليتين:
إجراء AKeyPress(Sender: TObject; var Key: Char);
الإجراء AKeyDown(Sender: TObject;
مفتاح فار: كلمة التحول: TShiftState)؛
---- قم بتعيين الطريقتين المذكورتين أعلاه للمحررين الذين تم إنشاؤهم ديناميكيًا لتحقيق الاستجابة لمفاتيح الأسهم.
---- تحتوي الجداول المختلفة على أعداد مختلفة من الحقول وقد لا يمكن عرضها، الأمر الذي يتطلب وظيفة التمرير. لذلك، يتم إدراج عنصر تحكم TscrollBox في عنصر التحكم. آخر شيء يجب ملاحظته هو التراجع عن عناصر التحكم الديناميكية وتحرير الذاكرة. إن التراجع عن مصفوفة التحكم وتحرير الذاكرة يتم بالترتيب - الترتيب المعاكس تمامًا للإنشاء. وإلا فسوف يحدث خطأ ما.
----استخدام الضوابط
---- قم أولاً بوضع عنصر تحكم DBPanel في النموذج، ثم قم بتعيين خصائص مصدر البيانات وعدد أعمدة نموذج إدخال البيانات والخصائص الأخرى. في البرنامج، بعد فتح مصدر البيانات، ما عليك سوى استدعاء الأسلوب لإنشاء عنصر تحكم تحرير البيانات. الآن:
Query1.Open;->فتح مصدر البيانات
DBPanel1.CreateEditors ->إنشاء عناصر تحكم التحرير لكل حقل
DBPanel1.AddHits(0,['1111','11222','eeee']);
->تعيين معلومات سريعة لحقل معين
DBPanel1.AddHits(1,['1111','11222','eeee']);
->تعيين معلومات سريعة لحقل معين
لقد تم تصحيح أخطاء برنامج التحكم والعينات في بيئة Win98+Delphi 5.0.
---- المرفق: الكود المصدري لـ TDBPanel
وحدة DBPanel؛
واجهة
الاستخدامات
ويندوز، الرسائل، SysUtils، الطبقات،
الرسومات، وعناصر التحكم، والنماذج، ومربعات الحوار،
ExtCtrls، dbctrls، stdctrls، db؛
يكتب
TDBPanel = فئة (TPanel)
خاص
{تصريحات خاصة}
FLeft: عدد صحيح؛
FTop: عدد صحيح؛
maxTextLen: عدد صحيح؛
maxLabelLen: عدد صحيح؛
FScrollBox: TScrollBox؛ {التحكم بالتمرير}
FLineHeight: عدد صحيح؛
FCclick: TNotifyEvent؛
المحررين: مجموعة من TDBComboBox؛
->مجموعة محددة من عناصر التحكم في البيانات المستخدمة للتحرير، والتي يتم إنشاؤها ديناميكيًا
التسميات: مجموعة من TLabel؛
->يتم إنشاء عنوان كل حقل بشكل حيوي
أوكبوتون: تيبوتون؛
->يتم استخدام زر موافق المُضاف الأخير لتنفيذ إجراء الإرسال.
{مصدر البيانات}
FDataSource: TDataSource;
الأعمدة: عدد صحيح؛
->أدخل عدد أعمدة الجدول
محمي
{ التصريحات المحمية }
الإجراء FreeEditors؛
-> تحرير ذاكرة التحكم في إدخال البيانات
عام
إجراء إنشاء المحررين؛//
(DS: TDataSource؛ ColCount: عدد صحيح)؛
->إنشاء ضوابط إدخال البيانات لكل حقل
إنشاء المنشئ (المالك:
TComponent)؛
تدمير المدمرة؛
الإجراء AKeyPress (المرسل:
TObject; var Key: Char);
الإجراء AKeyDown (المرسل:
TObject؛ مفتاح فار: تحويل الكلمة:
TShiftState);
الإجراء ClearHits(ItemIndex: Integer);
الإجراء AddHits(ItemIndex:
عدد صحيح؛
محرر الوظائف (الفهرس: عدد صحيح):
TDBComboBox;
{التصريحات العامة}
نشرت
propertyLeftLimit: قراءة عدد صحيح
FLeft write FLeft الافتراضي 10؛
الخاصية TopLimit: قراءة عدد صحيح
FTop اكتب FTop الافتراضي 10؛
خاصية EditorLen: قراءة عدد صحيح
maxTextLen write maxTextLen;
خاصية LabelLen: قراءة عدد صحيح
يكتب maxLabelLen maxLabelLen default 100;
خاصية LineHeight: قراءة عدد صحيح
FLineHeight يكتب FLineHeight الافتراضي 15؛
الخاصية OnOkClick: TNotifyEvent
قراءة FCclick، كتابة FCclick؛
مصدر بيانات الخاصية: TDataSource
قراءة FDataSource، كتابة FDataSource؛
->مصدر البيانات
أعمدة الخاصية: عدد صحيح للقراءة
FColumns يكتب FColumns;->عدد أعمدة الجدول
{ التصريحات المنشورة }
نهاية؛
سجل الإجراء؛
تطبيق
سجل الإجراء؛
يبدأ
RegisterComponents('Additional', [TDBPanel]);
نهاية؛
{طريقة إضافة معلومات سريعة إلى الحقل الأول}
الإجراء TDBPanel.AddHits(ItemIndex:
عدد صحيح؛
فار
م، ن، ط: عدد صحيح؛
يبدأ
ن := الطول(المحررين);
م := الطول(الزيارات);
إذا كان ItemIndex< n فابدأ
بالنسبة إلى i:=0 إلى m-1، قم بإجراء Editors[ItemIndex].Items.Add(Hits[i]);
نهاية؛
نهاية؛
الإجراء TDBPanel.AKeyDown
(المرسل: TObject؛ مفتاح var: Word؛
التحول: TShiftState)؛
يبدأ
إذا (المرسل هو TDBComboBox) فابدأ
مفتاح الحالة
VK_Next: (المرسل كـ TDBComboBox)
.DataSource.DataSet.Next;
VK_PRIOR: (المرسل كـ TDBComboBox)
.DataSource.DataSet.Prior;
نهاية؛
نهاية؛
نهاية؛
الإجراء TDBPanel.AKeyPress(Sender: TObject; var Key: Char);
يبدأ
إذا (المرسل هو TDBComboBox) فابدأ
إذا كان المفتاح=#13 ثم (المالك كـ TForm).Perform(WM_NEXTDLGCTL, 0, 0);
نهاية؛
نهاية؛
الإجراء TDBPanel.ClearHits(ItemIndex: Integer);
فار
ن: عدد صحيح؛
يبدأ
ن := الطول(المحررين);
إذا كان ItemIndex < n ثم Editors[ItemIndex].Items.Clear؛
نهاية؛
منشئ TDBPanel.Create(AOwner: TComponent);
يبدأ
إنشاء موروث (AOWner)؛
Fيسار :=10;
FTop := 10;
maxTextLen := 100;
maxLabelLen := 100;
FLineHeight := 15;
نهاية؛
{طريقة إنشاء ضوابط إدخال البيانات لكل حقل}
الإجراء TDBPanel.CreateEditors;//
(DS: TDataSource؛ ColCount: عدد صحيح)؛
فار
i، n، RowCount: عدد صحيح؛
ارتفاع النص: عدد صحيح؛
يبدأ
إذا DataSource.DataSet.Active ثم تبدأ
n := DataSource.DataSet.FieldCount;
{احسب الحد الأقصى لطول العنوان وطول العرض}
DataSource.DataSet.First;
{حساب الارتفاع}
TextHeight := Canvas.TextHeight(DataSource
.DataSet.Fields[0].DisplayLabel) + FLineHeight; //10;
{احسب عدد الصفوف والأعمدة}
RowCount := n div Columns;
إذا كان n mod Columns < > 0 ثم inc(RowCount);
{تخصيص الذاكرة}
محررين مجانيين؛
SetLength(Editors, n);
SetLength(Labels, n);
{إنشاء مربع التمرير}
FScrollBox := TScrollBox.Create(Owner);
FScrollBox.Parent := ذاتي؛
FScrollBox.Align := alClient;
{إنشاء تحرير}
لأني:=0 إلى n-1 تبدأ
{إنشاء عنوان}
التسميات[i] := TLabel.Create(Owner);
Labels[i].Parent := FScrollBox;
Labels[i].Caption := DataSource.DataSet.Fields[i].DisplayLabel;
التسميات[i].Left := FLeft + (maxLabelLen +
maxTextLen + 10) * (i div RowCount);
Labels[i].Width := maxLabelLen;
Labels[i].Top := FTop + (i mod RowCount) * TextHeight + 5;
{إنشاء كائن تحرير}
Editors[i] := TDBComboBox.Create(Owner);
Editors[i].Parent := FScrollBox;
Editors[i].Left := Labels[i].Left + Labels[i].Width;
Editors[i].Width := maxTextLen;
Editors[i].Top := FTop + (i mod RowCount) * TextHeight;
Editors[i].DataSource := DataSource;
Editors[i].DataField := DataSource.DataSet.Fields[i].FieldName;
Editors[i].OnKeyPress := AKeyPress;
Editors[i].OnKeyDown := AKeyDown;
نهاية؛
{زر إنشاء موافق}
OkButton := TButton.Create(Owner);
OkButton.Parent := FScrollBox;
OkButton.Left := Editors[n-1].Left;
OkButton.Top := Editors[n-1].Top + TextHeight;
OkButton.Caption := 'موافق';
OKButton.OnClick := FCclick;
نهاية؛
نهاية؛
المدمر TDBPanel.Destroy;
يبدأ
محررين مجانيين؛
التدمير الموروث؛
نهاية؛
وظيفة TDBPanel.Editor(Index: Integer): TDBComboBox;
يبدأ
إذا كان الفهرس < الطول (المحررون) فإن النتيجة: = المحررون [الفهرس]
النتيجة الأخرى: = لا شيء؛
نهاية؛
الإجراء TDBPanel.FreeEditors؛
فار
ط، ن: عدد صحيح؛
يبدأ
{يجب تحرير الذاكرة بالترتيب! يجب أن يتم ذلك بترتيب عكسي للخلق!
خاصة عندما تكون هناك علاقة بين الوالدين والطفل بين المكونات}
إذا OkButton< >nil ثم OkButton.Free؛
إذا كان المحررون< >لا شيء، فابدأ
ن := الطول(المحررين);
for i:=0 to n-1 do Editors[i].free;
المحررين := لا شيء؛
ن := الطول(التسميات);
for i:=0 to n-1 do Labels[i].Free;
التسميات := لا شيء؛
نهاية؛
إذا كان FScrollBox < >nil فابدأ
FScrollBox.Free;
FScrollBox := nil;
نهاية؛
نهاية؛
نهاية.