Дельфи 2009:Передайте имя компонента при событии onclick, затем установите свойство
-
20-09-2019 - |
Вопрос
У меня есть пользовательский компонент типа 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;
Вы также можете запомнить саму кнопку, а не только ее название.