Delphi 2009: передать имя компонента событию onclick, затем установить свойство - PullRequest
1 голос
/ 27 августа 2009

У меня есть пользовательский компонент типа TSpeedButton, для которого определены два дополнительных свойства:

CommentHeading: string;
CommentText: string;

Я установил CommentHeading во время разработки.

При нажатии кнопки скорости отображается заметка с кнопкой под ней для сохранения ее содержимого. Процедура, которая обрабатывает это:

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;

И сама процедура ViewComments:

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;

Содержимое заметки необходимо назначить свойству CommentText пользовательского SpeedButton.

Сначала я думал, что я могу передать имя компонента переменной, когда нажата пользовательская кнопка SpeedButton, а затем извлечь это имя, когда нажата кнопка сохранения в заметке, и использовать его для назначения текста заметки для быстрых кнопок. Свойство CommentText. Но потом я понял, что для этого мне нужно использовать какое-то утверждение case..of, которое проверяет каждое возможное имя спидбаттона, а затем присваивает значение memo его свойствам, и это просто кажется до смешного утомительным.

Существует ли более простой способ присвоения текста заметки той быстродействующей кнопке, с которой она открывалась?

Ответы [ 3 ]

2 голосов
/ 27 августа 2009

В конечном итоге вы спрашиваете, как сообщить функции 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, например.

2 голосов
/ 27 августа 2009

Поскольку вы уже передаете дополнительные переменные, почему бы просто не передать сам SpeedButton? Тогда вам не нужно искать ссылку.

0 голосов
/ 27 августа 2009

Небольшое изменение в вашем коде должно помочь:

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;

Вы также можете запомнить саму кнопку вместо ее названия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...