تمديد إجراء Delphi Teditcopy لنسخ عناصر القائمة إلى الحافظة
سؤال
لدي نموذج مع معظم وظائفه التي تم تنفيذها باستخدام التوتر القياسي. لدي قائمة ، شريط أدوات ، وبعض tobuttons. لقد قمت بتطبيق نسخة/لصق الحافظة بدون رمز على الإطلاق ، فقط باستخدام إجراءات teditcopy و teditpaste. إنه يعمل بشكل مثالي في صناديق TEDIT و TMEMO التي لدي.
الآن ، أريدها أن تعمل مع Tlistbox أيضًا. على وجه التحديد ، أود أن أتمكن من نسخ عنصر القائمة المحددة في صندوق Tlistbox باستخدام نفس menuitems واختصارات الأدوات الرئيسية.
لذلك ، أعتقد أنني سأحتاج إلى تمديد عمل teditcopy. لكن هذا لا يبدو مستقيمًا جدًا إلى الأمام. على وجه الخصوص ، يتحقق teditacte من التحكم المركّز ليكون عنصر تحكم tcustomedit ، وهو ما لا يتجه إليه. أنا خائف قليلاً من أنه سيكون الكثير من العمل.
البديل الواضح هو نسيان الإجراءات القياسية وتنفيذ النسخة إلى ClipBard في طريقة Onexecute لتوليد عام.
ولكن ، قبل الاستسلام ، هل لديك فكرة أو تلميح أو خدعة من شأنها أن تساعدني في توسيع نطاق عمل Teditcopy القياسي؟
المحلول
يجب عليك إما تجاوز معالجات الأحداث لتوليد أو إنشاء سليل جديد يجمع بين الكود من teditaction/teditcopy مع معالجة إضافية لـ tlistbox.
تتمثل نقطة التمديد للإجراءات في تعيين معالجات الأحداث Onexecute/Onupdate ، ولن تعمل هنا لأنها ستعطيل معالجة TEDIT الحالية. يمكنك النزول من teditcopy وتجاوز الأساليب ، ولكن من المحتمل أن يكون هذا الكود مثل فئة جديدة تنحدر مباشرة من عملية التجول. قد يكون هناك بعض الاختراقات الأخرى ذات المستوى المنخفض من شأنها أن تنجح ، لكنني لا أراها ، وحتى لو كان هناك ، من المضمون أن تكون أقل قابلية للصيانة من النهج الموثق.
نصائح أخرى
هنا هو الاختراق الذي خرجت للتنفيذ.
لا يتطلب الأمر تغيير قائمة الإجراءات أو Menuitems و Toolbuttons يدويًا ، لأنني أحتفظ بـ نفس الاسم teditcopy للفئة.
type
TEditCopy = class(StdActns.TEditCopy)
public
function HandlesTarget(Target: TObject): Boolean; override;
procedure ExecuteTarget(Target: TObject); override;
procedure UpdateTarget(Target: TObject); override;
end;
يمتد إجراءات teditcopy القياسية مع الوظيفة المطلوبة لدعم tlistbox أيضًا.
function TEditCopy.HandlesTarget(Target: TObject): Boolean;
begin
result:=(inherited handlesTarget(Target)) or (target is TListbox);
end;
procedure TEditCopy.ExecuteTarget(Target: TObject);
begin
if (target is TListBox) and (TListBox(Target).ItemIndex<>-1) then
clipboard.AsText:=TListBox(Target).Items[TListBox(Target).ItemIndex]
else
inherited;
end;
procedure TEditCopy.UpdateTarget(Target: TObject);
begin
if target is TListbox then
Enabled := true
else
inherited;
end;
بقية التطبيق لم يتغير. لا يزال يتم تنفيذ جميع وظائف النسخ/لصق بدون رمز على الإطلاق.
أتذكر أنني قرأت شيئًا على الويب حول هذا الموضوع ، لكن لا يمكنني العثور على الرابط مرة أخرى. إذا وجدت ذلك مرة أخرى ، فسوف أخبرك عن ذلك بدقة أكثر.
ما أتذكره ، على الرغم من ذلك ، هو أن الإجراء يتحقق من أنه يمكن تطبيقه (أو لا) على هدف معين باستخدام طريقة "tbasiAction.handlestarget" - وهي افتراضية. يجب عليك التحقق من كيفية استخدام الأساليب "HandlestArget" و "UpdatetArget" و "Executetarget" (جميع أعضاء Tbasicaction) عند تنفيذ إجراء.
مرة أخرى ، المزيد عن هذا إذا وجدت الرابط مرة أخرى.
يحرر
لم يكن هذا هو المنشور الذي كنت أبحث عنه ، لكن يبدو أنه يصف بالضبط ما تريد:etutorials: تحديد الإجراءات المخصصة