Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Caio M S Mancini

Passar RadioGroup como parâmetro

Recommended Posts

Olá.

 

Fiz uma rotina para mostrar diversos RadioGroups de acordo com uma Query que fiz no banco.

Só que o caso é o seguinte. Preciso pegar o valor que está clicado em cada RadioGroup. Como são vários e todos criados dinamicamente eu não sei ao certo o nome.

 

A rotina que fiz para criar cada RadioGroup foi a seguinte:

 

Código:

 

//monta os RadioGroup com base nos fatores do teste
  while not ZQuery1.Eof do
  begin
	rdg:=TRadioGroup.Create(nil);
	rdg.Parent:=self;
	rdg.Visible:=false;
	rdg.Left:=8;
	rdg.Top:=200+y;
	rdg.Width:=849;
	rdg.Height:=81;
	rdg.Columns:=ZQuery1.FieldValues['qtd'];
	rdg.Name:='rg'+inttostr(ZQuery1.FieldValues['idfat']);
	rdg.Caption:=ZQuery1.FieldValues['desfat'];

	//seleciona o subfator do fator do teste do processo
	with ZQuery2 do
	begin
	  Close;
	  SQL.Clear;
	  SQL.Add('select s.idsubfator,s.dessub '+
		'from fator f,subfator s '+
		'where f.idfat=s.idfat '+
		'and s.idfat='+inttostr(ZQuery1.FieldValues['idfat'])+'');
	  Open;
	end;

	while not ZQuery2.eof do
	begin
	  rdg.Items.AddObject(ZQuery2.FieldValues['dessub'],TObject(strtoint(Zquery2.FieldValues['idsubfator'])));
	  ZQuery2.Next;
	end;

	rdg.Visible:=true;
	codigo:='rg'+inttostr(ZQuery1.FieldValues['idfat']);
	rdg.OnClick:=guardaClique(codigo);
	ZQuery1.Next;

	y:=y+90;
  end;

 

Então eu tenho uma procedure guardaClique que é assim:

 

Código:

 

procedure TfrmRegTes.guardaClique(codigo: TRadioGroup);
var
  id:integer;
begin
  id:=integer(TRadioGroup(codigo).Items.Objects[TRadioGroup(codigo).ItemIndex]);
  ShowMessage('Fui Clicado'+ inttostr(id));
end;

 

O problema está ocorrendo na passagem de parâmetro para a procedure guardaClique.

Como que eu faço para passar o RadioGroup em questão?

 

Espero ter conseguido explicar minha dúvida.

 

Obrigado pela ajuda de todos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Caio.

 

Voce está usando propriedades demais para pegar o índice do parâmetro passado que é o objeto TRadioGroup.

 

Basta voce apenas pegar o valor da propriedade ItemIndex, assim:

 

procedure TForm1.guardaClique(codigo: TRadioGroup);
var
  id:integer;
begin
  id:=integer(TRadioGroup(codigo).ItemIndex);
  ShowMessage('Fui Clicado'+ inttostr(id));
end;

A propriedade Items.Objects[indice do objeto] deverá ser usado em caso de voce passar ao parâmetro, um Array de TRadioGroup.

 

No seu caso, voce só está passando um objeto TRadioGroup.

 

Outro erro que observei no seu código e esse:

 

rdg.OnClick:=guardaClique(codigo);

Mas porque está gerando erro nesse código ? Simples voce definiu o escopo da procedure guardaClique(...) de modo errado, assim:

 

procedure TfrmRegTes.guardaClique(codigo: TRadioGroup);  // Parâmetro errado.
...
...


procedure TfrmRegTes.guardaClique(Sender: TObject);  // Parâmetro certo.
...

Repare que se voce quiser desviar um Evento qualquer de qualquer objeto, voce deve observar os tipos e os nomes de parâmetros que o mesmos recebem, voce pode até mudar o nome da procedure, entretanto o tipo e o nome dos parâmetros jamais poderão ser mudados.

 

Após fazer a correção, ai sim voce pode até usar o código rdg.OnClick:=guardaClique(codigo); pois o parâmetro Sender que é TObject (Mãe de todas as classes do Delphi), fará referência ao objeto codigo que é TRadioGroup, ai voce pode fazer o Casting TRadioGroup(Sender).ItemIndex, onde a sua procedure ficará assim:

 

procedure TForm1.guardaClique(Sender: TObject);
var
  id:integer;
begin
  id:=integer(TRadioGroup(Sender).ItemIndex);
  ShowMessage('Fui Clicado '+ inttostr(id));
end;

 

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.