Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Verificar Numeros Pegados (https://www.clubdelphi.com/foros/showthread.php?t=62827)

Ðαяισš 16-01-2009 08:59:29

Verificar Numeros Pegados
 
Hola :D

Otra ves tengo dudas..
Esta ves trata en como hacer para que al dar click a un boton pegue lo que esta copiado en "Clipboard"
pero el problema no es para pegar.. sino para que al pegar verifique si las letras y numeros pegados son Hexadecimales
Si no lo son entonces de un aviso como un mensaje que diga:

Los Numeros pegados no son valida, Solo se permiten numeros hexadecimales.

Código Delphi [-]
procedure TForm.PegarClick(Sender: TObject);
begin
Edit1.Clear;
Edit1.PasteFromClipboard;
// aqui iria la comprobacion de los numeros Hexadecimales 
// Por Defecto [0..1] [a..f] [A..F] si no es correcto iria esto:
raise exception.Create(''''+Key+'''' + ' Es Incorrecto, Solo Se Permiten Numeros Hexadecimales');
end;

Alguien Tiene idea de como hacer ello?

Gracias Por sus respuestas (A quienes lo hagan :) )

roman 16-01-2009 18:06:36

El problema aquí es que no tienes forma directa de decirle al método PasteFromClipboard cuál debe ser el formato correcto.

Una solución pasa por usar el objeto Clipboard (de la unidad ClipBrd) para obtener el contenido del portapapeles directamente, analizarlo y actuar en consecuencia:

Código Delphi [-]
{$hints off}
(*
  Determina si la cadena dada corresponde a un número hexadecimal
*)
function isHexNumber(S: String): Boolean;
var
  V, Code: Integer;

begin
  Val('$' + S, V, Code);
  Result := Code = 0;
end;
{$hints on}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Verificamos primero que el portapapeles tenga texto
  if Clipboard.HasFormat(CF_TEXT) and isHexNumber(Clipboard.AsText) then
    Edit1.Text := Clipboard.AsText
  else
    raise Exception.Create('Formato incorrecto');
end;

Sin embargo, esto sólo te servirá si pegas el texto explícitamente mediante el botón. Pero no impides que se pegue directamente con Ctrl+V o Shift+Ins o el menú contextual. Para esto, tendrías que interceptar el mensaje WM_PASTE que el S.O manda al control de edición cuando se pega texto desde el portapapeles.

Lo ideal para ello sería crear un componente derivado de TEdit que implemente un manejador para dicho mensaje. Pero también puedes hacerlo 'al vuelo' reemplazando el procedimiento de ventana (el encargado de procesar los mensajes) del Edit como muestro a continuación:

Código Delphi [-]
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
  private
    OldEditWndProc: TWndMethod;
    procedure EditWndProc(var Message: TMessage);
  end;

implementation

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Guardamos una referencia al procedimiento original
  OldEditWndProc := Edit1.WindowProc;

  // Reemplazamos el procedimiento por uno nuestro
  Edit1.WindowProc := EditWndProc;
end;

procedure TForm1.EditWndProc(var Message: TMessage);
begin
  // Si recibimos el mensaje de pegado y el portapapeles tiene texto
  if (Message.Msg = WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then
  begin
    // Lanzamos la excepción si el portapapeles no tiene un número hexadecimal
    if not isHexNumber(Clipboard.AsText) then
      raise Exception.Create('Formato incorrecto');
  end;

  // Llamamos al procedimiento original para no alterar el comportamiento del Edit.
  OldEditWndProc(Message);
end;

// Saludos

Ðαяισš 18-01-2009 16:09:07

No Sirvio
 
:( el codigo no sirvio.. me dice que "Clipboard" no esta definido.. :S:S

que es ClipBoard??

Aqui el una foto con el error :(...



Espero Puedas Ayudarme Denuevo. Gracias :D

Delphius 18-01-2009 18:48:59

NO he probado el código de roman, pero intuyo que está bien;). Tu error se debe a que no añadiste a uses la unidad ClipBrd. Y eso que lo ha dejado dicho roman:

Cita:

Una solución pasa por usar el objeto Clipboard (de la unidad ClipBrd)
Saludos,

Ðαяισš 19-01-2009 06:36:54

Bien Delphius anda muy bien.. gracias. ;)


La franja horaria es GMT +2. Ahora son las 17:29:09.

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