Ir para conteúdo

POWERED BY:

Arquivado

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

Shuster

[Resolvido] Instanciar Objeto em Run-time

Recommended Posts

Fiz um loop pra pegar a informação de 100 checkbox's do meu formulário são muitos né, em vez de colocar todos os checkbox's no scriipt, decidi fazer o seguinte:

 

procedure TfrmLotomania.NovoConcurso;

var campo, sSQL :String;

Objeto :TCheckBox;

valor, i :Integer;

begin

while not valor <= 100 do

begin

Objeto.Create(Self);

Objeto.name := 'ck' + valor;

if ( Objeto.checked = True) then

begin

i := i + 1;

campo := 'Bola' + FloatToStr(i);

if (i <= 20)then

begin

sSQL := 'UPDATE resultados SET (' + campo + '=' + FloatToStr(valor) + ') ' +

'WHERE Concurso = ' + concurso;

{dm é o meu data module do projeto onde está o cmd meu command button}

dm.cmd.CommandText := sSQL;

dm.cmd.Execute;

end

end;

valor := valor +1;

frmPrincipal.ProgressBar.Position := i * 5;

end;

end;

 

Ta rodando o loop numa boa, o problema é que como o "Objeto" não é o mesmo que eu criei em tempo de projeto, ele cria um novo checkbox e não referência um já criadono meu form, q é o que eu preciso. Cara agradeço desde já à atenção. Os objetos do meu formulário são vários checkbox's os nomes são padronizados assim: 'ck1', 'ck2', 'ck3'...

 

Espero ser ajudado e agradeço muito à atenção...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz um loop pra pegar a informação de 100 checkbox's do meu formulário são muitos né, em vez de colocar todos os checkbox's no scriipt, decidi fazer o seguinte:

 

procedure TfrmLotomania.NovoConcurso;

var campo, sSQL :String;

Objeto :TCheckBox;

valor, i :Integer;

begin

while not valor <= 100 do

begin

Objeto.Create(Self);

Objeto.name := 'ck' + valor;

if ( Objeto.checked = True) then

begin

i := i + 1;

campo := 'Bola' + FloatToStr(i);

if (i <= 20)then

begin

sSQL := 'UPDATE resultados SET (' + campo + '=' + FloatToStr(valor) + ') ' +

'WHERE Concurso = ' + concurso;

{dm é o meu data module do projeto onde está o cmd meu command button}

dm.cmd.CommandText := sSQL;

dm.cmd.Execute;

end

end;

valor := valor +1;

frmPrincipal.ProgressBar.Position := i * 5;

end;

end;

 

Ta rodando o loop numa boa, o problema é que como o "Objeto" não é o mesmo que eu criei em tempo de projeto, ele cria um novo checkbox e não referência um já criadono meu form, q é o que eu preciso. Cara agradeço desde já à atenção. Os objetos do meu formulário são vários checkbox's os nomes são padronizados assim: 'ck1', 'ck2', 'ck3'...

 

Espero ser ajudado e agradeço muito à atenção...

você pode percorrer seus check box assim no form : // esse código percorre o form verificando os checkbox

 

for Contador := 0 to ComponentCount - 1 do

if Components[ Contador ].ClassType = TCheckBox then

begin

with TCheckBox( Components[ Contador ] ) do

begin

// aqui você poe o fonte que desejar

end;

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara valew a força, mais continua do mesmo jeito, no if o TCheckBox(Components).Checked é sempre false independente do que eu marque nos meus checkbox's.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi no seu fonte o porque disto:

while not valor <= 100 do
begin
Objeto.Create(Self);
Objeto.name := 'ck' + valor;
if ( Objeto.checked = True) then
Qual seria a finalidade ? Ele logo depois faz um UPDATE, no caso cria o CheckBox e faz o UPDATE, o update não deveria de acontece somente em um outro momento ?

Se quiser criar ele e já marcar teria somente de passar:

Objeto.Checked:=True;
E a validação:

if ( Objeto.checked = True) then
Não funciona, visto que por padrão quando cria o CheckBox ele vem desmarcado...

 

Não entendi no seu fonte o porque disto:

while not valor <= 100 do
begin
Objeto.Create(Self);
Objeto.name := 'ck' + valor;
if ( Objeto.checked = True) then
Qual seria a finalidade ? Ele logo depois faz um UPDATE, no caso cria o CheckBox e faz o UPDATE, o update não deveria de acontece somente em um outro momento ?

Se quiser criar ele e já marcar teria somente de passar:

Objeto.Checked:=True;
E a validação:

if ( Objeto.checked = True) then
Não funciona, visto que por padrão quando cria o CheckBox ele vem desmarcado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

procedure TfrmLotomania.NovoConcurso;

var campo, concurso, data, sSQL, name, teste :String;

Objeto :TCheckBox;

valor, i, nr_campo :Integer;

chk :Boolean;

begin

concurso := txtConcurso.Text;

data := QuotedStr(FormatDateTime('dd/mm/yyyy',dtSorteio.Date));

valor := 0;

sSQL := 'INSERT INTO resultados (Concurso, DataSorteio) VALUES ' +

'('+concurso+', '+data+')';

dm.cmd.CommandText := sSQL;

dm.cmd.Execute;

//i := 1;

for i := 5 to 105 do

if Components.ClassType = TCheckBox then

begin

chk := TCheckBox(Components).Checked;

if (chk = false) then

begin

valor := i - 4;

if (valor < 20) then

begin

campo := 'Bola' + FloatToStr(valor);

sSQL := 'UPDATE resultados SET ' + campo + '=' + FloatToStr(valor) +

' WHERE Concurso = ' + concurso;

dm.cmd.CommandText := sSQL;

dm.cmd.Execute;

end;

end;

end;

end;

 

Meu código está desse jeito agora e mesmo assim não está efetuando o UPDATE dos campos marcados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... primeiramente, sempre que for colocar algum código fonte use a tag CODE...

Alterando um pouco o seu fonte:

 

procedure TForm1.NovoConcurso;
var
	campo, concurso, data, sSQL: String;
	valor, i: Integer;
begin
concurso:=txtConcurso.Text;
data:=QuotedStr(FormatDateTime('dd/mm/yyyy',dtSorteio.Date));
sSQL:='INSERT INTO resultados (Concurso, DataSorteio) VALUES ' + '(' + concurso + ', ' + data + ')';
dm.cmd.CommandText:=sSQL;
dm.cmd.Execute;
for i:=5 to self.ComponentCount - 1 do
	begin
	if self.Components[i].ClassType = TCheckBox then
		begin
		if (not TCheckBox(self.Components[i]).Checked) then
			begin
			valor:=i - 4;
			if (valor < 20) then
				begin
				campo:='Bola' + FloatToStr(valor);
				sSQL:='UPDATE resultados SET ' + campo + '=' + FloatToStr(valor) + ' WHERE Concurso = ' + concurso;
				dm.cmd.CommandText:=sSQL;
				dm.cmd.Execute;
				end;
			end;
		end;
	end;
end;

Onde estiver Self. troque pelo objeto onde estão inseridos os TCheckBox, ou seja, se eles estiverem dentro de um TPanel deve de ir no nome do TPanel no lugar do Self, caso esteja diretamente no form, pode deixar como esta, caso a função esta criada em um local fora do form onde estão os TCheckBox, deve de ir o nome do form no lugar do Self.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal consegui colocar o meu loop pra funcionar numa boa, só q ele ta inserindo em decrescente, dos objetos de taborder > para os objetos de taborder <. Mas ta beleza. Muito obrigado pela força galera.

 

var
	campo, concurso, data, sSQL, valor: String;
	Bola, i: Integer;
begin
 concurso := txtConcurso.Text;
 data	 :=QuotedStr(FormatDateTime('dd/mm/yyyy',dtSorteio.Date));
 sSQL	 :='INSERT INTO resultados (Concurso, DataSorteio) VALUES ' + '(' + concurso + ', ' + data + ')';
 dm.cmd.CommandText := sSQL;
 dm.cmd.Execute;
 Bola := 1;
 for i:= 1 to 100 do
  begin
   if self.Components[i].ClassType = TCheckBox then
	 begin
	  if (TCheckBox(self.Components[i]).Checked = True) then
		begin
		 valor := TCheckBox(self.Components[i]).Caption;
		  if (Bola < 21) then
			 begin
			  campo:='Bola' + FloatToStr(Bola);
			  sSQL:='UPDATE resultados SET ' + campo + '=' + valor + ' WHERE Concurso = ' + concurso;
			  dm.cmd.CommandText:=sSQL;
			  dm.cmd.Execute;
			  Bola := Bola +1;
			 end
		  else
			begin
				Application.MessageBox('Você marcou mais de 20 números!','Erro na quantidade de números',MB_OK + MB_ICONERROR);
				exit;
			end;
		end;
	 end;
  end;

end;

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.