for em componentes diferentes, para gravar em uma tabela.

Delphi

12/10/2005

Boa Noite,

Mais uma vez estou com problemas

Tenho a seguinte situação.
Preciso fazer um for, em todos os componentes do meu form, os componentes que estão visiveis eu preciso gravar em uma tabela os valores deles.
TDateTimePicker1 EdtValor1 EdtObs1
TDateTimePicker2 EdtValor2 EdtObs2
TDateTimePicker3 EdtValor3 EdtObs3
TDateTimePicker4 EdtValor4 EdtObs4
... etc


O Problema é que os componetes são de classes diferentes, e preciso inserir um por um na base.

      for i:=0 to Self.ComponentCount -1 do
        begin
          if Self.Components[i].ClassType = TEdit then
            begin
              if (Self.Components[i] as TEdit).Visible then
                begin
                  Close;
                  SQL.Clear;
                  *SQL PARA INSERIR*
                          
                  ParamByName(´edtvalor´).AsString:= (Self.Components[i] as TEdit).Text;
                  ParamByName(´edtobs´).AsString:= (Self.Components[i] as TEdit).Text;
                end;
            end;
        end;

O Código acima é só um teste, acompanhando com break, da para perceber que o edtvalor, e o edtobs recebem sempre os mesmos valores.
Tirando esse problema não sei se é possível fazer isso com um componente TDateTimePicker junto.

:?


Lynx

Lynx

Curtidas 0

Respostas

Rjun

Rjun

12/10/2005

Todos os componentes visuais herdam de TControl. Acho que você poderia fazer algo assim:

for i:=0 to Self.ComponentCount -1 do 
begin 
  if (Self.Components[i] as TControl).Visible then 
  begin 
     Close; 
     SQL.Clear;                           
     ParamByName(´edtvalor´).AsString:= (Self.Components[i] as TControl).Text; 
     ParamByName(´edtobs´).AsString:= (Self.Components[i] as TControl).Text; 
   end; 
end; 



GOSTEI 0
Lynx

Lynx

12/10/2005

Com TControl, não funciona o .text


GOSTEI 0
Davicarrano

Davicarrano

12/10/2005

cara, a propriedade Text do Edit é implementada pela classe TCustomEdit que é ancestral do Edit, mas não é ancestral do TDateTimePicker....
ou seja, um component do tipo TDateTimePicker não possui essa propriedade Text.... Ele possui uma propriedade Date que não é do tipo string como a propriedade Text, ou seja armazena data mesmo, do tipo TDate...

entao eu sugiro que você faça assim...

for i:=0 to Self.ComponentCount -1 do
begin
if Self.Components[i].ClassType = TEdit then
begin
if TEdit(Self.Components[i]).Visible then
begin
Close;
SQL.Clear;
*SQL PARA INSERIR*

ParamByName(´edtvalor´).AsString:= TEdit(Self.Components[i]).Text;
ParamByName(´edtobs´).AsString:= TEdit(Self.Components[i]).Text;
end;
end;

if Self.Components[i].ClassType = TDateTimePicker then
begin
if TDateTimePicker(Self.Components[i]).Visible then
begin
Close;
SQL.Clear;
*SQL PARA INSERIR*

ParamByName(´edtvalor´).AsString:= Datetostr(TDateTimePicker(Self.Components[i]).Date);
ParamByName(´edtobs´).AsString:= DatetoStr(TDateTimePicker(Self.Components[i]).Date);
end;
end;

end;


se der certo manda a resposta....
espero ter ajudado....
um abraço...


GOSTEI 0
Massuda

Massuda

12/10/2005

...
  ParamByName(´edtvalor´).AsString:= (Self.Components[i] as TEdit).Text;
  ParamByName(´edtobs´).AsString:= (Self.Components[i] as TEdit).Text;
...
...da para perceber que o edtvalor, e o edtobs recebem sempre os mesmos valores....
O seu código está atribuindo o mesmo valor aos parâmetros. Acho que o que você queria é que o valor de um determinado Edit fosse para um determinado parâmetro; nesse caso, você precisa ter algo que relacione o Edit com o parâmetro mas, uma vez tendo isso, me parece que não faz muito sentido fazer o loop na lista de componentes do form.


GOSTEI 0
Lynx

Lynx

12/10/2005

na verdade eu poderia controlar tudo, sem fazer um for nos componentes.
Mas controlando tudo vou precisar digitar o comando SQL várias vezes.


ous seja:

TDateTimePicker1 edtValor1 edtObs1
TDateTimePicke2 edtValor2 edtObs2
etc...


poderia verificar se não está em branco os componentes acima, e colocar o comando sql para inserir.


O Problema disso que preciso repetir o comando sql para cada linha, de componentes visiveis em meu form


GOSTEI 0
Massuda

Massuda

12/10/2005

Eu não entendi onde encaixa na estória o TDateTimePicker, mas acho que você poderia fazer algo assim...
type
  TMeuGrupo = record
    DTPicker: TDateTimePicker;
    EditValor: TEdit;
    EditObs: TEdit;
  end;

....

const
  MeuGrupo: array[1..4] of TMeuGrupo = (
    (DTPicker: TDateTimePicker1; EditValor: EdtValor1; EditObs: EdtObs1), 
    ...
    (DTPicker: TDateTimePicker4; EditValor: EdtValor4; EditObs: EdtObs4)
  );

...
  for I := Low(MeuGrupo) to High(MeuGrupo) do begin

    if MeuGrupo[I].EditValor.Visible
      and MeuGrupo[I].EditObs.Visible then begin

      SuaQuery.Close; 
      SuaQuery.SQL.Clear;
      SuaQuery.SQL.Add(...)

      SuaQuery.ParamByName(´edtvalor´).AsString:= MeuGrupo[I].EditValor.Text; 
      SuaQuery.ParamByName(´edtobs´).AsString:= MeuGrupo[I].EditObs.Text; 

      ...
    end;      
  end;



GOSTEI 0
Lynx

Lynx

12/10/2005

Valeu Massuda, é isso ai mesmo.
Eu não estava conseguindo fazer o TDateTimePicker, ficar junto com os edit´s na hora de inserir.

Agora que você postou esse exemplo com array, já vou conseguir me virar
Obrigado mesmo :)


GOSTEI 0
POSTAR