Ver Mensaje Individual
  #2  
Antiguo 16-01-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Responder Con Cita