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 

[REVOLVIDO] Erro stack overflow ao setar uma propriedade

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


Registrado: Quinta-Feira, 29 de Setembro de 2016
Mensagens: 2
Localização: São Paulo - SP

MensagemEnviada: Qui Set 29, 2016 5:35 pm    Assunto: [REVOLVIDO] Erro stack overflow ao setar uma propriedade Responder com Citação

Boa noite a todos.

Estou com um problema em uma classe que estou criando em delphi 6, quando vou vou setar um valor para uma propriedade dela esta dando erro de stack overflow.

Segue abaixo a Classe:

Código:
unit uClassMonitora;

interface

uses
Windows, Messages, SysUtils, Classes, Math, WSockets, WinSock;

type
    TMonitora = class

    private
        TCPClient1: TTCPClient;
        TCPClient2: TTCPClient;

        Atv : Boolean;

        procedure setIP(const Value: String);
        procedure setUDP(const Value: Integer);
        procedure setTCP1(const Value: Integer);
        procedure setTCP2(const Value: Integer);

        function getIP   : String;
        function getUDP  : Integer;
        function getTCP1 : Integer;
        function getTCP2 : Integer;
        function getAtivo: Boolean;

        procedure TCPClient1Connect(Sender: TObject; Socket: TSocket);
        procedure TCPClient1Close(Sender: TObject; Socket: TSocket);

    public
        property IP   : string  read getIP   write setIP;
        property UDP  : Integer read getUDP  write setUDP;
        property TCP1 : Integer read getTCP1 write setTCP1;
        property TCP2 : Integer read getTCP2 write setTCP2;
        property Ativo: Boolean read getAtivo;

        constructor Create();

        function OpenConnectionTCP1: Boolean;
        function OpenConnectionTCP2: Boolean;
        function listeningTCP1: string;
        function listeningTCP2: string;
end;

implementation

{ TMonitora }

constructor TMonitora.Create();
begin
    IP    := '';
    UDP   := 0;
    TCP1  := 0;
    TCP2  := 0;

    TCPClient1:= TTCPClient.Create(TCPClient1);
    with TCPClient1 do
    begin
        OnConnect := TCPClient1Connect;
        OnClose   := TCPClient1Close;
    end;

    TCPClient2:= TTCPClient.Create(TCPClient2);
    with TCPClient2 do
    begin
        OnConnect := TCPClient1Connect;
        OnClose   := TCPClient1Close;
    end;
end;

//===========================GET================================//
function TMonitora.getIP: String;
begin
    getIP := IP;
end;

function TMonitora.getUDP: Integer;
begin
    getUDP := UDP;
end;

function TMonitora.getTCP1: Integer;
begin
    getTCP1 := TCP1;
end;

function TMonitora.getTCP2: Integer;
begin
    getTCP2 := TCP2;
end;

function TMonitora.getAtivo: Boolean;
begin
    getAtivo := Atv;
end;

//===========================SET================================//
procedure TMonitora.setIP(const Value: String);
begin
    IP := Value;
end;

procedure TMonitora.setUDP(const Value: Integer);
begin
    UDP := Value;
end;

procedure TMonitora.setTCP1(const Value: Integer);
begin
    TCP1 := Value;
end;

procedure TMonitora.setTCP2(const Value: Integer);
begin
    TCP2 := Value;
end;

//===========================OBJECT EVENTS================================//
procedure TMonitora.TCPClient1Connect(Sender: TObject; Socket: TSocket);
begin
    Atv := True;
end;

procedure TMonitora.TCPClient1Close(Sender: TObject; Socket: TSocket);
begin
    Atv := False;
end;

//===========================FUNCTIONS================================//
function TMonitora.OpenConnectionTCP1:Boolean;
begin
    Result := True;
    with TCPClient1 do
    begin
        Host:= IP;
        Port:= IntToStr(TCP1);
        try
            Open;
        except
            Result := False;
        end;
    end;
end;

function TMonitora.OpenConnectionTCP2:Boolean;
begin
    Result := True;
    with TCPClient2 do
    begin
        Host:= IP;
        Port:= IntToStr(TCP2);
        try
            Open;
        except
            Result := False;
        end;
    end;
end;

function TMonitora.listeningTCP1: string;
begin
    Result := TCPClient1.Read;
end;

function TMonitora.listeningTCP2: string;
begin
   Result := TCPClient2.Read;
end;

end.



Por favor se alguém puder me ajudar serei muito grato.

Att.
Luiz Poggio.


Editado pela última vez por LuizPoggio em Sex Set 30, 2016 9:02 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Set 29, 2016 6:14 pm    Assunto: Responder com Citação

qual valor em qual propriedade? explica melhor. posta exemplo
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Qui Set 29, 2016 6:19 pm    Assunto: Responder com Citação

Na verdade olhando por cima da pra ver que todas as propriedades estão entrando em loop infinito por isso do erro Stack Overflow...

Você deve criar um Field na classe e dentro do seus getters e setters você preenche o Field;
_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Set 29, 2016 6:33 pm    Assunto: Responder com Citação

e ai sinopense? tudo na paz?
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
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: Sex Set 30, 2016 12:08 am    Assunto: Responder com Citação

Você não pode trabalhar desta forma, caso contrário entra em looping mesmo, isto porque você está trabalhando diretamente com a propriedade na classe e não é desta forma que funciona.

tente assim que resolve seu problema:

Código:
  private
    FIP: string;
    function GetIP: string;
    procedure SetIP(const Value: string);
    { Private declarations }
  public
    { Public declarations }
    property IP: string read GetIP write SetIP;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
     IP := '200.18.222.125';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
     ShowMessage(IP);
end;

function TForm1.GetIP: string;
begin
     Result := FIP;
end;

procedure TForm1.SetIP(const Value: string);
begin
     FIP := Value;
end;


Se quiser dar uma olhada neste site, tem muita coisa interessante a respeito:
http://www.delphibasics.co.uk/RTL.asp?Name=property


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
LuizPoggio
Novato
Novato


Registrado: Quinta-Feira, 29 de Setembro de 2016
Mensagens: 2
Localização: São Paulo - SP

MensagemEnviada: Sex Set 30, 2016 9:00 am    Assunto: Responder com Citação

Bom dia a todos.

Johnny-walker, fiz como você falou e deu certo Very Happy .

Agora esta funcionando como deveria. Muito obrigado.

E obrigado a todos que responderão Viox e Joemil.

Estou mudando para respondido ^^.

att.
Luiz Poggio
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: Sex Set 30, 2016 12:44 pm    Assunto: Responder com Citação

Disponha amigo.


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
viox
Colaborador
Colaborador


Registrado: Sábado, 22 de Outubro de 2011
Mensagens: 1090
Localização: SINOP - MT

MensagemEnviada: Seg Out 03, 2016 11:25 am    Assunto: Responder com Citação

Outra forma de corrigir o erro apenas para nível de conhecimento seria setando direto o Field aka variavel, já que seus getters e setters não tem nenhuma regra em especial

Código:
property IP: string read FIP write FIP;


Caso venha a ter regras no futuro basta trocar a leitura ou escrita para chamar o método com as regras, Delphi é muito bom nessa questão por te dar essa praticidade.
_________________
Just another Delphi guy.


http://www.soft42.com
http://www.nortaonegocios.com.br
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
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