Дельфи 2009:Передайте имя компонента при событии onclick, затем установите свойство

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

Вопрос

У меня есть пользовательский компонент типа 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 ее свойствам, и это кажется смехотворно утомительным.

Есть ли более простой способ назначить текст заметки быстрой кнопке, которая открыла заметку?

Это было полезно?

Решение

В конечном счете, вы спрашиваете, как сказать 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