Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Evitar Pegado (https://www.clubdelphi.com/foros/showthread.php?t=27862)

nemesio 02-12-2005 02:50:09

Evitar Pegado
 
Buenas amigos del foro, es la primera vez que escribo. Tengo varios años buecando en el Foro y hasta la fecha todo lo he encontrado, excepto lo siguiente: Necesito bloquear en un edit el Pegado por medio de las teclas: Shift-Ins, Ctrl-V o pegar del Menú contextual. Les agradezco cualquier ayuda.

Héctor Randolph 02-12-2005 05:45:35

Hola nemesio.

Antes que nada te doy la bienvenida al club, si aún no lo has hecho te recomiendo leer la guía de estilo

Respecto a tu pregunta, te muestro un ejemplo en donde se captura el mensaje WM_PASTE de un TEdit y después se cancela.

Se crea un componente TMyEdit con esta característica, podrías crear el componente por separado y registrarlo para que aparezca en la paleta de componentes de Delphi, por ahora te dejo este código para que lo revises.

Código Delphi [-]
type

  {Nuevo edit que no admite pegado}
  TMyEdit = class(TEdit)
  private
    procedure WMPaste(var Message: TMessage); message WM_PASTE;
  end;

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Edit2:TMyEdit;//Instancia de TMyEdit
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Edit2:=TMyEdit.Create(Self);//Componente creado en tiempo de ejecución
  Edit2.Parent:=Self;
  Edit2.Left:=10;//Ubicación en el formulario
  Edit2.Top:=10;
end;

procedure TMyEdit.WMPaste(var Message: TMessage);
begin
  Exit; // Cancelar pegado
end;

Saludos.

dec 02-12-2005 06:31:11

Hola,

Héctor, has hecho que escribiera esta cosa: ;)

Código Delphi [-]
{*******************************************************}
{                                                       }
{  TEdit(Ex) - TEdit en que no puede "pegarse" texto    }
{                                                       }
{  Copyright  (c)  2005  David Esperalta Calderón       }
{                                                       }
{                                                       }
{  Uso: Sitúa esta unidad en la cláusula uses del       }
{       formulario en que hagas  uso de "TEdit's"       }
{       en los que no quieras que pueda "pegarse"       }
{       texto desde el portapapeles de Windows.         }
{                                                       }
{       Has de tener en cuenta de hacerlo antes de      }
{       la unidad "StdCtrls.pas", que  es en donde      }
{       se implementa el componente "TEdit".            }
{                                                       }
{                                                       }
{  Gracias Héctor Randolph por la idea. ;-)             }
{                                                       }
{                                                       }
{  GNU-GPL license - You can use this software under    }
{  the terms of the General Public License (gnu.org)    }
{                                                       }
{*******************************************************}

unit UEditEx;

interface

uses
  StdCtrls, Messages;

type
  TEdit = class(StdCtrls.TEdit)
  private
    procedure WMPaste(var Message: TMessage); message WM_PASTE;
    procedure WMRButtonDown(var Message: TMessage); message WM_RBUTTONDOWN;
  end;

implementation

{ TEdit(Ex) }

procedure TEdit.WMPaste(var Message: TMessage);
begin
end;

procedure TEdit.WMRButtonDown(var Message: TMessage);
begin
end;

end.

dec 02-12-2005 06:44:25

Hola,

O esto otro, vamos: ;)

Código Delphi [-]
{ *********************************************************************** }
{                                                                         }
{ DecComp - Unos sencillos componentes                                    }
{                                                                         }
{ Créditos:                                                               }
{                                                                         }
{ ¡Gracias a Héctor Randolph (1) por la idea!                             }
{                                                                         }
{ (1) www.clubdelphi.com                                                  }
{                                                                         }
{ Copyright (c) 2005 dec - davidesperalta@gmail.com                       }
{ bajo la licencia GNU GPL >> ver en "licencia.txt"                       }
{                                                                         }
{ *********************************************************************** }

unit UNoPastEdit;

interface

uses
  Classes,StdCtrls,Messages;

type
  TNoPastEdit = class(TEdit)
  private
    procedure WMPaste(var Message: TMessage); message WM_PASTE;
    procedure WMRButtonDown(var Message: TMessage); message WM_RBUTTONDOWN;
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('DecComp', [TNoPastEdit]);
end;

{ TNoPastEdit }

procedure TNoPastEdit.WMPaste(var Message: TMessage);
begin
end;

procedure TNoPastEdit.WMRButtonDown(var Message: TMessage);
begin
end;

end.

Delfino 02-12-2005 07:36:32

Si tienes la JVCL , su componente JvEdit tiene la propiedad ClipboardCommands q te permite activar o desactivar todas estas ocpiones..

Héctor Randolph 02-12-2005 08:25:41

Cita:

Empezado por dec
Gracias Héctor Randolph por la idea.

Hola David

No hay nada que agradecer, tú sabes, para eso estamos aquí.


Tengo una sugerencia para tu componente, a ver que te parece.

Código Delphi [-]
type
  TPortapapeles=(cbAllowCut,cbAllowPaste,cbAllowCopy);
  TClipboardOptions=set of TPortapapeles;

  TNoPastEdit = class(TEdit)
  private
    FClipboardOptions: TClipBoardOptions;
  published
    property ClipboardOptions: TClipBoardOptions read  FClipBoardOptions
                                                 write FClipBoardOptions;
  private
    procedure WMPaste(var Message: TMessage); message WM_PASTE;
  end;

implementation

{ TNoPasteEdit }

procedure TNoPastEdit.WMPaste(var Message: TMessage);
begin
  if not (cbAllowPaste in FClipboardOptions) then Exit;
  inherited;
end;

Se puede hacer lo mismo con las opciones copiar y cortar.

Un saludo.

dec 02-12-2005 09:54:09

Hola,

Estupeno Héctor, acabo de actualizar el componente, el cual incluí en DecComp. ¡Muchas gracias! ;)

dec 02-12-2005 09:57:18

Hola,


Cita:

Empezado por Héctor
Se puede hacer lo mismo con las opciones copiar y cortar.

Hum... por hoy lo voy a dejar así, puesto que no he dormido, llevo unas horas liado con cierto tema para WordPress y... en fin, qué te voy a contar,... pero, ya veremos, que dijo un ciego. ¿Pero a qué te refieres, exactamente? ¿Habría que aprovechar otros mensajes o qué? Mira que estoy espesito, como suele decirse... ;)

Héctor Randolph 02-12-2005 10:12:27

Cita:

Empezado por dec
Hum... por hoy lo voy a dejar así, puesto que no he dormido

Amigo, estamos en iguales condiciones, de este lado del planeta son aproximadamente las 03:15 am y llevo dos noches de desvelos.

Cita:

Empezado por dec
¿Pero a qué te refieres, exactamente? ¿Habría que aprovechar otros mensajes o qué?

Solamente me refería a que se puede evitar copiar capturando el mensaje WM_COPY y evitar cortar con el mensaje WM_CUT; de la misma manera que se capturó el mensaje WM_PASTE.

Pero, esa es otra historia.

Un saludo.

dec 03-12-2005 03:53:41

Hola,


Cita:

Empezado por Héctor
Amigo, estamos en iguales condiciones, de este lado del planeta son aproximadamente las 03:15 am y llevo dos noches de desvelos.

Tienes razón Héctor. Acaso he creído que el único que llevada casi dos días sin dormir y decide irse por primera vez en su vida a por setas era yo... ¡con el mundo que hay! Qué egoísta. Otra vez me disculpo de veras. ;)


Cita:

Empezado por Héctor
Pero, esa es otra historia.

Eso pienso yo a bote pronto: partía de una idea sencilla que tú mismo me proporcionaste. De hecho al componente le llamé "NoPastEdit" y no quería ir más allá que lo que en un principio se propuso. Sin embargo tu idea de añadir una propiedad que permita que el componente se comporte de otro modo, en un momento dado, me pareció estupenad y ahí está ya incorporada. Lo demás lo dejaremos para otro momento, o, en fin, cuando alguno lo considere. ;)


La franja horaria es GMT +2. Ahora son las 17:53:15.

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