Qual a melhor maneira de fazer isso ?

Delphi

26/03/2007

Boa tarde a todos...

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

Newpaulo

Curtidas 0

Respostas

Marco Salles

Marco Salles

26/03/2007

Atê agora voce não apresentou como acessar este campo FFTabelas:
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:

Levando em conta que os dados são constantes,


[b:ff9bc5cbf5]não tem sentido existir fora do escopo do constructor[/b:ff9bc5cbf5]

assim;

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; end;


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
Newpaulo

Newpaulo

26/03/2007

Obrigado Marco Salles

Atê agora voce não apresentou como acessar este campo FFTabelas:

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
Marco Salles

Marco Salles

26/03/2007

Importante: desde do inicio saberei o tamanho da array: É possivel declarar esse tamanho em : FTabelas: array of TRecTabela;


Sim , é possível , basta declarar desta forma :

FTabelas: array[1..5] of TRecTabela ;



Agora vou mudar um pouco a minha pergunta inicial: 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´ ];



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
Newpaulo

Newpaulo

26/03/2007

Bom o código final ficaria semelhante a isso !?

type TRecTabela = record Tabela: string[30]; Conteudo: string[254]; Descricao: string[254]; end; TClassModel = class(TObject) private FTabelas: array[1..5] of TRecTabela; procedure InicializaTabelas(pTabela, pConteudo, pDescricao: string); public constructor Create(AOwner: TObject); end; implementation constructor TClassModel.Create(AOwner: TObject); 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´); FTabelas[3]:= _(´A´,´B´,´C´); FTabelas[4]:= _(´B´,´C´,´C´); FTabelas[5]:= _(´B´,´X´,´C´); end;


[b:20aa0cf7f2]Um duvida por o uso do ´_´ no nome da função ?
Existe algum motivo especial ?
[/b:20aa0cf7f2]

Por enquanto obrigado


GOSTEI 0
Marco Salles

Marco Salles

26/03/2007

Um duvida por o uso do ´_´ no nome da função ? Existe algum motivo especial ?


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
Marco Salles

Marco Salles

26/03/2007

infelismente a gente não pode editar nesses tópicos .

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
Newpaulo

Newpaulo

26/03/2007

Optei pela seguinte construção, reduzindo ainda mais o código:

[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
POSTAR