Componente em Tempo de Execução (Contar/Gravar)

Delphi

02/12/2003

Olá.
Vejam o meu problema: criei um form em tempo de execução, neste, montei uma rotina para adicionar CheckBox de acordo com a quantidade de campos da tabela.
Até ae, tudo bem...
vejam o código :

var I : SmallInt;
Esquerda, Topo, Linha : Integer;
MyCheckBox : TCheckBox;
begin
Esquerda := 1;
Topo := 1;
Linha := 1;
for I := 0 to DMod.TbCliente.FieldCount - 1 do
begin
MyCheckBox := TCheckBox.Create(Self.Owner);
MyCheckBox.Name := ´MyCh´ + IntToStr(I);
MyCheckBox.Caption := DMod.TbCliente.Fields[I].DisplayName;
MyCheckBox.Parent := Self;
MyCheckBox.Left := Esquerda;
MyCheckBox.Top := Topo + Linha * 15 - 14;
MyCheckBox.Width := 180;
MyCheckBox.Font.Color:= clWhite;

Inc(Linha);

if MyCheckBox.Top > (Self.Height - 65) then
begin
Inc(Esquerda, 150);
Topo := 1;
Linha := 1;
end;

end;
end;

Agora, eu gostaria de gravar os CheckBox que foram marcados (checked).
montei a rotina :

var F : TextFile;
I : Smallint;
begin
AssignFile (F, ´c:\teste.txt´ );
Rewrite(F);

for I := 0 to ComponentCount - 1 do
begin
if Components[I] is TCheckBox then
if TCheckBox(Components[I]).Checked then
begin
Write(F, TCheckBox(Components[I]).Caption);
WriteLn(F);
end;
end;
CloseFile(F);
Close;
end;


*** Não funciona.

Descobri o porque, mas não sei como resolver. Fazendo testes, descobri que se criar componentes em tempo de execução, como foi o caso, a propriedade ´ComponentsCount´ não os reconhece.

Alguém pode ajudar à solucionar este problema ?

Grato
Cleber
ICQ : 85616758. :roll:


Pedih

Pedih

Curtidas 0

Respostas

Beppe

Beppe

02/12/2003

Quando você instância um componente, você passa no construtor a referência que será o possuidor(Owner) deste componente. Se você usar Self.Owner, o possuidor será o mesmo possuidor do form e não o form.
Como você está acessando Components do form, ele não contém a instância do seu objeto, já que os mesmos estão em Self.Owner.Components[].

Para solucionar, passe apenas Self no construtor.


GOSTEI 0
Pedih

Pedih

02/12/2003

Obrigado Ataliba.

Funcionou perfeitamente. Muito grato pela atenção.


o que é uma linha de código eim :
TCheckBox.Create(Self) em vez de TCheckBox.Create(Self.Owner);

=== que coisa.

Obrigado, valeu mesmo. :lol:


GOSTEI 0
Igor

Igor

02/12/2003


Para solucionar, passe apenas Self no construtor.


2 décadas depois estou eu aqui agradecendo por esta resposta! kkkkk
Parece bobeira, mas passei um dia todo tentando resolver um acess violation que estava acontecendo e o motivo era que o owner do componente não estava sendo referenciado corretamente!
GOSTEI 0
Igor

Igor

02/12/2003

Para solucionar, passe apenas Self no construtor.



2 décadas depois estou eu aqui agradecendo por esta resposta! kkkkk
Parece bobeira, mas passei um dia todo tentando resolver um acess violation que estava acontecendo e o motivo era que o owner do componente não estava sendo referenciado corretamente!
GOSTEI 0
POSTAR