سؤال

لدي مكون مخصص من النوع TSPEEDBUTTON يحتوي على خصائصا إضافية محددة:

CommentHeading: string;
CommentText: string;

أنا وضعت تعليق في وقت التصميم.

عند الضغط على زر السرعة، يتم عرض مذكرة مع زر تحتها لإنقاذ محتوياته. الإجراء الذي يعالج هذا:

procedure CustomSpeedButton1Click(Sender: TObject);
begin
   Receiver := CustomSpeedButton1.Name; // possibly used to save the memo text back to this speedbuttons property after comments are submitted
   ViewComments(CustomSpeedButton1.CommentTitle,CustomSpeedButton1.CommentText);
end;

وإجراءات الإجازات نفسها:

procedure ViewComments(comment_caption:string; comment_text:string);
begin
  label15.Hide; // label showing editing in progress, hidden until user begins typing
  Button1.Enabled     := false; // the button for saving the memo text, hidden until user begins typing
  CommentsBox.Visible := true; // pop up the comment box at the bottom of the form
  CommentsBox.Caption := 'Comments: ' + comment_caption;
  CommentsMemo.Text   := comment_text; // if there are existing comments assign them to memo
end;

يجب تعيين محتويات المذكرة إلى ملكية التعليقات الخاصة ب SPEEDBUTTON مخصص.

ما كنت أفكر في البداية أنه يمكنني تمرير اسم المكون إلى متغير عند الضغط على SpeedButton المخصص ثم استرداد هذا الاسم عند الضغط على زر الحفظ في المذكرة واستخدامه لتعيين نص المذكرة إلى خاصية SPEEDBUTTONS تعليق. ولكن بعد ذلك أدركت أنه للقيام بذلك، يجب أن أقوم باستخدام نوع من الأحرف .. في العبارة التي تم فحصها لكل اسم SpeedButton محتمل ثم قم بتعيين قيمة المذكرة خصائصها وهذا يبدو مملا للسخرية.

هل هناك طريقة أسهل لتعيين نص المذكرة إلى SpeedButton التي فتحت المذكرة لتبدأ؟

هل كانت مفيدة؟

المحلول

في النهاية، أنت تسأل كيف تخبر ViewComments وظيفة ما هي خصائص الزر التي تعمل معها.

هل تفهم ما Sender المعلمة تفعل في OnClick حدث؟ يخبر معالج الأحداث التي يتم التعامل معها حدث الكائن. يخدم بدقة الدور الذي تبحث عنه إلى ViewComments وظيفة.

هذا ما كان ميسون يحصل عليه في إجابته. بدلا من اجتياز كل قيم العقار، تمر الكائن نفسه:

procedure ViewComments(CommentButton: TCustomSpeedButton);

ثم اتصل به من جميع معالجات أحداث الأزرار الخاصة بك:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton1);
end;

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(CustomSpeedButton2);
end;

لا سلاسل، لا case البيانات، لا عمليات بحث.

يجب أن يجيب على سؤالك، ولكن يمكنك القيام بذلك بشكل أفضل. تذكر ما قلته قبل عن Sender معامل؟ عندما ينقر شخص ما على الزر الأول، Sender معلمة ذلك OnClick سوف يكون المعالج هو الزر، حتى نتمكن من إعادة كتابة معالج الأحداث الأول مثل هذا:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

ويمكنك إعادة كتابة معالج الأحداث الثاني مثل هذا:

procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

همم. انهم نفس الشيء. وجود وظيفتين متطابقتين مهدرين، لذا تخلص من واحدة وإعادة تسمية الآخر لذلك لا يصدر صوت زر:

procedure TForm1.CommentButtonClick(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

ثم تعيين OnClick خصائص على حد سواء أزرار للإشارة إلى معالج حدث واحد. لا يمكنك القيام بذلك فقط عن طريق النقر المزدوج فوق العقار في مفتش الكائنات. ستحتاج إما إلى كتابة اسم نفسك، واخترها من القائمة المنسدلة، أو تعيين خاصية الحدث في وقت التشغيل:

CustomSpeedButton1.OnClick := CommentButtonClick;
CustomSpeedButton2.OnClick := CommentButtonClick;

أود أيضا أن أشجعك على استخدام أسماء أكثر هجوما لعناصر التحكم الخاصة بك. الذي - التي Label15 فظيعة خاصة. كيف يمكنك أن تتذكر أن الخامس عشر التسمية هي تلك التي تشير إلى أن التحرير قيد التقدم؟ نسميها EditInProgressLabel, ، على سبيل المثال.

نصائح أخرى

نظرا لأنك تمر بالفعل بمتغيرات إضافية حولها، فلماذا لا تمر فقط SpeedButton نفسه؟ ثم لن تحتاج إلى البحث عن المرجع.

التغيير الصغير في التعليمات البرمجية يجب أن تفعل الخدعة:

procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
var
  btn: TCustomSpeedButton;
begin
   btn := Sender as TCustomSpeedButton;
   Receiver := btn.Name; 
   ViewComments(btn.CommentTitle, btn.CommentText);
end;

وبعد تحرير التعليق:

procedure TForm1.StoreComments(comment: string);
var
  btn: TCustomSpeedButton;
begin
  btn := FindComponent(Receiver) as TCustomSpeedButton;
  btn.CommentText := comment;
end;

يمكنك أيضا حفظ الزر نفسه بدلا من اسمه فقط.

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