Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

SOMBRIO-SC

[Resolvido] Edit Soma Multiplica

Recommended Posts

Olá, Galera, como faço para somar ou multiplicar duas edit aparecer o resultado na terceira edit, sem ter que colocar um botão, quero automatico entendem? O Moderador já me resolveu o problema, mas com um botão, e na tela

onde insiro os numeros não pode ter botão. Outra pergunta para o mesmo Form, a edit9 tem que aparecer o mesmo que

aparece na edit3, tenho procurado na biblia, mas encontro muito mais resposta aqui, obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exemplo de multiplicação.

 

Coloque a propriedade KeyPreview do Form para True

 

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit9: TEdit;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
  private
    { Private declarations }
    FCampo1,
    FCampo2: Double;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  // verifica se a tecla pressionada é a tecla ENTER,
  //        conhecida pelo Delphi como #13
  if key = #13 then
     begin
       // se for, passa o foco para o próximo campo,
       //      zerando o valor da variável Key
       Key := #0;
       Perform(Wm_NextDlgCtl,0,0);
     end;
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FCampo1 := StrToFloat(Edit1.Text);
end;

procedure TForm1.Edit2Exit(Sender: TObject);
begin
  FCampo2 := StrToFloat(Edit2.Text);
  Edit3.Text := FloatToStr(FCampo1 * FCampo2);
  Edit9.Text := Edit3.Text;
end;

end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Qual erro ocorre? O código exemplo do colega acima só funciona se você preencher o Edit1 e depois o Edit2, disparando a carga do edit3 na saída do Edit2.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na Propriedade KeyPrewiew coloquei True.(Form1) não há outro form.

 

este form fiz separado (um novo para teste)

 

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Edit9: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    BtFechar: TButton;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit1Exit(Sender: TObject);
    procedure BtFecharClick(Sender: TObject);
  private
    { Private declarations }
    FCampo1,
    FCampo2: Double;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin

if Key = #13 then
    begin
       Key := #0;
    Perform(WM_NEXTDLGCTL,0,0);
    end;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
  FCampo1 := StrToFloat(Edit1.Text);
end;

procedure TForm1.Edit2Exit(Sender: TObject);
begin
  FCampo2 := StrToFloat(Edit2.Text);
  Edit3.Text := FloatToStr(FCampo1 * FCampo2);
  Edit9.text := Edit3.Text;
End; 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sombrio-SC, o problema não está no código, mas talvez na forma que está efetuando os testes... duas coisas: 1°) você entendeu o código que copiou e como ele funciona? 2º) Seu tab order está configurado para navegar do edit1 para o 2 e depois para o 3? Se não estiver, quando der o enter provavelmente ele vai sair saltando por componentes de forma desordenada, o que vai dificultar o seu teste usando enters...

 

Agora, o código em si não tem erro... desde que o valor do edit1 esteja preenchido de forma válida, quando você informar algo no edit2 e sair do edit2 você vai ter o resultado calculado no edit3.

 

Debug o código para acompanhar passo a passo o que ta ocorrendo.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sombrio-SC

 

Os códigos acima estão certos mas, você pode tentar de outro modo:

Na propriedade Keypress tanto do edit1 e do esdit2.

No Keypress do edit1;

if key = #13 then

begin

FCampo1 := StrToFloat(Edit1.Text);

Edit2.SetFocus;

end;

 

No Keypress do edit2;

if Key = #13 then

begin

FCampo2 := StrToFloat(Edit2.Text);

Edit3.Text := FloatToStr(FCampo1 * FCampo2);

Edit9.Text := Edit3.Text;

Edit3.SetFocus

end;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Colega, falha minha no código anterior, contém um erro:

Você cria uma terceira variável com o nome 'total : real';

 

No Keypress do edit2;

if Key = #13 then

begin

FCampo2 := StrToFloat(Edit2.Text);

total := FCampo1 * FCampo2;

Edit3.text := FloatToStr(total);

Edit9.Text := Edit3.Text;

Edit3.SetFocus

end;

 

Assim eu acho que vai dar certo, pois ainda não testei, foi só de cabeça

Compartilhar este post


Link para o post
Compartilhar em outros sites

[quote name='wllf' date='16 outubro 2009 - 11:23 ' timestamp='1255703001' post='1407222']
[u]Moderador desculpe mas não sei como se coloca em código[/u]


Olá Wllf, 

Fiz assim:
[code]
unit Unit10;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    private
    { Private declarations }
    FCampo1,
    FCampo2: Double;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  total: real;
implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
key :=#0;
Perform(WM_NextDlgCtl,0,0);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
FCampo1 := StrToFloat (Edit1.Text);

end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin
FCampo2 := StrToFloat (Edit2.Text);

end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
FCampo1 :=StrToFloat(Edit1.Text);
Edit2.SetFocus;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
FCampo2:=StrToFloat(Edit2.Text);
total:= FCampo1 * FCampo2;
Edit3.Text:=FloatToStr(Total);
Edit3.SetFocus;
end;

end.

Mandei Rodar, Rodou sem erros, porém só posso digitar 1 unico digito na edit1 ( por exemplo se digitar 10, o 1 fica na edit1 e o zero na edit2 e o total fica zero, digitei 5 na edit1 e 5 na edit2 e não calculou, o resultado foi zero. O Anterior estava dando o beep quando teclava enter, agora já não. Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema está na codificação dos seus Keypress... uma questão que levanto vendo seu código é: você está entendendo o que o seu código está fazendo atualmente?

 

Vamos analisar este keypress...

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
if key = #13 then 
FCampo1 :=StrToFloat(Edit1.Text); 
Edit2.SetFocus; 
end; 

Da forma como está codificando, você está dizendo ao seu programa o seguinte:

 

Se no Edit1 for pressionado o enter (#13), então FCampo1 recebe o valor do Edit1.text, senão não faça nada.
Sete o foco no Edit2
Fim.

Ou seja... você nunca vai popular o valor das variáveis que usa nos cálculos, a menos que tecle um enter nos edits após ter digitado os dados neles... mas como tem um setfocus ali, o que acontece? Você digita um valor qualquer e imediatamente o foco muda pro próximo edit. Acredito que o que quer fazer é trocar o foco de edit ao dar um enter e carregar o valor da variável global ao mesmo tempo, não é mesmo? Se for, o código correto seria este para o Keypress em questão:

 

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin 
   if key = #13 then 
   begin
      FCampo1 :=StrToFloat(Edit1.Text); 
      Edit2.SetFocus; 
   end;
end; 

Dê uma analisada nos outros keypress e verá que tem os mesmos problemas de lógica na montagem.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Imagem Postada Senhores, Muito Obrigado !!! Agora deu certo ficou assim e funcionando:

 

unit Unit10;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Exit(Sender: TObject);
    procedure Edit2Exit(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit2KeyPress(Sender: TObject; var Key: Char);
    private
    { Private declarations }
    FCampo1,
    FCampo2: Double;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  total: real;
  Fcampo1: real;
  FCampo2: real;
implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
key :=#0;
Perform(WM_NextDlgCtl,0,0);
end;

procedure TForm1.Edit1Exit(Sender: TObject);
begin
FCampo1 := StrToFloat (Edit1.Text);

end;
procedure TForm1.Edit2Exit(Sender: TObject);
begin
FCampo2 := StrToFloat (Edit2.Text);

end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
begin
FCampo1 :=StrToFloat(Edit1.Text);
Edit2.SetFocus;
end;
end;

procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
if key = #13 then
FCampo2:=StrToFloat(Edit2.Text);
total:= FCampo1 * FCampo2;
Edit3.Text:=FloatToStr(Total);

end;


end.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.