Delfos 2009:Passe o evento onclick do nome do componente e defina a propriedade
-
20-09-2019 - |
Pergunta
Eu tenho um componente personalizado do tipo TSpeedButton que possui duas propriedades extras definidas:
CommentHeading: string;
CommentText: string;
Eu configurei CommentHeading em tempo de design.
Quando o botão de velocidade é pressionado, um memorando é mostrado com um botão abaixo para salvar seu conteúdo.O procedimento que trata disso:
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;
E o próprio procedimento 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;
O conteúdo do memorando precisa ser atribuído à propriedade CommentText do SpeedButton personalizado.
O que eu estava pensando inicialmente era que eu poderia passar o nome do componente para uma variável quando o SpeedButton personalizado fosse pressionado e, em seguida, recuperar esse nome quando o botão salvar no memorando fosse pressionado e usá-lo para atribuir o texto do memorando à propriedade CommentText dos speedbuttons.Mas então percebi que para fazer isso eu teria que usar algum tipo de instrução case..of que verificasse cada nome possível de speedbutton e depois atribuísse o valor memo às suas propriedades e isso parece ridiculamente tedioso.
Existe uma maneira mais fácil de atribuir o texto do memorando ao botão rápido que abriu o memorando para começar?
Solução
Em última análise, você está perguntando como contar o ViewComments
função com quais propriedades do botão está funcionando.
Você entende o que o Sender
O parâmetro está fazendo no OnClick
evento? Está dizendo ao manipulador de eventos qual evento do objeto está sendo tratado. Está cumprindo precisamente o papel que você deseja trazer para o ViewComments
função.
É isso que Mason estava chegando em sua resposta. Em vez de passar todos os valores da propriedade, passe o próprio objeto:
procedure ViewComments(CommentButton: TCustomSpeedButton);
Em seguida, chame de manipuladores de eventos de todos os seus botões:
procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
ViewComments(CustomSpeedButton1);
end;
procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
ViewComments(CustomSpeedButton2);
end;
Sem cordas, não case
declarações, sem pesquisa.
Isso deve responder à sua pergunta, mas você pode fazer isso ainda melhor. Lembre -se do que eu disse antes sobre o Sender
parâmetro? Quando alguém clica no primeiro botão, o Sender
Parâmetro disso OnClick
O manipulador será o botão, para que possamos reescrever o primeiro manipulador de eventos como este:
procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
begin
ViewComments(Sender as TCustomSpeedButton);
end;
E você pode reescrever o segundo manipulador de eventos como este:
procedure TForm1.CustomSpeedButton2Click(Sender: TObject);
begin
ViewComments(Sender as TCustomSpeedButton);
end;
Hum. Eles são iguais. Ter duas funções idênticas é um desperdício, então se livre de uma e renomeie a outra para que não pareça específica do botão:
procedure TForm1.CommentButtonClick(Sender: TObject);
begin
ViewComments(Sender as TCustomSpeedButton);
end;
Em seguida, defina o OnClick
propriedades de Ambas botões para se referir a esse manipulador de evento. Você não pode fazer isso apenas clicando duas vezes na propriedade no inspetor de objeto. Você precisará digitar o nome, escolha-o na lista suspensa ou atribuir a propriedade do evento no horário de execução:
CustomSpeedButton1.OnClick := CommentButtonClick;
CustomSpeedButton2.OnClick := CommentButtonClick;
Eu também gostaria de encorajá -lo a usar nomes mais significativos para seus controles. Este Label15
é particularmente flagrante. Como você pode se lembrar que o décimo quinto Rótulo é aquele que indica que a edição está em andamento? Chame-o EditInProgressLabel
, por exemplo.
Outras dicas
Já que você já está passando variáveis extras, por que não passar o próprio SpeedButton?Então você não precisará procurar a referência.
Uma pequena alteração no seu código deve fazer o truque:
procedure TForm1.CustomSpeedButton1Click(Sender: TObject);
var
btn: TCustomSpeedButton;
begin
btn := Sender as TCustomSpeedButton;
Receiver := btn.Name;
ViewComments(btn.CommentTitle, btn.CommentText);
end;
E depois de editar o comentário:
procedure TForm1.StoreComments(comment: string);
var
btn: TCustomSpeedButton;
begin
btn := FindComponent(Receiver) as TCustomSpeedButton;
btn.CommentText := comment;
end;
Você também pode memorizar o próprio botão, em vez de apenas o nome.