تمديد إجراء Delphi Teditcopy لنسخ عناصر القائمة إلى الحافظة

StackOverflow https://stackoverflow.com/questions/2652322

  •  27-09-2019
  •  | 
  •  

سؤال

لدي نموذج مع معظم وظائفه التي تم تنفيذها باستخدام التوتر القياسي. لدي قائمة ، شريط أدوات ، وبعض 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: تحديد الإجراءات المخصصة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top