Fórum Qual a melhor maneira de fazer isso ? #339343
26/03/2007
0
Estou desenvolvendo um classe, sendo que segue abaixo um pequeno fragmento sobre o qual farei minha pergunta.
Vou ter que utilizar informações ´constantes´ para processamentos diversos, para isso crie:
´TRecTabela´ do tipo record e atribui a ´FTabelas´ uma array.
Para inicializar os dados dessa array criei a procedure ´InicializaTabelas´ que é disparada no ´constructor´
Minha pergunta:
Levando em conta que os dados são constantes, qual seria uma outra maneira de fazer isso, talvez de maneira mais elegante ou mais POO ?
ou tá bom assim mesmo ?
Um pequeno exemplo já basta.
Obrigado.
...
type
TRecTabela = record
Tabela: string[30];
Conteudo: string[254];
Descricao: string[254];
end;
TClassModel = class(TObject)
private
FTabelas: array of TRecTabela;
procedure InicializaTabelas(pTabela, pConteudo, pDescricao: string);
public
constructor Create(AOwner: TObject);
end;
implementation
constructor TClassModel.Create(AOwner: TObject);
begin
inherited Create;
InicializaTabelas(´A´, ´B´, ´C´);
InicializaTabelas(´A´, ´H´, ´C´);
InicializaTabelas(´A´, ´2´, ´C´);
InicializaTabelas(´X´, ´Y´, ´Z´);
InicializaTabelas(´X´, ´Z´, ´Z´);
end;
procedure TClassModel.InicializaTabelas(pTabela, pConteudo, pDescricao: string);
begin
SetLength(FTabelas, Length(FTabelas) + 1);
with FTabelas[High(FTabelas)] do begin
Tabela := pTabela;
Conteudo := pConteudo;
Descricao := pDescricao;
end;
end;
...
Newpaulo
Curtir tópico
+ 0Posts
27/03/2007
Marco Salles
Da maneira como fora definido tem visibilidade somente na mesma unit.. e nesse ponto que se aplica melhor os conceitos de encapsulamento.
Porém talves seja interresante melhorar um pouco o seu código , pois a procedure InicializaTabelas(pTabela, pConteudo, pDescricao: string);
tal como Fora por voce mesmo definido:
[b:ff9bc5cbf5]não tem sentido existir fora do escopo do constructor[/b:ff9bc5cbf5]
assim;
implementation
constructor TClassModel.Create; procedure TClassModel.InicializaTabelas(pTabela, pConteudo, pDescricao: string); begin SetLength(FTabelas, Length(FTabelas) + 1); with FTabelas[High(FTabelas)] do begin Tabela := pTabela; Conteudo := pConteudo; Descricao := pDescricao; end; end; begin InicializaTabelas(´A´, ´B´, ´C´); InicializaTabelas(´A´, ´H´, ´C´); InicializaTabelas(´A´, ´2´, ´C´); InicializaTabelas(´X´, ´Y´, ´Z´); InicializaTabelas(´X´, ´Z´, ´Z´); end;
Gostei + 0
27/03/2007
Newpaulo
O trecho que eu enviei é apenas um fragmento da unit, achei melhor não postar o código inteiro para não confundir o pessoal com a pergunta
Obrigado pela sua informação.
[b:2397e85bea]Agora vou mudar um pouco a minha pergunta inicial:[/b:2397e85bea]
Existe outra maneira de ´popular´ esse array ?
Isso é sem ter que usar a função ´inicializaTabelas´ ?
Algo direto dentro do constructor, semelhante a:
FTabelas[1] := [ ´A´, ´B´, ´C´ ];
FTabelas[2] := [ ´A´, ´C´, ´C´ ];
Importante: desde do inicio saberei o tamanho da array:
É possivel declarar esse tamanho em :
FTabelas: array of TRecTabela;
Gostei + 0
27/03/2007
Marco Salles
Sim , é possível , basta declarar desta forma :
de qualquer forma , voce tem que fazer um Mapeamento
Eu não vejo ganho nenhum fazend um mapeamento ou usando o método inicializar ,e voce pode embutir ainda mais , implementando uma function ao Inves de uma Procedure
constructor TClassModel.Create; function _(pTabela, pConteudo, pDescricao: string):TRecTabela; var inDados:TRecTabela; begin indados.Tabela:=pTabela; indados.Conteudo:=pConteudo; indados.Descricao:=pDescricao; result:=indados; end; begin FTabelas[1]:= _(´A´,´B´,´C´); FTabelas[2]:= _(´A´, ´C´, ´C´); etc... end;
Gostei + 0
27/03/2007
Newpaulo
[b:20aa0cf7f2]Um duvida por o uso do ´_´ no nome da função ?
Existe algum motivo especial ?
[/b:20aa0cf7f2]
Por enquanto obrigado
Gostei + 0
28/03/2007
Marco Salles
nenhuma função especial..... Un nome pequeno para ser chamado pocas vezes e portanto não precisa ser lembrado
Outra forma que apresento a voce por se tratar de constantes e definir essa constantes no método Crete da Classe ..
Por exemplo
constructor TClassModel.Create; const Definicao1:TRecTabela =(tabela:´A´;Conteudo:´B´;Descricao:´C´]); Definicao2:TRecTabela =(tabela:´A´;Conteudo:´C´;Descricao:´C´) Definicao3:TRecTabela =(tabela:´A´;Conteudo:´B´;Descricao:´C´), Definicao4:TRecTabela =(tabela:´B´;Conteudo:´C´;Descricao:´C´) Definicao5:TRecTabela= (tabela:´B´;Conteudo:´X´;Descricao:´C´)];} begin Ftabelas[1]:=Definicao1; Ftabelas[2]:=Definicao2; Ftabelas[3]:=Definicao3; Ftabelas[4]:=Definicao4; Ftabelas[5]:=Definicao5; end;
Gostei + 0
28/03/2007
Marco Salles
As vezes escapole algum erro na digitação a gente vê , mas ja foi
a saida é ficar enchendo os forum de post quase que duplicados :cry:
constructor TClassModel.Create; const Definicao1:TRecTabela = (tabela:´A´;Conteudo:´B´;Descricao:´C´); Definicao2:TRecTabela =(tabela:´A´;Conteudo:´C´;Descricao:´C´); Definicao3:TRecTabela =(tabela:´A´;Conteudo:´B´;Descricao:´C´); Definicao4:TRecTabela =(tabela:´B´;Conteudo:´C´;Descricao:´C´); Definicao5:TRecTabela= (tabela:´B´;Conteudo:´X´;Descricao:´C´); begin Ftabelas[1]:=Definicao1; Ftabelas[2]:=Definicao2; Ftabelas[3]:=Definicao3; Ftabelas[4]:=Definicao4; Ftabelas[5]:=Definicao5 end;
Gostei + 0
28/03/2007
Newpaulo
[b:a623f75d9b]constructor TClassModel.Create(AOwner: TObject);
procedure _T(pIndice: Smallint; pTabela, pConteudo, pDescricao: string);
begin
FTabelas[pIndice].Tabela := pTabela;
FTabelas[pIndice].Conteudo := pConteudo;
FTabelas[pIndice].Descricao := pDescricao;
end;
begin
_T(1, ´A´, ´B´, ´C´);
_T(2, ´A´, ´C´, ´C´);
_T(3, ´A´, ´B´, ´C´);
_T(4, ´B´, ´C´, ´C´);
_T(5, ´B´, ´X´, ´C´);
end;
[/b:a623f75d9b]
Se mais alguém quiser comentar o código ficarei grato...
[b:a623f75d9b][i:a623f75d9b]Marcos obrigado pela ajuda[/i:a623f75d9b][/b:a623f75d9b]
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)