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}
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
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
OldEditWndProc := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;
end;
procedure TForm1.EditWndProc(var Message: TMessage);
begin
if (Message.Msg = WM_PASTE) and Clipboard.HasFormat(CF_TEXT) then
begin
if not isHexNumber(Clipboard.AsText) then
raise Exception.Create('Formato incorrecto');
end;
OldEditWndProc(Message);
end;
// Saludos