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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top