Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cerrar componente RXCalculator, al presionar enter. (https://www.clubdelphi.com/foros/showthread.php?t=74050)

martinartaza 27-05-2011 14:47:57

Cerrar componente RXCalculator, al presionar enter.
 
Hola que tal querido foro, yo de nuevo, estoy renegando con las librerías RX, que están muy documentadas (hace falta aclarar que es sarcasmo).
Lo que quiero hacer es:
1 - Poner un edit que al apretar enter se abra la calculadora [ya está]
2 - Una vez abierta la calculadra que al presionar enter por 2 vez se cierre la misma y me ponga el valor en el edit.
Eh capturado el evento on key de la calculadora eh hice lo necesario para saber cuando presiona enter por segunda vez. Pero no logro hacer que con el uso del teclado la calculadora se cierre, se me ocurrio que podria mandar por teclado la combinacion alt + F4, para obligar a cerrar la calculadora, pero no se como.
Escucho sugerencia.

Nota: Si alguien lo tiene resuelto con el Rxcalcedit, me da lo mismo.

oscarac 27-05-2011 15:52:32

No he tenido la oportunidad de usar ese componente

pero me imagino que debe tener algun evento donde se controle las teclas presionadas tipo (onKeyPress, OnKeyUp, OnKeyDown, etc)

se me ocurre que en ese evento puedas indicarle que se cierre y el resultado almacenarlo en alguna variable Publica para que retorne el valor

martinartaza 28-05-2011 13:59:55

Si el componente tiene el evento onkey
 
En el evento onkey capto cuando presiono enter por segunda vez.

Código Delphi [-]
procedure TForm1.RxCalculator1CalcKey(Sender: TObject; var Key: Char);
begin
// cantenter = 0 en el oncreate del form.
if key = #13 then
   begin
      if cantenter = 2 then
         begin
            //cerrar la calcu
            cantenter:= 0;
         end
      else inc(cantenter);
   end;
end;

Bueno, eso.
Nota: Disculpa que halla demorado en responder pero ayer fue mi cumple y rendi la ultima materia de mi carrera.

martinartaza 30-05-2011 21:14:21

Ya casi, falta destrabar la tecla Alt.
 
Bueno ya está andando pero me queda la aplicación, en realidad todo el windows como si estuviera con la tecla alt presionada, pero uno presiona la tecla alt (y la suelta y ya queda todo bien).

Le muestro el código de ejemplo.

Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RxCalc, StdCtrls, Mask, ToolEdit, CurrEdit;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    RxCalculator1: TRxCalculator;
    procedure RxCalculator1CalcKey(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    CANTENTER: INTEGER;
    valor: Currency;
    banvalor: boolean;
  end;

var
  Form1: TForm1;

implementation

uses ComObj;

{$R *.dfm}

procedure TForm1.RxCalculator1CalcKey(Sender: TObject; var Key: Char);
begin
// Cuando se presiona enter parece ser que interna mente lo transforma en un =  que es #61
if key = #61 then
   begin
   IF CANTENTER = 1 THEN
      BEGIN
        // guardo el valor en la bariable valor
         valor :=  RxCalculator1.CalcDisplay;
         // cierro la calculadora con la tecla ALT + F4
         keybd_event(vk_menu,0,0,0);
         keybd_event(VK_F4,0,0,0);
         CANTENTER:= 0;
      end
   else  inc(CANTENTER);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Inicializo la cantidad de enter a 0
CANTENTER:= 0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// detecto si se presiona un * (con eso abro la calculadora)
if key = #42 then
   begin
   banvalor:= True;
   RxCalculator1.Execute;
   // no uso if RxCalculator1.Execute (debido a que se la
   // cerrara con alt + F4
   end;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   // cuando se levanta la tecla, se borra el * y
   // se pone el valor y luego seteo la bandera.
   Edit1.Clear;
   Edit1.Text:= floattostr(valor);
   banvalor:= False;
end;

end.

Alguien me podría ayudar a desbloquear la tecla ALT.

Nota: este código no lo hubiera podido lograr sin la ayuda de ecfisa, muchas gracias.

martinartaza 30-05-2011 22:14:37

corregido
 
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, RxCalc, StdCtrls, Mask, ToolEdit, CurrEdit;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    RxCalculator1: TRxCalculator;
    procedure RxCalculator1CalcKey(Sender: TObject; var Key: Char);
    procedure FormCreate(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1KeyUp(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    CANTENTER: INTEGER;
    valor: Currency;
    banvalor: boolean;
  end;

var
  Form1: TForm1;

implementation

uses ComObj;

{$R *.dfm}

procedure TForm1.RxCalculator1CalcKey(Sender: TObject; var Key: Char);
begin
if key = #61 then
   begin
   IF CANTENTER = 1 THEN
      BEGIN
         valor :=  RxCalculator1.CalcDisplay;
         keybd_event(vk_menu,0,0,0);
         keybd_event(VK_F4,0,0,0);
         CANTENTER:= 0;
      end
   else  inc(CANTENTER);
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//Inicializo la cantidad de enter a 0
CANTENTER:= 0;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
// detecto si se presiona un * (con eso abro la calculadora)
if key = #42 then
   begin
   banvalor:= True;
   RxCalculator1.Execute;
   // no uso if RxCalculator1.Execute (debido a que se la
   // cerrara con alt + F4
   banvalor:= False;
// con la siguiente linea levanto la tecla alt.
   keybd_event(vk_menu,0,keyeventf_keyup, 0);
   end;
end;

procedure TForm1.Edit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
   // cuando se levanta la tecla, se borra el * y
   // se pone el valor y luego seteo la bandera.
if key = vk_menu then
   begin
   Edit1.Clear;
   Edit1.Text:= floattostr(valor);
   end;
end;

end.


La franja horaria es GMT +2. Ahora son las 21:03:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi