Erro ShowMessage Doido

Delphi

18/04/2016

Boa noite!!!

Por que está ocorrendo esse erro,
'Verifique Área Total Não Pode Ser Maior Que Área do Terreno'
fica mostrando essa mensagem sendo que a área total é menor do que á área do terreno

if Edit8.Text > Edit2.Text then
ShowMessage('Verifique Área Total Não Pode Ser Maior Que Área do Terreno')
else
//if StrToFloatDef(Edit8.Text,0) = 0 then
//Edit8.Text:= '0,00'
//else
if StrToFloatDef(Edit8.Text,0) > 70 then
begin
Edit10.Text:= FormatFloat(',0.00',(StrToFloatDef(Edit8.Text,0)) * porcento * valorprojeto);
end;
Edit2.SetFocus;
Bruno Henrique

Bruno Henrique

Curtidas 0

Respostas

Mateus Ribeiro

Mateus Ribeiro

18/04/2016

Bom dia! Quais valores você está colocando no Edit8 e no Edit2?
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

18/04/2016

Você está comparando os valores como texto você precisa realizar a conversão antes.

Troque:
if Edit8.Text > Edit2.Text then


Por:
if StrToFloatDef(Edit8.Text, 0) > StrToFloatDef(Edit2.Text, 0) then
GOSTEI 0
Bruno Henrique

Bruno Henrique

18/04/2016

Boa tarde!!!


Matteusin - O Valor do edit8.text é a soma de 4 outros edits e o valor do edit2.text é o valor total do terreno. Tirei um print mais não está dando certo de enviar a imagem



Natanael Ferreira - Vou tentar fazer a conversão e falo se deu certo

Obrigado
GOSTEI 0
Bruno Henrique

Bruno Henrique

18/04/2016

Boa noite!!!

Resolveu era esse mesmo o problema, faltou fazer a conversão!!!

Agora tenho outra dúvida!!!

Uso essa rotina para retirar os pontos dos meus edits, por que estava dando erro de point floating.

Mais quando coloco a rotina de soma no evento onchange do edit ele da erro, não consigo digitar da esquerda para a direita quando vou digitar ele sai da esquerda para a direita.

Eu digitei 234 no edit saiu 342

Voces sabem como eu consigo resolver

Função para retirar os pontos

function RetirarPonto(strSrc: string): string;
var
StrAux: string;
i: integer;
FlagFim: boolean;
begin
i := 1;
FlagFim := false;
StrAux := StrSrc;
while (not FlagFim) do
begin
if StrAux[i] = '.' then
begin
Delete(StrAux, i, 1);
end
else
begin
i := i + 1;
end;
if i > length(StrAux) then
flagFIm := true;
end;
RetirarPonto := StrAux;
end;


Soma nos edits no evento onchage
procedure TFrmCadProjetosAmpliacao.Edit7Change(Sender: TObject);
begin
Edit7.Text := FormatFloat(',0.00', StrToFloat(RetirarPonto(Edit7.Text)));
Edit8.Text:= FormatFloat(',0.00',(StrToFloat(RetirarPonto(Edit4.Text)) + StrToFloat(RetirarPonto(Edit5.Text)) + StrToFloat(RetirarPonto(Edit6.Text)) + StrToFloat(RetirarPonto(Edit7.Text))));
porcento := 0.008;
valorprojeto := 900;
menorquesetenta := 70;
if StrToFloatDef(Edit7.Text,0) = 0 then
Edit14.Text:= '0,00'
else
if StrToFloatDef(Edit7.Text,0) < 70 then
Edit14.Text:= FormatFloat(',0.00',menorquesetenta * porcento * valorprojeto)
else
Edit14.Text:= FormatFloat(',0.00',(StrToFloat(RetirarPonto(Edit7.Text))) * porcento * valorprojeto);

end;
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

18/04/2016

Te aconselho a trocar a sua função para retirar ponto por esta mais simplificada:

function RetirarPonto(strSrc: string): string;
begin
  Result := StringReplace(strSrc, '.', '', [rfReplaceAll])
end;


E retirar o seu código do evento onChange e colocar no evento OnExit do Edit com estas alterações:

procedure TFrmCadProjetosAmpliacao.Edit7Exit(Sender: TObject);
var
  porcento, valorprojeto, menorquesetenta: Double;
begin
  Edit7.Text := FormatFloat(',0.00', StrToFloatDef(RetirarPonto(Edit7.Text), 0));

  Edit8.Text := FormatFloat(',0.00', (StrToFloatDef(RetirarPonto(Edit4.Text), 0) +
                                      StrToFloatDef(RetirarPonto(Edit5.Text), 0) +
                                      StrToFloatDef(RetirarPonto(Edit6.Text), 0) +
                                      StrToFloatDef(RetirarPonto(Edit7.Text), 0)));

  porcento := 0.008;
  valorprojeto := 900;
  menorquesetenta := 70;

  if StrToFloatDef(Edit7.Text, 0) = 0 then
    Edit14.Text := '0,00'
  else if StrToFloatDef(Edit7.Text, 0) < 70 then
    Edit14.Text := FormatFloat(',0.00', menorquesetenta * porcento * valorprojeto)
  else
    Edit14.Text := FormatFloat(',0.00', (StrToFloatDef(RetirarPonto(Edit7.Text), 0)) * porcento * valorprojeto);
end;
GOSTEI 0
Bruno Henrique

Bruno Henrique

18/04/2016

Natanael, boa tarde!!!

O código está no onexit, mais eu queria fazer no onchange porque no onexit se o cliente digitar um valor errado no edit4.text e voltar e clicar no edit4.text para corrigir o valor ele vai ter que ir dando tab nos outros edits para o valor aparecer correto no valor total, isso corre o risco de não acontecer se o cliente não dar tab.

Mais nem sei como faço!!!

P.S. Estou tentando enviar print mais não quer dar certo, acho que tá com algum problema!!!

Tem alguma solução???
GOSTEI 0
Natanael Ferreira

Natanael Ferreira

18/04/2016

Entendi. Segue abaixo uma função para ir formatando os valores automaticamente ao digitar no edit:

procedure FormataValor(Edit: TEdit; var Key: Word);
var
  s: String;
begin
  if (Key in [96 .. 107]) or (Key in [48 .. 57]) then
  begin
    s := Edit.Text;
    s := StringReplace(s, ',', '', [rfReplaceAll]);
    s := StringReplace(s, '.', '', [rfReplaceAll]);

    case Length(s) of
      3:
        begin
          s := Copy(s, 1, 1) + ',' + Copy(s, 2);
          Edit.Text := s;
          Edit.SelStart := Length(s);
        end;
      4 .. 5:
        begin
          s := Copy(s, 1, Length(s) - 2) + ',' + Copy(s, Length(s) - 1);
          Edit.Text := s;
          Edit.SelStart := Length(s);
        end;
      6 .. 8:
        begin
          s := Copy(s, 1, Length(s) - 5) + '.' + Copy(s, Length(s) - 4, 3) + ',' +
            Copy(s, Length(s) - 1);
          Edit.Text := s;
          Edit.SelStart := Length(s);
        end;
      9 .. 11:
        begin
          s := Copy(s, 1, Length(s) - 8) + '.' + Copy(s, Length(s) - 7, 3) + '.' +
            Copy(s, Length(s) - 4, 3) + ',' + Copy(s, Length(s) - 1);
          Edit.Text := s;
          Edit.SelStart := Length(s);
        end;
      12 .. 14:
        begin
          s := Copy(s, 1, Length(s) - 11) + '.' + Copy(s, Length(s) - 10, 3) + '.' +
            Copy(s, Length(s) - 7, 3) + '.' + Copy(s, Length(s) - 4, 3) + ',' +
            Copy(s, Length(s) - 1);
          Edit.Text := s;
          Edit.SelStart := Length(s);
        end;
    end;
  end;
end;


Você pode chamá-la no evento OnKeyUp do Edit:

FormataValor(TEdit(Sender), Key);


Assim você pode usar o código que passei antes no OnChange do Edit:

var
  porcento, valorprojeto, menorquesetenta: Double;
begin
  Edit8.Text := FormatFloat(',0.00', (StrToFloatDef(RetirarPonto(Edit4.Text),
    0) + StrToFloatDef(RetirarPonto(Edit5.Text), 0) + StrToFloatDef(RetirarPonto(Edit6.Text),
    0) + StrToFloatDef(RetirarPonto(Edit7.Text), 0)));

  porcento := 0.008;
  valorprojeto := 900;
  menorquesetenta := 70;

  if StrToFloatDef(Edit7.Text, 0) = 0 then
    Edit14.Text := '0,00'
  else if StrToFloatDef(Edit7.Text, 0) < 70 then
    Edit14.Text := FormatFloat(',0.00', menorquesetenta * porcento * valorprojeto)
  else
    Edit14.Text := FormatFloat(',0.00', (StrToFloatDef(RetirarPonto(Edit7.Text), 0)) * porcento *
      valorprojeto);
end;
GOSTEI 0
POSTAR