محرر مكونات وخصائص دلفي
(1) المقدمة
ستستخدم هذه المقالة مثالاً لوصف تطوير المكونات ومحرر الخصائص.
المثال (TdsWaitDialogEx) هو مكون مرئي يعرض مربع حوار بعد استدعاء طريقة العرض الخاصة به.
وهو يحتوي على TAnimate ورسالتين سريعتين (أي TLabel) وشريط التقدم (TGauge).
خصائص التعداد: DialogStyle، AViposition
خصائص السجل: الخيارات
يرث كائن مجموعة الخصائص من TPersistent. في هذا المثال، تحتوي مجموعة خصائص AVISource على TAnimate
خصائص الرسوم المتحركة CommonAVI، اسم الملف
يتم تطبيق محرر الخصائص باستخدام خاصية FileName الخاصة بـ AVISource، أي أن String FileName ينبثق عند التحرير.
TOpenDialog، عامل التصفية الخاص به هو *.avi
(2) حزمة المكونات dsDlgPack.dpk
لتسهيل النشر والتثبيت وما إلى ذلك، يجب استخدام حزمة المكونات .dpk.
في الإصدارات بعد Delphi6 (لا أعرف شيئًا عن الإصدارات قبل D5)، هناك العديد من الملفات التي لم تقم دلفي بإصدارها، مثل PROxies.
إذا تم استخدام هذه الملفات عند تثبيت أحد المكونات، فيمكنك تجاوز هذه الملفات واستخدام الحزمة التي تحتوي عليها.
في هذا المثال، يستخدم محرر الخصائص ملف DesignEditors، وملف Proxies مطلوب في DesignEditors، لذلك يتم نشر هذا المكون
تحتوي الحزمة (.dpk) على برنامج designide، الذي يحل مشكلة عدم وجود الوكلاء، وبذلك يتم تثبيت المكون بنجاح.
حزمة dsDlgPack؛
...
يتطلب
رتل,
في سي إل,
فكلسمب،
ديزاينيد؛
يتضمن
dsDlgWaitEx في 'dsDlgWaitEx.pas' {DlgWaitEx}،
dsDlgWaitExReg في 'dsDlgWaitExReg.pas'؛
نهاية.
(3) ملف تسجيل المكون dsDlgWaitExReg.pas
سؤال: لماذا نحتاج إلى استخدام مثل هذا الملف في كثير من الأحيان للأسباب التالية:
إذا تم دمج التعليمات البرمجية الموجودة في dsDlgWaitExReg.pas في dsDlgWaitEx.pas، على الرغم من تضمين designide في dsDlgPack.dpk
تم حل مشكلة عدم وجود الوكلاء عند تثبيت المكون، لكن مشكلة عدم وجود الوكلاء لا تزال تحدث عندما يستدعي التطبيق هذا المكون.
نظرًا لأن ملفات الوكلاء مطلوبة في DesignEditors، يتم تشكيل الكود التالي في ملف منفصل، ويقوم التطبيق باستدعاء هذه المجموعة
لا يحتاج الملف إلى استخدام dsDlgWaitExReg.pas ويمكنه تجاوز الوكلاء دون أي مشكلة.
وحدة dsDlgWaitExReg؛
واجهة
يستخدم الفئات، ومربعات الحوار، والنماذج، وdsDlgWaitEx، وDesignIntf، وDesignEditors؛
يكتب
TdsAVIFileNameProperty = class(TSTringProperty) // يستخدم محرر الخصائص ملف DesignEditors
عام
وظيفة GetAttributes:TPropertyAttributes;override;
تحرير الإجراء؛ تجاوز؛ // تجاوز الطريقة
نهاية؛
سجل الإجراء؛
تطبيق
سجل الإجراء؛
يبدأ
// قم بتسجيل هذا المكون في صفحة مكون Delisoft
RegisterComponents('Delisoft', [TdsWaitDialogEx]);
// سجل محرر الخاصية هذا
RegisterPropertyEditor(TypeInfo(string), TdsAVISource, 'FileName', TdsAVIFileNameProperty);
نهاية؛
{تدسافيفيليناميبروبيرتي}
الدالة TdsAVIFileNameProperty.GetAttributes:TPropertyAttributes;
يبدأ
النتيجة:=[paDialog];
نهاية؛
الإجراء TdsAVIFileNameProperty.Edit؛
يبدأ
مع TOpenDialog.Create (التطبيق) القيام به
يحاول
عامل التصفية:='ملفات AVI(*.avi)|*.avi|All Files(*.*)|*.*';
إذا تم التنفيذ ثم SetStrValue(FileName);
أخيراً
حر؛
نهاية؛
نهاية؛
نهاية.
(4) ملف المكون dsDlgWaitEx.pas
وحدة dsDlgWaitEx؛
{حدد جميع خصائص وأساليب هذا المكون؛ ومن بينها خاصية BorderStyle للنموذج TDlgWaitEx هي bsDialog. في هذا المثال، يستخدم المكون TdsDlgWaitEx النموذج TDlgWaitEx؛ ويستخدم كائن الخاصية AVISource TdsAVISource، والذي تم توريثه مباشرة من TPersistent. يتم استخدام خصائص التعداد (DialogStyle، AVIPosition) وخصائص السجل (Options)، وما إلى ذلك.
}
واجهة
الاستخدامات
النوافذ، الرسائل، SysUtils، المتغيرات، الفئات، الرسومات، عناصر التحكم، النماذج،
مربعات الحوار، StdCtrls، أجهزة القياس، ComCtrls؛
يكتب
TDialogStyle = (dlgNormal, dlgStayOnTop);
TAVIPosition = (aviLeft, aviTop, aviBottom);
TDlgOptions = مجموعة من (showAVI,showCaption,showMessage1,showMessage2,showProgress,ShowProgressText);
TDlgWaitEx = فئة(TForm)
Animate1: TAnimate؛
مقياس 1: مقياس تي جي؛
التسمية 1: TLabel؛
التسمية 2: TLabel؛
الإجراء FormClose(Sender: TObject; var Action: TCloseAction);
خاص
FCloseAfter: DWord؛
FUserFormClose: TCloseEvent;
عام
الخاصية UserFormClose: TCloseEvent يقرأ FUserFormClose ويكتب FUserFormClose؛
خاصية CloseAfter: قراءة DWORD FCloseAfter كتابة FCloseAfter؛
نهاية؛
TdsAVISource = فئة (TPersistent)
خاص
FCommonAVI: TCommonAVI;
اسم الملف: سلسلة؛
الإجراء SetCommonAVI(const Value: TCommonAVI);
الإجراء SetFileName(قيمة const: سلسلة);
محمي
عام
نشرت
الخاصية CommonAVI: قراءة TCommonAVI FCommonAVI كتابة SetCommonAVI الافتراضي aviNone؛
اسم الملف الخاصية: قراءة السلسلة FfileName والكتابة SetFileName؛
نهاية؛
TdsWaitDialogEx=class(TComponent)
خاص
//استمارة
FDlgForm:TDlgWaitEx;
FMessage1: سلسلة؛
FMessage2: سلسلة؛
FMessage1Font:TFont;
FMessage2Font:TFont;
FCaption: سلسلة؛
FDislogStyle:TDialogStyle;
FwordWrap:boolean;
FOptions:TDlgOptions;
FShowMessage1,FShowMessage2:boolean;
//AVI
FaviPosition: TAVIPosition؛
FAviActive:boolean;
FshowAVI:boolean;
FAVISource: TdsAVISource;
//تقدم
FProgressMax:integer;
FProgressMin:integer;
FProgressPos:integer;
FProgressStep:integer;
FShowProgress: Boolean;
FShowProgressText: Boolean;
//حدث
FOnPosChange: TNotifyEvent;
FOnShow: TNotifyEvent;
FOnFormHide: TCloseEvent;
الإجراء SetProgressMax(قيمة ثابتة: عدد صحيح);
الإجراء SetProgressMin(const Value: integer);
الإجراء SetProgressPos(قيمة ثابتة: عدد صحيح);
الإجراء SetProgressStep(const Value: integer);
نموذج رسم الإجراء؛
الدالة setLableHeight(sCaption:string):integer;
الإجراء setOptions(const value:TDlgOptions);
الإجراء setMessage1(قيمة ثابتة:سلسلة);
الإجراء setMessage2(قيمة ثابتة:سلسلة);
الإجراء setCaption(قيمة const:سلسلة);
الإجراء SetMessage1Font(قيمة ثابتة:TFont);
الإجراء SetMessage2Font(قيمة ثابتة:TFont);
الدالة IsMessage1FontStored: منطقية؛
الوظيفة IsMessage2FontStored: منطقية؛
مجموعة الإجراءاتAVIPosition(const Value: TAVIPosition);
الإجراء SetAVISource(const Value: TdsAVISource);
الإجراء SetOnFormHide(const Value: TCloseEvent);
محمي
الإجراء DoPosChange الظاهري؛
الإجراء DoShow الظاهري؛
عام
إنشاء المنشئ (AOwner: TComponent)؛
تدمير المدمرة؛
عرض نموذج الإجراء؛
إخفاء نموذج الإجراء؛
تحديث نموذج الإجراء؛
الإجراء ProgressStepIt;
نشرت
//استمارة
خاصية الرسالة 1: قراءة سلسلة FMessage1 وكتابة setMessage1 ؛
خاصية الرسالة 2: قراءة سلسلة FMessage2 وكتابة setMessage2 ؛
خاصية message1Font: TFont قراءة FMessage1Font كتابة SetMessage1Font المخزنة IsMessage1FontStored؛
الخاصية message2Font: قراءة TFont FMessage2Font وكتابة SetMessage2Font المخزنة في IsMessage2FontStored؛
التسمية التوضيحية للخاصية: قراءة السلسلة FCaption والكتابة setCaption؛
خاصية DislogStyle: TDialogStyle قراءة FDislogStyle كتابة FDislogStyle؛
خاصية wordWrap: قراءة منطقية FwordWrap كتابة FwordWrap؛
خيارات الخاصية: قراءة TDlgOptions FOptions، كتابة setOptions؛
//AVI
خاصية AviActive: قراءة منطقية FAviActive كتابة FAviActive؛
خاصية AviPosition: قراءة TAVIPosition FaviPosition كتابة setAVIPosition؛
خاصية AviSource: TdsAVISource قراءة FAVISource كتابة SetAVISource؛
//تقدم
خاصية ProgressMax: قراءة عدد صحيح FProgressMax إرسال SetProgressMax؛
خاصية ProgressMin: قراءة عدد صحيح FProgressMin، كتابة SetProgressMin؛
خاصية ProgressPos: قراءة عدد صحيح FProgressPos إرسال SetProgressPos؛
خاصية ProgressStep: عدد صحيح يقرأ FProgressStep يكتب SetProgressStep؛
//حدث
خاصية OnPosChange: قراءة TNotifyEvent FOnPosChange وكتابة FOnPosChange؛
خاصية OnShow: قراءة TNotifyEvent FOnShow وكتابة FOnShow؛
خاصية OnHide: قراءة TCloseEvent FOnFormHide وكتابة SetOnFormHide؛
نهاية؛
تطبيق
{$R *.DFM}
{تدسافيسورس}
الإجراء TdsAVISource.SetCommonAVI(const Value: TCommonAVI);
يبدأ
إذا كانت القيمة = FCommonAVI ثم قم بالخروج؛
FCommonAVI := Value;
اسم الملف:='';
نهاية؛
الإجراء TdsAVISource.SetFileName(قيمة ثابتة: سلسلة);
يبدأ
إذا كانت القيمة = FfileName ثم قم بالخروج؛
FfileName:=value;
FCommonAVI:=aviNone;
نهاية؛
{تدسوايتديالوجيكس}
الإجراء TdsWaitDialogEx.DoShow؛
يبدأ
إذا تم تعيينه (FOnShow) ثم FOnShow (Self)؛
نهاية؛
الإجراء TdsWaitDialogEx.DoPosChange؛
يبدأ
إذا تم تعيينه (FOnPosChange) ثم FOnPosChange (Self)؛
نهاية؛
الإجراء TdsWaitDialogEx.SetAVISource(قيمة ثابتة: TdsAVISource);
يبدأ
إذا FAVISource=value ثم اخرج؛
FAVISource.Assign(Value);
إذا (FAVISource.FFileName='')و(FAVISource.FCommonAVI=aviNone) ثم FshowAVI:=false;
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
FDlgForm.Animate1.Active:=false;
FDlgForm.Animate1.FileName := '';
FDlgForm.Animate1.CommonAVI := aviNone;
إذا FshowAVI بعد ذلك
يبدأ
إذا FAVISource.FfileName = '' ثم
FDlgForm.Animate1.CommonAVI := FAVISource.FCommonAVI
آخر
FDlgForm.Animate1.FileName := FAVISource.FfileName;
FDlgForm.Animate1.Active:=true;
نهاية؛
DrawForm; //Animate1->بعد تغيير AVI، قد يتغير حجم Animate1 ==> DrawForm
FDlgForm.Update;
نهاية؛
نهاية؛
الدالة TdsWaitDialogEx.IsMessage1FontStored: منطقية؛
يبدأ
مع FMessage1Font القيام به
النتيجة :=
(الاسم <> 'MS Sans Serif') أو
(النمط <> []) أو
(الحجم <> 8) أو
(اللون <> clWindowText) أو
(مجموعة الأحرف <> DEFAULT_CHARSET) أو
(درجة الصوت <> fpDefault)؛
نهاية؛
الدالة TdsWaitDialogEx.IsMessage2FontStored: منطقية؛
يبدأ
مع FMessage2Font القيام به
النتيجة :=
(الاسم <> 'MS Sans Serif') أو
(النمط <> []) أو
(الحجم <> 8) أو
(اللون <> clWindowText) أو
(مجموعة الأحرف <> DEFAULT_CHARSET) أو
(درجة الصوت <> fpDefault)؛
نهاية؛
الإجراء TdsWaitDialogEx.SetMessage1Font(قيمة ثابتة: TFont);
يبدأ
FMessage1Font.Assign(Value);
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
FDlgForm.Label1.Font.Assign(Value);
FDlgForm.Update;
نهاية؛
نهاية؛
الإجراء TdsWaitDialogEx.SetMessage2Font(قيمة ثابتة: TFont);
يبدأ
FMessage2Font.Assign(Value);
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
FDlgForm.Label2.Font.Assign(Value);
FDlgForm.Update;
نهاية؛
نهاية؛
الإجراء TdsWaitDialogEx.setCaption(قيمة ثابتة:سلسلة);
يبدأ
إذا كانت القيمة = FCaption ثم قم بالخروج؛
FCaption:=value;
إذا لم يكن الأمر كذلك (showCaption في FOptions) إذن
يبدأ
FCaption:='';
مخرج؛
نهاية؛
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
FDlgForm.Caption := value;
FDlgForm.update;
نهاية؛
نهاية؛
الإجراء TdsWaitDialogEx.setMessage1(قيمة ثابتة:سلسلة);
فار ط:عدد صحيح؛
يبدأ
إذا كانت القيمة = FMessage1 ثم الخروج؛
FMessage1:=value;
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
إذا لم يكن الأمر كذلك (showMessage1 في FOptions) ثم قم بالخروج؛
FDlgForm.Label1.Caption := value;
i:=setLableHeight(FMessage1)+13;
إذا كنت <>FDlgForm.Label1.Height ثم DrawForm؛
FDlgForm.update;
نهاية؛
نهاية؛
الإجراء TdsWaitDialogEx.setMessage2(قيمة ثابتة:سلسلة);
فار ط:عدد صحيح؛
يبدأ
إذا كانت القيمة = FMessage2 ثم الخروج؛
FMessage2:=value;
إذا تم تعيينه (FDlgForm) بعد ذلك
يبدأ
إذا لم يكن الأمر كذلك (showMessage2 في FOptions)، فقم بالخروج؛
FDlgForm.Label2.Caption := value;
i:=setLableHeight(FMessage2)+13;
إذا كنت <>FDlgForm.Label2.Height ثم DrawForm؛
FDlgForm.update;
نهاية؛
نهاية؛