Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
LuizPoggio Novato

Registrado: Quinta-Feira, 29 de Setembro de 2016 Mensagens: 2 Localização: São Paulo - SP
|
Enviada: Qui Set 29, 2016 5:35 pm Assunto: [REVOLVIDO] Erro stack overflow ao setar uma propriedade |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Qui Set 29, 2016 6:14 pm Assunto: |
|
|
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 |
|
 |
viox Colaborador

Registrado: Sábado, 22 de Outubro de 2011 Mensagens: 1090 Localização: SINOP - MT
|
Enviada: Qui Set 29, 2016 6:19 pm Assunto: |
|
|
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 |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Qui Set 29, 2016 6:33 pm Assunto: |
|
|
e ai sinopense? tudo na paz? _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Sex Set 30, 2016 12:08 am Assunto: |
|
|
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 |
|
 |
LuizPoggio Novato

Registrado: Quinta-Feira, 29 de Setembro de 2016 Mensagens: 2 Localização: São Paulo - SP
|
Enviada: Sex Set 30, 2016 9:00 am Assunto: |
|
|
Bom dia a todos.
Johnny-walker, fiz como você falou e deu certo .
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 |
|
 |
johnny-walker Moderador


Registrado: Sábado, 4 de Outubro de 2003 Mensagens: 10653 Localização: Contagem/MG - BRAZIL
|
Enviada: Sex Set 30, 2016 12:44 pm Assunto: |
|
|
Disponha amigo.
bye _________________ P.O.W.E.R B.Y D.E.L.P.H.I |
|
Voltar ao Topo |
|
 |
viox Colaborador

Registrado: Sábado, 22 de Outubro de 2011 Mensagens: 1090 Localização: SINOP - MT
|
Enviada: Seg Out 03, 2016 11:25 am Assunto: |
|
|
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 |
|
 |
|