propriedade Passe nome do componente onclick evento defina: Delphi 2009

votos
1

Eu tenho um componente personalizado do tipo TSpeedButton que tem duas propriedades extras definidos:

CommentHeading: string;
CommentText: string;

I set CommentHeading em tempo de design.

Quando o botão de velocidade é pressionado um memorando é mostrado com um botão abaixo dela para salvar seu conteúdo. O procedimento que lida com isso:

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 procedimento ViewComments si:

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 precisam ser atribuído à propriedade CommentText do speedbutton personalizado.

O que eu estava inicialmente pensando era que eu poderia passar o nome do componente a uma variável quando o costume speedbutton fica pressionado e, em seguida, recuperar esse nome quando o botão de gravar na nota é pressionada e usá-lo para atribuir o texto do memorando aos speedbuttons propriedade CommentText. Mas então eu percebi que para fazer isso eu teria que usar algum tipo de declaração case..of que verificado para cada nome speedbutton possível e, em seguida, atribuir o valor memorando para suas propriedades e isso só parece ridiculamente tedioso.

Existe uma maneira mais fácil atribuir o texto memorando à speedbutton que abriu o memo para começar?

Publicado 27/08/2009 em 00:59
fonte usuário
Em outras línguas...                            


3 respostas

votos
2

Em última análise, você está perguntando como dizer a ViewCommentsfunção de quais propriedades do botão que está trabalhando com.

Você entende o que o Senderparâmetro está fazendo no OnClickevento? Ele está dizendo a manipulador de eventos que o evento do objeto está sendo manipulado. Ele está servindo precisamente o papel que você está olhando para trazer para a ViewCommentsfunção.

Isso é o que Mason estava chegando em sua resposta. Em vez de passar todos os valores de propriedade, passar o objeto em si :

procedure ViewComments(CommentButton: TCustomSpeedButton);

Em seguida, chamá-lo 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, sem casedeclarações, há pesquisas.

Isso deve responder à sua pergunta, mas você pode fazê-lo ainda melhor. Lembre-se que eu disse antes sobre o Senderparâmetro? Quando alguém clica no primeiro botão, o Senderparâmetro do que OnClickmanipulador 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;

Hmm. Eles são o mesmo. Ter duas funções idênticas é um desperdício, por isso, se livrar de um e renomear o outro por isso não soa específicos de botão:

procedure TForm1.CommentButtonClick(Sender: TObject);
begin
  ViewComments(Sender as TCustomSpeedButton);
end;

Em seguida, defina as OnClickpropriedades de ambos os botões para se referir a esse manipulador de um evento. Você não pode fazer isso apenas clicando duas vezes a propriedade no Object Inspector. Você precisa digitar o nome do mesmo, escolha-a na lista drop-down, ou atribuir a propriedade de evento em tempo de execução:

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

Eu também gostaria de incentivá-lo a usar nomes mais significativos para seus controles. Isso Label15é particularmente notório. Como você pode lembrar que o XV rótulo é o que indica que a edição está em andamento? Chamá-lo EditInProgressLabel, por exemplo.

Respondeu 27/08/2009 em 07:24
fonte usuário

votos
2

Como você já está passando variáveis ​​extras ao redor, porque não basta passar a própria speedbutton? Então você não vai precisar de olhar para cima a referência.

Respondeu 27/08/2009 em 01:16
fonte usuário

votos
0

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.

Respondeu 27/08/2009 em 07:22
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more