2009-08-26 2 views
1

У меня есть пользовательский компонент типа TSpeedButton, который имеет два дополнительных свойства, определенный:Delphi 2009: Pass имя компонента OnClick событие затем установить свойство

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, а затем извлекает это имя, когда нажата кнопка сохранения в записке, и используйте ее для назначения текстового примечания speedcuttons Свойство CommentText. Но потом я понял, что для этого мне придется использовать какой-то случай ... утверждение, которое проверяет каждое возможное имя скоростной кнопки, а затем присваивает значение memo своим свойствам, и это просто кажется нелепо утомительным.

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

ответ

2

В конечном счете, вы спрашиваете, как сообщить функции 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?Когда кто-то нажимает на первую кнопку, параметр этого OnClick обработчика Sender будет кнопка, так что мы можем переписать первый обработчик событий, как это:

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 свойство обоего кнопок для обозначения этого обработчика событий один , Вы не можете этого сделать, просто дважды щелкнув свойство в Object Inspector. Вам необходимо либо печатать имя самостоятельно, выберите его из выпадающего списка, или назначить свойство события во время выполнения:

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

Я также хотел бы призвать вас использовать более осмысленные имена ваши органы управления. То, что Label15 особенно вопиющее. Как вы помните, что метка пятнадцатая - это та, которая указывает, что редактирование выполняется? Назовите это EditInProgressLabel, например.

+0

Роб, ты Дельфий БОГ !!! Это именно то, что я искал! И Мейсон, если вы читаете это, я приношу свои извинения за то, что вы не понимаете, что вы имеете в виду в первый раз, но я только что взял Delphi снова в течение последнего месяца после того, как был вдали от него с 2002 года, поэтому я все еще пытаюсь запомнить все концепции, трюки и т. д. Роб, оцените вашу заметку о наименовании этикеток - этот ярлык был просто быстро взломан, чтобы показать пользователю, что они действительно находятся в режиме редактирования. Перед выпуском компиляции я всегда настраиваю метки и т. Д., Чтобы отразить их фактическое использование. – Rafe

2

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

+0

Это все еще задает вопрос о том, как указать кнопку «Сохранить», которая SpeedButton открыла записку, не используя аргумент case..of? Я стараюсь избегать любых огромных поисков, потому что в форме будут сотни этих кнопок комментариев. – Rafe

+1

Я не совсем понимаю, в чем проблема. Свяжите одну ссылку SpeedButton с каждым комментарием, и когда вы откроете комментарий, дайте ссылку на кнопку, которая ее открыла. Затем, когда вы сохраняете, какая бы ссылка у вас была, это кнопка для ее возврата. Поиск не требуется. –

0

Небольшое изменение кода следует сделать трюк:

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; 

Вы можете также запоминают саму кнопку, а не только его имя.

+0

Просто хотел добавить, что это на самом деле вторая часть решения! Обрезка нескольких событий onclick с использованием кода Роба выше была частью проблемы, но сохранение комментариев было другой половиной проблемы, и с небольшим ворчанием этот код делает трюк! Спасибо Уве! – Rafe