Como consigo comparar o valor de um memo com um valor gravado no .INI.
Exemplo:
if memo.lines.texto = c:\arquivo.ini
then
abort
else
IPwatch.SendMail
Simplifiquei o exemplo, mas a idéia do programa é a seguinte:
Toda vez que executa o programa ele verifica o IP da máquina e envia pra um e-mail. Se o valor do IP atual for igual ao do arquivo memo, ele aborta o envio, ou seja, só enviará o e-mail quando o IP for alterado (no caso de IP dinâmico).
Segue o código no Form.Show, não está rolando desse jeito.
#Código
procedure TIPLocal.FormShow(Sender: TObject);
begin
mmoShowIP.Lines := IdIPAddrMon.IPAddresses;
IPCfg := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'IP_Local.ini');
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
if mmoIPAntigo.Lines = IdIPAddrMon.IPAddresses then
begin
Application.MessageBox('E-mail não enviado!',
'Confirmação', MB_OK + MB_ICONWARNING);
Abort;
end
else
IdSMTP.Host := edtHost.Text;
IdSMTP.Username := edtUser.Text;
IdSMTP.Password := edtSenha.Text;
IdSMTP.Port := StrToInt(edtPort.Text);
IdMessage.Recipients.EMailAddresses := edtPara.Text;
IdMessage.Subject := edtAssunto.Text;
IdMessage.Body := mmoShowIP.Lines;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage)
finally
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
IdSMTP.Disconnect;
IPCfg.Free;
end;
end;
#Código
if memo.lines[1].text = (seu campo de IP ou variavel ) then abort else IPwatch.SendMail
A idéia é só garvar no INI mesmo, pra não precisar ligar na loja toda vez que reiniciarem o server.
Hoje funciona bem, o único problema é que mesmo que o IP não tenha sido renovado, é enviado o e-mail, porque o programa está no inicializar do Windows, ou seja, mesmo se efetuarem logoff/logon o programa será executado.
Valeu a dica, mas pode ser mais simples, sem precisar do BD.
Acredito que a lógica esteje condizente. O problema é que não está rolando.
Já tentei de duas maneiras.
Mandei o valor do INI pra um novo memo denominado mmoIPAntigo e também ler direto, mas não funciona.
O estranho é que ficam os dois memos na tela com os valores diferentes e ainda assim não obedece o argumento.
Essa parte lê o INI
#Código
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
#Código
procedure TIPLocal.FormShow(Sender: TObject);
var
a, b : TStrings;
begin
mmoShowIP.Lines := IdIPAddrMon.IPAddresses;
IPCfg := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'IP_Local.ini');
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
a := mmoShowIP.Lines;
b := mmoIPAntigo.Lines;
if a <> b then
begin
Application.MessageBox('É necessário configurar o remetente e destinatário!',
'Confirmação', MB_OK + MB_ICONWARNING);
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
Abort;
end
else
IdSMTP.Host := edtHost.Text;
IdSMTP.Username := edtUser.Text;
IdSMTP.Password := edtSenha.Text;
IdSMTP.Port := StrToInt(edtPort.Text);
IdMessage.Recipients.EMailAddresses := edtPara.Text;
IdMessage.Subject := edtAssunto.Text;
IdMessage.Body := mmoShowIP.Lines;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage)
finally
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
IdSMTP.Disconnect;
IPCfg.Free;
end;
end;
De todo jeito ele aborta o envio, ou seja, estando a= x e b = x ou a = x e b = y.
#Código
procedure TForm1.btn1Click(Sender: TObject);
var
a, b : string;
begin
a := mmo1.Lines.Text;
b := mmo2.Lines.Text;
if a <> b then
begin
Application.MessageBox('Não são iguais!', 'Aviso!', MB_OK +
MB_ICONWARNING);
end
else
begin
Application.MessageBox('São iguais!', 'Aviso!', MB_OK +
MB_ICONWARNING);
end;
end;
E funciona! Assim funciona! Vai saber :(
var
StrIni:TStrings;
StrMem:String;
begin
StrIni:=TStringList.Create;
try
strIni.LoadFromFile('C:\zzPodeApagar\teste.ini');
StrMem:=Memo1.Lines.Text;
if AnsiCompareText(StrIni.Text,StrMem) = 0 then
Showmessage('Iguais')
else
Showmessage('Diferentes')
finally
StrIni.Free;
end;
var
StrIni:TStrings;
StrMem:String;
begin
StrIni:=TStringList.Create;
try
strIni.LoadFromFile('C:\zzPodeApagar\teste.ini');
StrMem:=Memo1.Lines.Text;
if AnsiCompareText(StrIni.Text,StrMem) = 0 then
Showmessage('Iguais')
else
Showmessage('Diferentes')
finally
StrIni.Free;
end;
Citação:
o Delphi tem função nativa que compara String AnsiCompareText > case Sensitive AnsiCompareStr > case InSensitive Vc usa a Propriedade Memo.Lines.Text e do Arquivo Ini carrega-o em um StringList #Código
var
StrIni:TStrings;
StrMem:String;
begin
StrIni:=TStringList.Create;
try
strIni.LoadFromFile('C:\zzPodeApagar\teste.ini');
StrMem:=Memo1.Lines.Text;
if AnsiCompareText(StrIni.Text,StrMem) = 0 then
Showmessage('Iguais')
else
Showmessage('Diferentes')
finally
StrIni.Free;
end;
Nào conhecia esta função muito bom.
O código está assim:
Sendo que quando essa parte está assim:
if mmoIPAntigo.Lines <> mmoShowIP.Lines then
VAI PRO PONTO 1
Se está assim:
if mmoIPAntigo.Lines = mmoShowIP.Lines then
VAI PRO PONTO 2
#Código
procedure TIPLocal.FormShow(Sender: TObject);
begin
IPCfg := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'IP_Local.ini');
mmoShowIP.Lines := IdIPAddrMon.IPAddresses;
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
if mmoIPAntigo.Lines <> mmoShowIP.Lines then
begin // PONTO 1
Application.MessageBox('O e-mail não foi enviado!',
'Confirmação', MB_OK + MB_ICONWARNING);
Abort;
end
else
begin // PONTO 2
IdSMTP.Host := edtHost.Text;
IdSMTP.Username := edtUser.Text;
IdSMTP.Password := edtSenha.Text;
IdSMTP.Port := StrToInt(edtPort.Text);
IdMessage.Recipients.EMailAddresses := edtPara.Text;
IdMessage.Subject := edtAssunto.Text;
IdMessage.Body := mmoShowIP.Lines;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage)
finally
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
IdSMTP.Disconnect;
IPCfg.Free;
end;
end;
end;
Citação:
Desculpe...esqueci de postar o erro
Dentre todos, acho que esse é o principal:
[Pascal Error] Unit1.pas(34): E2003 Undeclared identifier: 'LoadFromFile'
Mas não parece que vc esta usando isto .. na sua ultima postagem não tem esta propriedade Onde ela esta aparecendo ???
Citação:
Oi Marco,
Eu fiz um teste com seu exemplo em novo projeto pra ver o funcionamento e já deu o erro.
. Mas tem que ver como vc esta fazendo A função não é minha é Nativa do Delphi Tem que ver se o erro é de compilação , de execução .. Tem que colocar o codigo para poder ananlisar
O código está assim:
Sendo que quando essa parte está assim:
if mmoIPAntigo.Lines <> mmoShowIP.Lines then
VAI PRO PONTO 1
Se está assim:
if mmoIPAntigo.Lines = mmoShowIP.Lines then
VAI PRO PONTO 2
#Código
procedure TIPLocal.FormShow(Sender: TObject);
begin
IPCfg := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'IP_Local.ini');
mmoShowIP.Lines := IdIPAddrMon.IPAddresses;
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
if mmoIPAntigo.Lines <> mmoShowIP.Lines then
begin // PONTO 1
Application.MessageBox('O e-mail não foi enviado!',
'Confirmação', MB_OK + MB_ICONWARNING);
Abort;
end
else
begin // PONTO 2
IdSMTP.Host := edtHost.Text;
IdSMTP.Username := edtUser.Text;
IdSMTP.Password := edtSenha.Text;
IdSMTP.Port := StrToInt(edtPort.Text);
IdMessage.Recipients.EMailAddresses := edtPara.Text;
IdMessage.Subject := edtAssunto.Text;
IdMessage.Body := mmoShowIP.Lines;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage)
finally
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
IdSMTP.Disconnect;
IPCfg.Free;
end;
end;
end;
* Pior, independente de usar edit ou memo.
Citação:
#Código
procedure TIPLocal.FormShow(Sender: TObject);
begin
IPCfg := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'IP_Local.ini');
mmoShowIP.Lines := IdIPAddrMon.IPAddresses;
mmoIPAntigo.Lines.Text := IPCfg.ReadString('IPLocal','IP Local:', '');
if AnsiCompareText(mmoIPAntigo.Lines,mmoShowIP.Lines) <> 0 then
begin // PONTO 1
Application.MessageBox('O e-mail não foi enviado!',
'Confirmação', MB_OK + MB_ICONWARNING);
Abort;
end
else
begin // PONTO 2
IdSMTP.Host := edtHost.Text;
IdSMTP.Username := edtUser.Text;
IdSMTP.Password := edtSenha.Text;
IdSMTP.Port := StrToInt(edtPort.Text);
IdMessage.Recipients.EMailAddresses := edtPara.Text;
IdMessage.Subject := edtAssunto.Text;
IdMessage.Body := mmoShowIP.Lines;
IdSMTP.Connect;
try
IdSMTP.Send(IdMessage)
finally
IPCfg.WriteString('IPLocal','IP Local:', mmoShowIP.Lines.Text);
IdSMTP.Disconnect;
IPCfg.Free;
end;
end;
end;
#Código
procedure TForm1.btn1Click(Sender: TObject);
var
StrIni : TStrings;
StrMem : string;
begin
StrIni := TStrings.Create;
try
StrIni := LoadFromFile('C:\TEMP\testeIP.ini');
StrMem := mmo1.Lines.Text;
if AnsiCompareText(StrIni.Text.StrMem) = 0 then
ShowMessage('São Iguais')
else
ShowMessage('Diferentes');
finally
StrIni.Free;
end;
end;
end.
O SysUtils já está declarado e gera o erro:
[Pascal Error] Unit1.pas(34): E2003 Undeclared identifier: 'LoadFromFile'
Valeu Marco. Aguardo ajuda ;)
Citação:
Oi Marco,
Coloquei o que você passou.
Só alterei essa parte:
if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) = 0 then
Colocando .Text.
Ocorre a mesma situação.
Se coloca = vai pro ponto 2, se coloca <> vai pro ponto 1
.. Então muda .. if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) = 0 then para if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) <> 0 then
Quando abrir novamente, o memo abaixo exibe o que está no INI, se o IP for alterado, então não serão mais iguais. Aí nessa situação deveria enviar um e-mail, se o IP não for alterado então os dois memos serão iguais. Valeu pelo elogio, com certeza os amigos aqui do DevMedia me ensinaram isso também...rsrs
Configure tudo e tente novamente, após a gravação do INI deve ocorrer normal, salvo o problema de comparar para enviar ou não o e-mail.
Citação:
O que ele faz na primeira vez é gravar o que exibe no memo de cima no arquivo INI.
Quando abrir novamente, o memo abaixo exibe o que está no INI, se o IP for alterado, então não serão mais iguais. Aí nessa situação deveria enviar um e-mail, se o IP não for alterado então os dois memos serão iguais. Valeu pelo elogio, com certeza os amigos aqui do DevMedia me ensinaram isso também...rsrs
Configure tudo e tente novamente, após a gravação do INI deve ocorrer normal, salvo o problema de comparar para enviar ou não o e-mail.
Certo mas o fato do sistema me dar o ip de minha máquina e do roteador no mesmo memo antigo, acontece isso com vc?
mmoIPAntigo.Lines.text := IPCfg.ReadString('IPLocal','IP Local:', ''); Um vc usa a propreidade TStrings e no Outro Vc usa a Propriedade Text Isto que esta causando o Erro Mude para mmoShowIP.Lines.CommaText := IdIPAddrMon.IPAddresses.CommaText;
mmoIPAntigo.Lines.CommaText := IPCfg.ReadString('IPLocal','IP Local:', ''); e na comparação Use if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) = 0 then Qnd forem Iguais Ira Executar o Ponto1 Wnd Forem Diferentes ira Executar o Ponto 2 Se sua Logica for Contrária eu não sei , Troque o if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) = 0 then POR if AnsiCompareText(mmoIPAntigo.Lines.Text, mmoShowIP.Lines.Text) <> 0 then
Citação:
Citação:
O que ele faz na primeira vez é gravar o que exibe no memo de cima no arquivo INI.
Quando abrir novamente, o memo abaixo exibe o que está no INI, se o IP for alterado, então não serão mais iguais. Aí nessa situação deveria enviar um e-mail, se o IP não for alterado então os dois memos serão iguais. Valeu pelo elogio, com certeza os amigos aqui do DevMedia me ensinaram isso também...rsrs
Configure tudo e tente novamente, após a gravação do INI deve ocorrer normal, salvo o problema de comparar para enviar ou não o e-mail.
Certo mas o fato do sistema me dar o ip de minha máquina e do roteador no mesmo memo antigo, acontece isso com vc?









