Ir para conteúdo

POWERED BY:

Arquivado

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

Jerfs

Referir a lista criada dinamicamente

Recommended Posts

Galera, o problema agora é complicado, não vejo saída, vou tentar explicar mas é difícil até de explicar... rs

 

Tenho um componente PageControl, nele estou criando dinamicamente um CheckListBox e atribuindo as propriedades normalmente. Bom até aí tudo bem, meu problema é: O usuário checa vários items desse checkListBox. Como eu consigo me referir ao ChecklistBox (que foi criado dinamicamente) para gravar os items checados!?

Compartilhar este post


Link para o post
Compartilhar em outros sites

ten faze o seguinte, declara um contador 'i', o ck é cheklistbox rsrs eita nome longo....

 

for i:=0 to ck.Items.Count-1 do begin

if(ck.Checked) then

showmessage('checado Item'+inttostr(i));

end;

 

pra grava.... ae os campo q você tem no bd tem q faze uma conversão, lol é pouco bds tem o tipo boolean;

 

if(ck.item.checked=true)then

campo:='verdadeiro'

else

campo:='falso';

 

espero tenha ajudado

:)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ae shini, seguinte, isso ae até é de boa... o meu problema é, quando o usuário seleciona um assunto, abre-se um ck (como você definiu) que é criado dinamicamente dentro de uma página no pagecontrol, isso que dizer que, se o usuário selecionar 10 assuntos, vão ser criados 10 páginas dentro do pagecontrol e em cada página terei um ck. eu nomeei cada ck (criado dinamicamente) com o nome do assunto que foi clicado previamente, por exemplo, quando o usuário clica no assunto "portas", abrirá uma página dentro do pagecontrol com o nome "portas" na aba, e dinamicamente será criado um CK com o nome de "portas_sub". e assim sucessivamente (falei que era complicado rs)... Quando o usuário clicar no botão SALVAR, será "varrido" desde a primeira página do pageControl até a última, para cada página criarei uma string quer terá o nome da página concatenado com cada item separado por ';'. Bom acho que consegui explicar mais a fundo não é!? será!? rsrs

 

tenta me ajudar pode favor! Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

teu problema seria, saber qtas paginas estão aberta, e quais items estão selecionados? rsrs to meio perdido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, o problema agora é complicado, não vejo saída, vou tentar explicar mas é difícil até de explicar... rs

 

Tenho um componente PageControl, nele estou criando dinamicamente um CheckListBox e atribuindo as propriedades normalmente. Bom até aí tudo bem, meu problema é: O usuário checa vários items desse checkListBox. Como eu consigo me referir ao ChecklistBox (que foi criado dinamicamente) para gravar os items checados!?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou tentar ser mais direto: eu quero uma forma de converter uma string para um componente, por exemplo, eu tenho uma string que é exatamente o nome do componente e quero usar essa string para poder fazer o seguinte:

 

<valor da string>.items.string[<valor da string>.itemIndex];

 

quero que essa string se comporte como um componente! agora acho que vai! rs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite a todos.

 

Vamos lá Jerfs, mais uma vez tentar te ajudar.

 

Para voce fazer com que uma string se comporte como um componente, obviamente que voce quer trabalhar com o nome do componente, assim sendo voce pode utilizar o método FindComponent('Nomedocomponente'), implementado na classe TComponent. Dependendo de onde voce vai utilizar esse método por exemplo, se for dentro de um Form onde a classe TForm herda indiretamente de TComponent, então TForm também herda esse método, só que ele vai localizar os componentes contidos no Form, se voce utilizar assim: Application.FindComponent('NomedoForm'), esse método só localizará os objetos contidos no objeto Application que são os Forms.

 

Vamos ao que interessa, ou seja, o código:

 

Vamos implementar o que voce deseja, por exemplo, em um método qualquer:

 

procedure TForm1.AchaCheckList(NomeChkLst: String);
  var Comp: TComponent;
	Indice: Integer;
  begin
	 Comp := FindComponent(NomeChkLst);
	 if Comp is TCheckListBox then begin
			for Indice := 0 to Pred(TCheckListBox(Comp).Count) do
				 if TCheckListBox(Comp).Checked[Indice] then
					ShowMessage(TCheckListBox(Comp).String[Indice]);
	 end;
  end;

Espero que isso resolva.

 

Um abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Jerfs.

 

Existe sim, uma restrição que é na hora de voce fazer o Casting.

 

Mas o que é o Casting (TypeCast).

 

É exatamente a converção de um tipo de objeto para outro tipo de objeto que herda do primeiro.

 

Como assim ?

 

Quando declaramos a variável assim: var Comp: TComponent;, como TComponent é digamos assim o pai da maioria dos componentes do Delphi, ou seja, a maioria dos componentes do Delphi herdam de TComponent, então voce pode fazer referência de qualquer classe TLabel, TListBox, TEdit e etc a essa variável que é do tipo TComponent.

 

Exemplo:

 

var Comp: TComponent;
		Lbl: TLabel;
		Edt: TEdit;
  begin
		Lbl := TLabel.Create(Self);
		Edt := TEdit.Create(Self);
		....
		Comp := Lbl;
		....
		Comp := Edt;
  end;

Bom, eu disse que voce pode fazer referência conforme o mostrado acima, entretanto esse código não converte a variável Comp para o tipo de objeto referênciado que são ora o TLabel (Lbl), ora TEdit (Edt), assim sendo, somente com a variável (Instancia) Comp, nós não conseguimos acessar todos os métodos do objeto referência. Exemplo: Suponhamos que queremos ter acesso ao método Caption do TLabel Lbl com a variável Comp:

 

var Comp: TComponent;
		Lbl: TLabel;
		Edt: TEdit;
  begin
		Lbl := TLabel.Create(Self);
		Edt := TEdit.Create(Self);
		
		Comp := Lbl;

		Comp.Caption := 'Meu Label'; // Não compila

		TLabel(Comp).Caption := 'Meu Label'; // Assim compila

  end;

Repare que eu fiz um Casting (Conversão) na última linha de instrução, e este Casting também pode ser feito desta maneira:

 

(Comp as TLabel).Caption := 'Meu Label'; // Assim também compila

Entretanto, devo te orientar que se voce fizer referencia a variável (Instância) Comp a um objeto TEdit e tentar fazer o Casting (Conversão) a um objeto TLabel, o seu programa gerará uma exceção (Erro), assim:

 

var Comp: TComponent;
		Lbl: TLabel;
		Edt: TEdit;
  begin
		Lbl := TLabel.Create(Self);
		Edt := TEdit.Create(Self);
		
		Comp := Edt;

		TLabel(Comp).Caption := 'Meu Label'; // Gera Erro pois Comp faz referência a Edt que é TEdit

  end;

Para evitar isso existe os operadores da RTTI (Run Time Type Information - Informação do Tipo em Tempo de Execução), esses operadores são dois, que são eles:

 

1º) AS: O as já foi informado acima: (Comp as TLabel).Caption, e este operado faz o Casting (Conversão), tal qual o procedimento TLabel(Comp).

 

2º) IS: Este operador verifica qual o objeto filho, a variável (Instância pai) está se referindo), o exemplo deste eu dei na primeira dica, assim:

 

var Comp: TComponent;
		Lbl: TLabel;
		Edt: TEdit;
  begin
		Lbl := TLabel.Create(Self);
		Edt := TEdit.Create(Self);
		
		Comp := Edt;
		 
		if Comp is TLabel then
		   TLabel(Comp).Caption := 'Meu Label';
		
		  { Aqui ele faz a verficação se Comp é TLabel, como não é, Comp é Edt (TEdit),
			 ele ignora a linha  e não gera a execeção (Erro) } 

  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.