منذ أن تعلمت لغة دلفي في عام 1999، كنت مفتونًا بتطورها السريع، وكنت على اتصال بالبرمجة للتو، وكنت مهتمًا بشكل خاص بالتطوير البصري، والسبب هو أنه يمكن تنفيذها بشكل أسرع من لغة C. In في السنوات القليلة الماضية، من دلفي C/S إلى B/S ثلاثي الطبقات، قمت أيضًا بكتابة بعض البرامج، الكبيرة والصغيرة. أعتقد أن دلفي هذه تحتوي على هذه الوظائف فقط. مؤخرًا، حصلت على كتاب بعنوان "Com Essence Theory" ودرست كود مصدر VCL، فقط لأجد أنه قوي حقًا (لا أعرف ما هي الكلمات التي يجب استخدامها لوصفها) في الآونة الأخيرة، تمت مشاركة بعض الاختراقات هنا مع الجميع. من فضلك قل لي إذا كان هناك أي أخطاء.
بصراحة، تتضمن المكونات نوعين فقط من الأعضاء: الخصائص والأساليب (الطرق التي أتحدث عنها تشمل الأحداث)
وهي مقسمة إلى أربعة أجزاء:
خاص
محمي
عام
نشرت
سيتم تقديم معنى الأجزاء الأربعة المذكورة أعلاه في كتب التطوير البصري العامة، وهذه مجرد نظرة عامة مختصرة عن دلفي.
خاص: يتم وضع جميع الأعضاء الخاصين هنا ولا يمكن الوصول إليهم إلا من خلال أساليب الفصل الخاصة، وليس من خلال الفئات الفرعية، ويكونون شفافين بالنسبة للفئات الفرعية. ويمكن القول أيضًا أنه لا يمكن الوصول إليه إلا من خلال طرق الوحدة نفسها.
محمي: باستثناء أنه يمكن توريثه بواسطة فئات فرعية، والباقي هو نفسه خاص. لا يمكن الوصول إليها من قبل الغرباء.
public: عام، يمكن للمستخدمين استدعاء الخصائص والأساليب المعلنة هنا.
منشور: يظهر في شريط الخصائص الخاص ببيئة تطوير دلفي.
أولاً، لنقم بأبسط عملية تحكم، في أقل من خمس دقائق، ستفهم كيفية إنشاء المكونات الموجودة في لوحة مكونات دلفي.
جديد->جديد->المكون واضغط على Enter.
ثم حدد الفئة الأصلية التي تريد أن ترث منها في نوع Ancestor: وهنا نختار TComponent، وهو ما يعني وراثة جميع خصائص وأساليب TComponent.
اسم الفئة: أدخل اسم فئة المكون المراد إنشاؤه. (ندخل TShowText)
صفحة اللوحة: أي لوحة في دلفي سيتم تثبيت المكون عليها. (نختار العينات، يمكنك أيضًا إدخال اسم جديد)
لا أحتاج أن أقول ما يلي.
انقر فوق الزر "موافق"، وتقوم دلفي تلقائيًا بإنشاء عنصر تحكم أساسي موروث من TComponent. ويمكن أيضًا أن نفهم أننا قمنا بتطوير عنصر تحكم قوي مثل TComponent، ولكن هذا ليس ما نحتاج إليه.
وفيما يلي شرح لطرق القراءة والكتابة للمتغيرات الخاصة للمكون نفسه:
على سبيل المثال، كتبنا الفقرة القصيرة التالية:
خاص
FText: سلسلة؛
....
/*لا يُسمح للعالم الخارجي باستخدام المتغيرات الخاصة، فكيف يمكننا تشغيل متغير سلسلة FText هذا؟ */
نحتاج أيضًا إلى إضافة هذه الفقرة بعد النشر:
نص الخاصية: سلسلة قراءة FText كتابة FText؛
ما يعنيه هذا هنا هو أن خاصية النص هذه ستظهر في شريط خصائص delphiSDK. المستخدمون الذين يقومون بتعديل النص في شريط الخصائص هم في الواقع يعدلون متغير سلسلة FText. القراءة تعني أن المستخدم يقرأ خاصية النص ويقرأ بالفعل FText. الكتابة تعني بالطبع أن المستخدم يعين قيمة للنص ويخزنها في متغير سلسلة FText.
إذا قمت بحفظه في هذا الوقت وقمت بتثبيته في دلفي، فسيتم الانتهاء من مكوننا الأساسي. (يتم تقديم طريقة تثبيت المكونات في النهاية)
هاها، أليس الأمر بسيطا جدا؟ إنه مجرد أن مكوننا ليس له أي استخدام محدد.
لقد قدمنا للتو السمات هنا، والآن سنواصل إضافة وظائف لتقديم استخدام الأساليب.
نضيف ما يلي بعد العام:
إجراء ShowText();
ثم اضغط على Ctrl + Alt +C، يقوم النظام تلقائيًا بإضافة كود التنفيذ لبعض الطرق لك.
التالي نكتب:
الإجراء TShowText.ShowText();
يبدأ
ShowMessage(FText);
نهاية؛
كما ترون، يعرض ShowMessage أعلاه قيمة المتغير الخاص للفئة الآن يجب أن تفهم أنه لا يمكن الوصول إلى المتغيرات الخاصة إلا من خلال طريقة الفئة نفسها. هنا يجب عليك إضافة وحدة الحوار بعد الاستخدامات، لأن ShowMessage يتم تضمينه في وحدة الحوار، وإلا فلن يمر.
بالطبع، لا يمكن استخدام الأحداث المذكورة أعلاه إلا في عنصر التحكم ولا يمكن أن تظهر في شريط الأحداث في مربع الخاصية. لماذا؟ لأن الطريقة المعلنة هنا عامة فقط، وهي طريقة خالصة، ولم يتم الإعلان عنها كحدث.
من خلال الدراسة السابقة، هل تعرفت بالفعل على كيفية كتابة وضبط خصائص وطرق التحكم؟
ومع ذلك، فإن السيطرة الحقيقية لا يمكن فصلها عن الأحداث، ويجب أن يكون استدعاء الأحداث مدفوعًا بالرسائل، والتي سيتم تقديمها في مقالتي القادمة.
إن خصائص وأساليب التحكم القوي ليست بهذه السهولة، فهي تتطلب المزيد من الممارسة والمزيد من التطبيقات.
مرفق أدناه عنصر تحكم DBGridToExcel الذي كتبته، وتتمثل وظيفته في تصدير البيانات في DBGrid إلى Excel. يمكنك التعلم منه واستخدامه كمرجع. ويتضمن هذا التحكم استخدام الخصائص والأساليب و"الأحداث" التي سنتحدث عنها في المقال التالي.
الملحق 1: كيفية تثبيت عناصر التحكم ذاتية الصنع:
(1) في قائمة المكونات، حدد "تثبيت المكون...".
(2). انقر فوق "..." بعد اسم ملف الوحدة، وحدد ملف الوحدة الخاص بعنصر التحكم "*.pas"، ثم انقر فوق موافق. انقر فوق "تثبيت" في النافذة التي تظهر، واكتمل التثبيت.
يظهر عنصر التحكم المثبت حديثًا في اللوحة الخاصة بك.
المرفق 2: انسخ الكود المصدري بالكامل لعنصر التحكم TDBGridToExcel إلى "المفكرة" واحفظه كملف .pas.
وحدة DBGridToExcel؛
{****************************************************** ***** ***********************}
{* *}
{* تصدير الشبكة إلى عنصر تحكم Word VCL لـ D5 وD6 *}
{* حقوق الطبع والنشر (C) شيانغدينغ 2003.10.1 جميع الحقوق محفوظة *}
{* تقرير الأخطاء: [email protected] *}
{* المؤلف: الدب الصغير*}
{* *}
{****************************************************** ***** ***********************}
{* *}
{* هذه نسخة بسيطة *}
{* *}
{****************************************************** ***** ***********************}
{* *}
{* ثَبَّتَ: *}
{* يرجى الحفظ كملف GridToExcel.pas ثم فتح الملف *}
{* انقر فوق عنصر القائمة [المكون] --> [تثبيت المكون] *}
{* انقر فوق الزر [تثبيت] في مربع حوار تثبيت المكونات *}
{* بعد التثبيت، يمكنك العثور على عنصر التحكم في المكون *}
{* الصفحة [نموذج] *}
{* *}
{****************************************************** ***** ***********************}
{* *}
{* ثَبَّتَ: *}
{* احفظ المرفق، ثم افتح ملف GridToExcel.Pas باستخدام دلفي، *}
{* حدد قائمة دلفي-->المكون-->تثبيت المكون، *}
{* ثم حدد تثبيت. بعد التثبيت، في صفحة العينات بلوحة التحكم، *}
{* بعد أن تتعرف عليها، يمكنك محاولة تعيين بعض السمات المعقدة واستكشاف السمات الأخرى بنفسك، *}
{****************************************************** ***** ***********************}
واجهة
الاستخدامات
ويندوز، StdCtrls، ComCtrls، الرسائل، DBGrids، الرسومات، ExtCtrls،
النماذج، DB، ComObj، عناصر التحكم، SysUtils، الفئات؛
سلسلة الموارد
SPromptExport = 'الرجاء الانتظار، جارٍ تصدير البيانات...';
SConnectExcel = 'بدء تشغيل Excel، يرجى الانتظار...';
SConnectExcelError= 'فشل الاتصال ببرنامج Excel. ربما لم يتم تثبيت Excel ولا يمكن تصديره.';
SCancel = '&إلغاء';
خطأ = 'خطأ'؛
SConfirm = 'هل تريد حقًا إنهاء تصدير البيانات؟ ';
SCaption = 'تأكيد';
SGridError = 'لم يتم تحديد مجموعة بيانات، يرجى تحديد عنصر التحكم في مجموعة البيانات! ';
يكتب
TDBGridToExcel = فئة(TComponent)
خاص
نموذج التقدم: TForm؛
FShowProgress: Boolean;
ExcelApp: البديل؛
العنوان: سلسلة؛
إنهاء: منطقية؛
FOnProgress: TNotifyEvent;
FGrid: TDBGrid {شبكة المصدر}
شريط التقدم: شريط التقدم؛
موجه: TLabel؛
خروج تلقائي: منطقي؛
FAutoSize: منطقية؛
FDBGrid: TDBGrid;
الإجراء SetShowProgress(const Value: Boolean);
الإجراء CreateProgressForm؛
الإجراء ButtonClick(Sender: TObject);
الدالة ConnectToExcel: منطقية؛
الإجراء ExportDBGrid؛
{تصريحات خاصة}
محمي
{ التصريحات المحمية }
عام
إنشاء المُنشئ (AOwner: TComponent)؛
تجاوز المدمر () ؛
إجراء التصدير إلى Excel {تصدير الشبكة إلى Excel}
{التصريحات العامة}
نشرت
{ التصريحات المنشورة }
الخاصية DBGrid: TDBGrid يقرأ FDBGrid ويكتب FDBGrid؛
عنوان الخاصية: سلسلة قراءة FTitle كتابة FTitle؛
خاصية ShowProgress: قراءة منطقية FShowProgress كتابة SetShowProgress؛
خاصية OnProgress: قراءة TNotifyEvent FOnProgress وكتابة FOnProgress؛
نهاية؛
سجل الإجراء؛
تطبيق
سجل الإجراء؛
يبدأ
RegisterComponents('Samples', [TDBGridToExcel]);
نهاية؛
{TDBGridToExcel}
الإجراء TDBGridToExcel.ButtonClick(Sender: TObject);
يبدأ
إنهاء :=MessageBox(ProgressForm.Handle,pchar(SConfirm),pchar(SCaption),
MB_OKCANCEL + MB_ICONINFORMATION) = IDOK؛
نهاية؛
الدالة TDBGridToExcel.ConnectToExcel: منطقية؛
يبدأ
النتيجة :=صحيح؛
يحاول
ExcelApp := CreateOleObject('Excel.application');
ExcelApp.Visible := خطأ؛
إذا كان العنوان<>'' ثم ExcelApp.Caption := العنوان؛
ExcelApp.WorkBooks.Add؛
يستثني
messageBox(GetActiveWindow,PChar(SConnectExcelError),PChar(SError),Mb_OK+MB_IconError);
النتيجة := خطأ؛
نهاية؛
نهاية؛
منشئ TDBGridToExcel.Create(AOwner: TComponent);
يبدأ
موروث؛
FShowProgress:= صحيح {كانت القيمة الافتراضية هي إظهار التقدم}
FAutoExit := خطأ؛
FAutoSize := صحيح؛
نهاية؛
الإجراء TDBGridToExcel.CreateProgressForm؛
فار
لوحة: TPanel؛
الزر: زر؛
يبدأ
إذا تم تعيينه (ProgressForm) ثم اخرج {Aready Create؟}
ProgressForm := TForm.Create(Owner);
مع ProgressForm تفعل
يبدأ
اسم الخط := '宋体';
حجم الخط := 10;
BorderStyle := bsNone;
العرض := 280;
الارتفاع := 120;
عرض الحدود := 1;
اللون := clBackground;
الوظيفة := poOwnerFormCenter;
نهاية؛
اللوحة := TPanel.Create(ProgressForm);
باستخدام اللوحة، افعل { إنشاء لوحة }
يبدأ
الأصل := نموذج التقدم؛
Align := alClient;
BevelInner := bvNone;
BevelOuter := bvRaised;
التسمية التوضيحية := '';
نهاية؛
موجه: = TLabel.Create(Panel);
مع المطالبة، افعل {Create Label}
يبدأ
الأصل := اللوحة؛
اليسار := 20؛
الأعلى := 25؛
التسمية التوضيحية := SConnectExcel;
نهاية؛
ProgressBar := TProgressBar.Create(panel);
باستخدام شريط التقدم، افعل {إنشاء شريط التقدم}
يبدأ
الخطوة := 1؛
الأصل := اللوحة؛
سلس := صحيح؛
اليسار := 20؛
الأعلى := 50؛
الارتفاع := 18;
العرض := 260;
نهاية؛
الزر := TButton.Create(Panel);
باستخدام الزر، قم {إنشاء زر إلغاء}
يبدأ
الأصل := اللوحة؛
اليسار := 115؛
الأعلى := 80;
التسمية التوضيحية := SCancel؛
OnClick := ButtonClick;
نهاية؛
ProgressForm.Show;
util.ProgressForm.Update;
نهاية؛
المدمر TDBGridToExcel.Destroy;
يبدأ
موروث؛
نهاية؛
الإجراء TDBGridToExcel.ExportDBGrid؛
فار
البيانات: تداتاسيت؛
أدبغريد: تدبغريد؛
أنا، ي: عدد صحيح؛
النقطة الحالية: المؤشر؛
OldBeforeScroll, OldAfterScroll: TDataSetNotifyEvent;
يبدأ
Screen.Cursor := crHourGlass;
يحاول
يحاول
TForm(Owner).Enabled := False;
ExcelApp.DisplayAlerts := false;
ExcelApp.ScreenUpdating := false;
إنهاء := خطأ؛
إذا ShowProgress ثم Prompt.Caption := SPromptExport؛
ADBGrid := DBGrid;
البيانات := ADBGrid.DataSource.DataSet;
باستخدام ADBGrid، قم {إدراج رأس الجدول}
لأني := 1 إلى Columns.Count do
إذا كانت الأعمدة [i - 1].مرئية بعد ذلك
ExcelApp.Cells[1,i].Value:=Columns[i - 1].Title.Caption;
CurrentPoint := Data.GetBookmark {حفظ الموضع الحالي}
OldBeforeScroll := Data.BeforeScroll { احفظ القديم قبل مقبض حدث التمرير }
OldAfterScroll := Data.AfterScroll {حفظ مؤشر حدث AfterScroll القديم }
Data.DisableControls {تعطيل التحكم}؛
Data.BeforeScroll := nil;
Data.AfterScroll := nil;
إذا ShowProgress ثم ProgressBar.Max := Data.RecordCount;
أنا := 2;
Data.First;
في حين لا Data.Eof تفعل { معالجة كافة السجلات }
يبدأ
باستخدام ADBGrid، قم {بمعالجة سجل واحد}
لـ j := 1 إلى Columns.Count do
إذا كانت الأعمدة[j - 1].مرئية بعد ذلك
ExcelApp.Cells[i,j].Value:= Columns[j - 1].Field.DisplayText;
شركة (أنا)؛
Data.Next;
إذا تم تعيينه (FOnProgress) ثم FOnProgress (Self)؛
إذا كان ShowProgress ثم {تحديث واجهة مستخدم التقدم}
يبدأ
ProgressBar.StepIt;
Application.ProcessMessages;
إذا استقال ثم الخروج؛
نهاية؛
نهاية؛
يستثني
messageBox(GetActiveWindow,PChar(SConnectExcelError),Pchar(SError),MB_OK+MB_ICONERROR);
نهاية؛
ExcelApp.Visible := خطأ؛
TForm(Owner).Enabled := True;
Screen.Cursor := crDefault;
إذا كان ShowProgress ثم FreeAndNil(ProgressForm { نموذج التقدم المجاني })؛
ExcelApp.DisplayAlerts := صحيح؛
ExcelApp.ScreenUpdating := صحيح؛
أخيراً
Data.BeforeScroll := OldBeforeScroll { استعادة مؤشر الحدث القديم }
Data.AfterScroll := OldAfterScroll;
Data.GotoBookmark(CurrentPoint);
Data.FreeBookmark(CurrentPoint);
Data.EnableControls;
Screen.Cursor := crDefault;
نهاية؛
نهاية؛
الإجراء TDBGridToExcel.ExportToExcel؛
يبدأ
إذا DBGrid= لا شيء ثم قم برفع Exception.Create(SGridError); {لا يوجد مصدر بيانات، ثم خطأ}
إذا كان ShowProgress ثم CreateProgressForm {سواء كان إظهار التقدم أم لا}؛
إذا لم يكن ConnectToExcel ثم { الخروج عند حدوث خطأ }
يبدأ
إذا كان ShowProgress ثم FreeAndNil(ProgressForm {release form});
مخرج؛
نهاية؛
تصديرDBGrid {بدء تصدير البيانات}
نهاية؛
الإجراء TDBGridToExcel.SetShowProgress(قيمة ثابتة: منطقية);
يبدأ
FShowProgress := Value;
نهاية؛
نهاية.