ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Orientação a Objeto.

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 11:59 am    Assunto: Orientação a Objeto. Responder com Citação

Pessoal, estou comecando agora com programacao orientada a objeto e gostaria de algumas sugestões de melhoria no código abaixo e algumas dicas tbm de como chegar no objetivo que eu quero.

Código:
TMyObject = class
    Tipo:string[1];
    CodMunic:string[5];
    DataEnvio:string[8];
    HoraEnvio:string[6];
    Competencia:string[6];
    Movimento:string[1];
    CNPJ:string[14];
    Origem:string[2];
    Nome:string[55];
    Departamento:string[55];
    Cidade:string[30];
    function SetNome (Nome:String):string;
    function SetDepartamento (Depart:String):string;
    function SetCidade (Cidade:String):string;
    constructor Create;
  end;

constructor TMyObject.Create;
begin
  inherited Create;
  try
    Form1.cdsTeste.Open;
    self.Tipo:= '1';
    Self.CodMunic:= Form1.cdsteste.fieldbyname('CODSINPAS').AsString;
    Self.DataEnvio:= FormatDateTime('yyyymmdd',Date);
    self.HoraEnvio:= StringReplace(TimeToStr(Time),':','',[rfReplaceAll]);
    self.Competencia:= FormatDateTime('yyyymm',Date);
    self.Movimento:= '1';
    self.CNPJ:= Form1.cdsTeste.fieldbyname('CNPJ').AsString;
    self.Origem:= '44';
    Self.SetNome(Form1.cdsTeste.fieldbyname('TITULO').AsString);
    Self.SetDepartamento('OBRAS E MEIO AMBIENTE');
    self.SetCidade(Form1.cdsTeste.fieldbyname('MUNICIPIO').AsString);
  finally
    Form1.cdsTeste.Close;
  end;
end;

function TMyObject.SetCidade(Cidade: String): string;
begin
  Self.Cidade:= Cidade;
  if Length(Self.Cidade) < (SizeOf(self.Cidade) -1) then
  begin
    while Length(Self.Cidade) < (SizeOf(self.Cidade) -1) do
    begin
      Self.Cidade:= Self.Cidade + ' ';
    end;
  end;
  Result:= Self.Cidade;
end;

function TMyObject.SetDepartamento (Depart:String):string;
begin
  Self.Departamento:= Depart;
  if Length(Self.Departamento) < (SizeOf(self.Departamento) -1) then
  begin
    while Length(Self.Departamento) < (SizeOf(self.Departamento) -1) do
    begin
      Self.Departamento:= Self.Departamento + ' ';
    end;
  end;
  Result:= self.Departamento;
end;

function TMyObject.SetNome(Nome: String): string;
begin
  self.Nome:= Nome;
  if Length(Self.Nome) < (SizeOf(self.Nome) -1) then
  begin
    while Length(Self.Nome) < (SizeOf(self.Nome) -1) do
    begin
      Self.Nome:= Self.Nome + ' ';
    end;
  end;
  Result:= Self.Nome;
end;

Eu gostaria que as variaveis desse objeto não pudessem ser atribuidas diretamente.
Ex: MyObject.Nome:= 'MARCOS';

E sim somente para funcao SetNome, para poder manter a integridade da regra do preenchimento do tamanho total declarado na variavel, e para obter seu valor seria atraves de uma funcao GetNome (ainda não criada no código acima).

Alguem poderia me ajudar a estruturar essa classe da maneira mais correta com essas regras que eu disse?

Grato,

Marcos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
johnny-walker
Moderador
Moderador


Registrado: Sábado, 4 de Outubro de 2003
Mensagens: 10653
Localização: Contagem/MG - BRAZIL

MensagemEnviada: Qua Nov 21, 2007 12:15 pm    Assunto: Responder com Citação

eis um exemplo que pode te ajudar...


http://www.delphibasics.co.uk/Article.asp?Name=OOExample



bye
_________________
P.O.W.E.R B.Y D.E.L.P.H.I
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 12:55 pm    Assunto: Responder com Citação

johnny-walker escreveu:
eis um exemplo que pode te ajudar...


http://www.delphibasics.co.uk/Article.asp?Name=OOExample



bye


Dei uma olhada mas ainda nao consegui o que eu quero, sera que isso é possível? Nao deixar atribuir diretamente valor a uma variavel da classe, sendo somente possivel atraves de uma funcao SETs... da vida??
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
casetek
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 13 de Setembro de 2004
Mensagens: 211
Localização: Londrina - PR

MensagemEnviada: Qua Nov 21, 2007 1:54 pm    Assunto: Responder com Citação

Olá Marcos,

Uma das maiores vantagens da O.O. é possibilitar exatamente isso que vc quer. Declare os atributos como privados e os métodos como públicos.
A definição de atributo privado é justamente essa, de só poder ser acessado dentro da própria classe.

TMyObject = class

private
Tipo:string[1];
CodMunic:string[5];
DataEnvio:string[8];
HoraEnvio:string[6];
Competencia:string[6];
Movimento:string[1];
CNPJ:string[14];
Origem:string[2];
Nome:string[55];
Departamento:string[55];
Cidade:string[30];

public

function SetNome (Nome:String):string;
function SetDepartamento (Depart:String):string;
function SetCidade (Cidade:String):string;
constructor Create;
end;

Uma observação. Métodos "SET" normalmente não retornam valor, por isso é melhor você usar uma procedure ao invés da function

procedure TMyObject.SetNome(nome: String);
begin
self.Nome:= nome;
end;

function TMyObject.GetNome(): String;
begin
Result:= Self.Nome;
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 2:47 pm    Assunto: Responder com Citação

Pois é eu fiz dessa forma... Dai quando vou utilizar veja so:

var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;

MyObject.Cidade:= 'teste'; //O Delphi deixa eu fazer a atribuição direta!!!!

FreeAndNil(MyObject);
end;
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Qua Nov 21, 2007 3:12 pm    Assunto: Responder com Citação

Every member of a class has an attribute called visibility, which is indicated by one of the reserved words private, protected, public, published, or automated. For example,

published property Color: TColor read GetColor write SetColor;

declares a published property called Color. Visibility determines where and how a member can be accessed, with private representing the least accessibility, protected representing an intermediate level of accessibility, and public, published, and automated representing the greatest accessibility.

Private, protected, and public members

Published members

Automated members

If a member's declaration appears without its own visibility specifier, the member has the same visibility as the one that precedes it. Members at the beginning of a class declaration that don't have a specified visibility are by default published, provided the class is compiled in the {$M+} state or is derived from a class compiled in the {$M+} state; otherwise, such members are public.

For readability, it is best to organize a class declaration by visibility, placing all the private members together, followed by all the protected members, and so forth. This way each visibility reserved word appears at most once and marks the beginning of a new "section" of the declaration. So a typical class declaration should like this:

type
TMyClass = class(TControl)
private
... { private declarations here}
protected
... { protected declarations here }
public
... { public declarations here }
published
... { published declarations here }
end;

You can increase the visibility of a member in a descendant class by redeclaring it, but you cannot decrease its visibility. For example, a protected property can be made public in a descendant, but not private. Moreover, published members cannot become public in a descendant class. For more information, see Property overrides and redeclarations.

---------------

Editado, não tem nada a ver com protected...

as classes se enxergam e tem acesso a todas as variaveis se estão na mesma unit... se vc colocar no uses e instanciar em outro lugar ai o private funciona...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart


Editado pela última vez por DonOctavioDelFlores em Qua Nov 21, 2007 3:55 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Qua Nov 21, 2007 3:19 pm    Assunto: Responder com Citação

vc se deu ao trabalho de ao menos dar uma olhada numa unit qq do delphi?

forms, controls, etc.

Código:
TMyObject = class
private
    Tipo: Char;
    CodMunic:string[5];
    DataEnvio:string[8];
    HoraEnvio:string[6];
    Competencia:string[6];
    Movimento:string[1];
    CNPJ:string[14];
    Origem:string[2];
    Nome:string[55];
    Departamento:string[55];
    Cidade:string[30];
    procedure SetNome (Nome:String);
    function GetNome :string;
    procedure SetDepartamento (Depart:String);
    function GetDepartamento :string;
    procedure SetCidade (Cidade:String);
    function GetCidade :string;
  public
    property Nome : string Read GetNome write SetNome;
    property Departamento : string Read GetDepartamento write SetDepartamento;
    property Cidade : string Read GetCidade write SetCidade;
    constructor Create;
  end;


isso é o q chamam de encapsulamento.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 4:50 pm    Assunto: Responder com Citação

gilsonnrodrigues escreveu:
vc se deu ao trabalho de ao menos dar uma olhada numa unit qq do delphi?

forms, controls, etc.

Código:
TMyObject = class
private
    Tipo: Char;
    CodMunic:string[5];
    DataEnvio:string[8];
    HoraEnvio:string[6];
    Competencia:string[6];
    Movimento:string[1];
    CNPJ:string[14];
    Origem:string[2];
    Nome:string[55];
    Departamento:string[55];
    Cidade:string[30];
    procedure SetNome (Nome:String);
    function GetNome :string;
    procedure SetDepartamento (Depart:String);
    function GetDepartamento :string;
    procedure SetCidade (Cidade:String);
    function GetCidade :string;
  public
    property Nome : string Read GetNome write SetNome;
    property Departamento : string Read GetDepartamento write SetDepartamento;
    property Cidade : string Read GetCidade write SetCidade;
    constructor Create;
  end;


isso é o q chamam de encapsulamento.


Pois eh, mas mesmo assim continuo conseguindo atribuir a variavel diretamente mesmo no private, protected... eu nao sei o que esta acontecendo, se eu nao estou entendendo com funciona, se o que eu quero tem condicoes de ser feito realmente... nao sei, so sei que com todas essas opcoes que foi colocado aqui eu testei aqui no delphi continuo conseguindo fazer isso:

var
MyObject: TMyObject;
begin
MyObject:= TMyObject.Create;

MyObject.Cidade:= 'teste'; //O Delphi deixa eu fazer a atribuição direta!!!!

FreeAndNil(MyObject);
end;

Coisa que eu nao gostaria, gostaria fosse atribuido um valor a variavel apenas atraves da procedure:

procedure SetCidade (Cidade:String);
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
DonOctavioDelFlores
Colaborador
Colaborador


Registrado: Quarta-Feira, 12 de Setembro de 2007
Mensagens: 2630
Localização: Pra lá de Bagda

MensagemEnviada: Qua Nov 21, 2007 4:55 pm    Assunto: Responder com Citação

tente acessar de outra unit... ai vai funcionar...
_________________
“The problem with the world is that everyone is a few drinks behind.” Humphrey Bogart
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 5:06 pm    Assunto: Responder com Citação

DonOctavioDelFlores escreveu:
tente acessar de outra unit... ai vai funcionar...


hehehe... Bom eu disse na minha primeira postagem que eu estava comecando com orientacao a objeto ne... coisa de principiante mesmo, enchi o saco de todos hahaha O problema realmente era que eu estava fazendo os testes na mesma unit de criacao da classe. Quando eu testei de a partir de uma outra unit como o colega disse, as variaveis privadas nao apareceram mais!

Pessoal, valeu mesmo pela ajuda e desculpe pela ignorancia.

Abs

Marcos
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
danielbuona
Profissional
Profissional


Registrado: Quinta-Feira, 30 de Junho de 2005
Mensagens: 576
Localização: São Paulo/SP

MensagemEnviada: Qua Nov 21, 2007 5:28 pm    Assunto: Responder com Citação

Amigo, se eu fosse desenvolver, eu faria assim..

Código:

unit Unit1;

interface

type
  TMyObject = class
  private
    FCNPJ: string;
    FCodMunic: string;
    FDataEnvio: String;
    FDepartamento: string;
    FHoraEnvio: string;
    FNome: string;
    FCompetencia: string;
    FCidade: string;
    FTipo: string;
    FOrigem: string;
    FMovimento: string;
    procedure SetCidade(const Value: string);
    procedure SetCNPJ(const Value: string);
    procedure SetCodMunic(const Value: string);
    procedure SetCompetencia(const Value: string);
    procedure SetDataEnvio(const Value: String);
    procedure SetDepartamento(const Value: string);
    procedure SetHoraEnvio(const Value: string);
    procedure SetMovimento(const Value: string);
    procedure SetNome(const Value: string);
    procedure SetOrigem(const Value: string);
    procedure SetTipo(const Value: string);
  published
    property Tipo:string read FTipo write SetTipo;
    property CodMunic:string read FCodMunic write SetCodMunic;
    property DataEnvio:String read FDataEnvio write SetDataEnvio;
    property HoraEnvio:string read FHoraEnvio write SetHoraEnvio;
    property Competencia:string read FCompetencia write SetCompetencia;
    property Movimento:string read FMovimento write SetMovimento;
    property CNPJ:string read FCNPJ write SetCNPJ;
    property Origem:string read FOrigem write SetOrigem;
    property Nome:string read FNome write SetNome;
    property Departamento:string read FDepartamento write SetDepartamento;
    property Cidade:string read FCidade write SetCidade;
  end;


implementation

{ TMyObject }

procedure TMyObject.SetCidade(const Value: string);
begin
  FCidade := Copy(Value,01,30);
end;

procedure TMyObject.SetCNPJ(const Value: string);
begin
  FCNPJ := Copy(Value,01,14);
end;

procedure TMyObject.SetCodMunic(const Value: string);
begin
  FCodMunic := Copy(Value,01,05);
end;

procedure TMyObject.SetCompetencia(const Value: string);
begin
  FCompetencia := Copy(Value,01,06);
end;

procedure TMyObject.SetDataEnvio(const Value: String);
begin
  FDataEnvio := Copy(Value,01,08);
end;

procedure TMyObject.SetDepartamento(const Value: string);
begin
  FDepartamento := Copy(Value,01,55);
end;

procedure TMyObject.SetHoraEnvio(const Value: string);
begin
  FHoraEnvio := Copy(Value,01,06);
end;

procedure TMyObject.SetMovimento(const Value: string);
begin
  FMovimento := Copy(Value,01);
end;

procedure TMyObject.SetNome(const Value: string);
begin
  FNome := Copy(Value,55);
end;

procedure TMyObject.SetOrigem(const Value: string);
begin
  FOrigem := Copy(Value,01,02);
end;

procedure TMyObject.SetTipo(const Value: string);
begin
  FTipo := Copy(Value,01,01);
end;

end.


e para usar
Código:

procedure TForm1.Button1Click(Sender:TObject);
var
  vMyObject: TMyObject;
begin

  vMyObject := TMyObject.Create;
  try
    Form1.cdsTeste.Open;
    vMyObject.Tipo          := '1';
    vMyObject.CodMunic      := Form1.cdsteste.fieldbyname('CODSINPAS').AsString;
    vMyObject.DataEnvio     := FormatDateTime('yyyymmdd',Date);
    vMyObject.HoraEnvio     := StringReplace(TimeToStr(Time),':','',[rfReplaceAll]);
    vMyObject.Competencia   := FormatDateTime('yyyymm',Date);
    vMyObject.Movimento     := '1';
    vMyObject.CNPJ          := Form1.cdsTeste.fieldbyname('CNPJ').AsString;
    vMyObject.Origem        := '44';
    vMyObject.Nome          := Form1.cdsTeste.fieldbyname('TITULO').AsString;
    vMyObject.Departamento  := 'OBRAS E MEIO AMBIENTE';
    vMyObject.Cidade        := Form1.cdsTeste.fieldbyname('MUNICIPIO').AsString;

  finally
    FreeAndNil(vMyObject);
  end;

end;


Observe que existe métodos que são chamados a cada atribuição (write SetDepartamento;)
Você pode definir a sua regra neles sem problema...
Pesquise nos sites de programação, artigos relacionados a criação de componentes... vai ti dar uma idéia sobre OO e como utiliza-la...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
marcosmodolo
Aprendiz
Aprendiz


Registrado: Quinta-Feira, 25 de Janeiro de 2007
Mensagens: 257

MensagemEnviada: Qua Nov 21, 2007 5:40 pm    Assunto: Responder com Citação

Valeu pela dica!

Muito obrigado

Abs
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB