Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   key de CTRL+V y de CTRl+C (https://www.clubdelphi.com/foros/showthread.php?t=42359)

fidel 12-04-2007 13:05:03

key de CTRL+V y de CTRl+C
 
Tengo un edit con el siguiente código en el evento OnKeyPress para que admita solo números decimales:
Código Delphi [-]
  //controlar entrada solo números
  if ( StrScan('0123456789.' + chr(7) + chr(8), Key) = nil ) then  Key := #0;
  //cambiar punto decimal por coma
  if key = '.' then key := ',';
  //controlar entrada una sola coma
  for i := 1 to length(EUno.Text) do
    if ( copy(EUno.Text,i,1) = ',' ) and not ( StrScan(',', Key) = nil ) then  Key := #0;
Esto me impide copiar y/o pegar en el edit, pero necesito poder hacerlo.

He pensado poner una condición algo así:

If (key = 'VK_KeyDeCtrl+V) or (key = 'VK_KeyDeCtrl+C) then
....controlar valor pegado
else
... control entrada solo números

¿ key de CTRL+V y de CTRl+C ?, o algún sitio donde pueda buscarlas.

Gracias.

Neftali [Germán.Estévez] 12-04-2007 13:31:23

El problema del OnKeyPress es que no te da información extra de teclas de CTRL, ALT,... como hacen por ejemplo el OnKeyDown/OnKeyUp.

La primera opción es ver si puedes cambiar el código a uno de estos eventos.
Si no puedes, la otra opción es utilizar la API para preguntar cómo está en un momento dado una determinada tecla.

GetKeyState o GetKeyboardState te pueden servir.
Para ver cómo se usan puedes revisar este post de Roman.

Ñuño Martínez 12-04-2007 13:36:24

Yo me andaría con ojo, ya que mucha gente (por ejemplo, yo ;)) utiliza las combinaciones [Ctrl]+[Ins] y [Mays]+[Ins] para copiar y pegar (aparte de [Ctrl]+[Supr] para cortar, etc). Creo recordar que también se puede cambiar en la configuración del teclado qué teclas utilizar para estas operaciones.

¿No hay alguna forma de obtener (por ejemplo, del registro) cómo están configuradas estas combinaciones?

seoane 12-04-2007 15:05:05

Creo que estamos confundiendo las cosas, cuando copiamos o pegamos, ya sea usando el menú o utilizando alguna combinación de teclas, lo que llega al edit son los mensajes WM_COPY y WM_PASTE. En ningún momento llegan al edit las pulsaciones de esas teclas porque se procesan por windows mucho antes.

Para controlar cuando, y como, se copia y se pega lo que tenemos que hacer es interceptar los mensajes WM_COPY y WM_PASTE. Se puede hacer de varias maneras, pero ahora mismo se me ocurre que lo podemos hacer sustituyendo el WndProc del edit. Algo así:
Código Delphi [-]
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    AntWindowProc: TWndMethod;
    procedure MiWindowProc(var Message: TMessage);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.MiWindowProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_COPY:
      begin
         // Aqui lo que quieras
      end;
    WM_PASTE:
      begin
         // Aqui lo que quieras
      end;
    else // Si no es ninguno de los anterios llamamos al antiguo WndProc
      AntWindowProc(Message);
  end
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AntWindowProc:= Edit1.WindowProc;
  Edit1.WindowProc:= MiWindowProc;
end;

roman 12-04-2007 18:24:47

Cita:

Empezado por seoane
Creo que estamos confundiendo las cosas, cuando copiamos o pegamos, ya sea usando el menú o utilizando alguna combinación de teclas, lo que llega al edit son los mensajes WM_COPY y WM_PASTE. En ningún momento llegan al edit las pulsaciones de esas teclas porque se procesan por windows mucho antes.

Estoy de acuerdo contigo y el método que propones es, a mi juicio, el correcto, porque ataca la raíz del problema: copiar y pegar. Pero esas pulsaciones no sólo sí llegan al control sino que sí son interceptables y anulables en los eventos OnKeyDown y/o OnKeyUp.

// Saludos

fidel 12-04-2007 19:51:22

Gracias a todos, voy a ponerme con lo que me indicais.

Un saludo.

seoane 12-04-2007 20:41:31

Cita:

Empezado por roman
Pero esas pulsaciones no sólo sí llegan al control sino que sí son interceptables y anulables en los eventos OnKeyDown y/o OnKeyUp.

Caramba, hubiera jurado que se comportaban igual que la tecla TAB. Eso me pasa por no haberlo comprobado :o

fidel 13-04-2007 11:32:09

Lo he solucionado a través del evento OnChange del edit. Controlo que el edit solo pueda admitir números con una coma, y el edit permite copiar y pegar.

Gracias. Un saludo.


La franja horaria es GMT +2. Ahora son las 21:44:42.

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