1 votes

Delphi 2009 : Passer le nom du composant à l'événement onclick puis définir la propriété

J'ai un composant personnalisé de type TSpeedButton qui a deux propriétés supplémentaires définies :

CommentHeading: string;
CommentText: string;

J'ai défini CommentHeading au moment de la conception.

Lorsque vous appuyez sur le bouton de vitesse, un mémo s'affiche avec, en dessous, un bouton permettant de sauvegarder son contenu. La procédure qui gère cela :

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;

Et la procédure ViewComments elle-même :

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;

Le contenu du mémo doit être attribué à la propriété CommentText du SpeedButton personnalisé.

Ce que je pensais initialement, c'est que je pourrais passer le nom du composant à une variable lorsque le bouton rapide personnalisé est pressé et ensuite récupérer ce nom lorsque le bouton d'enregistrement du mémo est pressé et l'utiliser pour affecter le texte du mémo à la propriété CommentText du bouton rapide. Mais j'ai réalisé que pour faire cela, je devrais utiliser une sorte d'instruction cas..of qui vérifie chaque nom de SpeedButton possible et ensuite assigner la valeur du mémo à ses propriétés et cela semble ridiculement fastidieux.

Existe-t-il un moyen plus simple d'affecter le texte du mémo au bouton rapide qui a ouvert le mémo au départ ?

2voto

Mason Wheeler Points 52022

Puisque vous passez déjà des variables supplémentaires, pourquoi ne pas simplement passer le SpeedButton lui-même ? Ainsi, vous n'aurez pas besoin de chercher la référence.

2voto

Rob Kennedy Points 107381

En fin de compte, vous vous demandez comment dire au ViewComments les propriétés du bouton avec lesquelles elle travaille.

Comprenez-vous ce que le Sender fait dans le OnClick événement ? Il indique au gestionnaire d'événement quel événement d'objet est traité. Il joue précisément le rôle que vous cherchez à apporter à l'objet ViewComments fonction.

C'est ce à quoi Mason voulait en venir dans sa réponse. Plutôt que de passer toutes les valeurs de la propriété, passer l'objet lui-même :

procedure ViewComments(CommentButton: TCustomSpeedButton);

Appelez-le ensuite à partir des gestionnaires d'événements de tous vos boutons :

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

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

Pas d'attaches, pas case sans recherche.

Cela devrait répondre à votre question, mais vous pouvez faire encore mieux. Rappelez-vous ce que j'ai dit précédemment à propos de la Sender paramètre ? Lorsque quelqu'un clique sur le premier bouton, le Sender de ce paramètre OnClick Le gestionnaire d'événement sera le bouton, donc nous pouvons réécrire le premier gestionnaire d'événement comme ceci :

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

Et vous pouvez réécrire le deuxième gestionnaire d'événement comme ceci :

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

Hmm. Ils sont identiques. Avoir deux fonctions identiques est un gaspillage, alors débarrassez-vous de l'une et renommez l'autre pour qu'elle ne soit pas spécifique à un bouton :

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

Définissez ensuite le OnClick les propriétés de les deux pour faire référence à ce seul gestionnaire d'événements. Vous ne pouvez pas le faire en double-cliquant simplement sur la propriété dans l'inspecteur d'objets. Vous devez soit taper le nom vous-même, soit le choisir dans la liste déroulante, soit attribuer la propriété d'événement au moment de l'exécution :

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

J'aimerais également vous encourager à utiliser des noms plus significatifs pour vos contrôles. C'est Label15 est particulièrement flagrante. Comment pouvez-vous vous souvenir que le quinzième est celui qui indique que l'édition est en cours ? Appelez-le EditInProgressLabel par exemple.

0voto

Uwe Raabe Points 21302

Une petite modification de votre code devrait faire l'affaire :

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

et après avoir édité le commentaire :

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

Vous pouvez également mémoriser le bouton lui-même plutôt que son nom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X