Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   TEdit, evitar copiar y pegar violación en memoria al cerrar formulario (https://www.clubdelphi.com/foros/showthread.php?t=79790)

novato_erick 10-08-2012 19:23:13

TEdit, evitar copiar y pegar violación en memoria al cerrar formulario
 
Hola a todos.

Encontré un hilo del foro muy interesante el cual quise implementarlo en el proyecto sin embargo pasa algo curioso:

Este es el ejemplo en código:
Código Delphi [-]
procedure TfrmIArticulo.MiWindowProc(var Message: TMessage);

begin
  case Message.Msg of
    WM_COPY, WM_PASTE:
  begin
      ShowMessage('No puede Copiar ni Pegar');
  end
    else
      frmIArticulo.AntWindowProc(Message);
  end
end;

ok segun la sugerencia en esto hilo http://www.clubdelphi.com/foros/show...iar+pegar+Edit dicen que puedo utilizar este procedimiento llamándolos desde los eventos; En este caso yo utilizo DBEDIT de esta forma:

Código Delphi [-]
procedure TfrmIArticulo.dbedtCod_BarraKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
AntWindowProc := dbedtCod_Barra.WindowProc;
dbedtCod_Barra.WindowProc := MiWindowProc;
end;

al final este me cierra la aplicacion de forma y si lo pongo en el evento onShow de formulario me manda el mansaje : de no se puede copiar ni pegar pero al cerrar el formulario me manda ---------------------------
Yanelis
---------------------------
Access violation at address 006F5B95 in module 'Yanelis.exe'. Read of address 000003DC.
---------------------------
Aceptar
---------------------------

al final he tratado de que mi formulario se comporte correctamente y nada.


Saludos a todos


novato_erick

roman 10-08-2012 19:31:17

Creo que estás enredando los mensajes del otro hilo. Un procedimiento como MiWindowProc nunca se manda llamar explícitamente en código. ¿Qué es exactamente lo que quieres lograr?

// Saludos

novato_erick 10-08-2012 19:33:02

Gracias Roman por tu atención:

Simple evitar que en los dbedit se pueda copiar y pegar...


Saludos

roman 10-08-2012 19:41:42

A ver, el código

Código Delphi [-]
AntWindowProc := dbedtCod_Barra.WindowProc;
dbedtCod_Barra.WindowProc := MiWindowProc;

debes ponerlo en el OnCreate del formulario.

En el evento OnDestroy del formulario pones:

Código Delphi [-]
dbedtCod_Barra.WindowProc := AntWindowProc;

Finalmente, deja así el método MiWindowProc:

Código Delphi [-]
procedure TfrmIArticulo.MiWindowProc(var Message: TMessage);
begin
  case Message.Msg of
    WM_COPY, WM_PASTE:
      ShowMessage('No puede Copiar ni Pegar')
    else
      AntWindowProc(Message); // Aquí quité frmIArticulo
  end
end;

// Saludos

novato_erick 10-08-2012 19:51:17

Mil gracias roman por tu atencion nuevamente pero aun tengo mis dudas a ver si me puedes resolver.

a que se refiere con:

Cita:

"Un procedimiento como MiWindowProc nunca se manda llamar explícitamente en código"

y tengo 4 dbedit que quiero que me haga lo mismo cual seria tu sugerencia?

Saludos...

roman 10-08-2012 19:58:18

Ese tipo de procedimientos, sólamente se registran en Windows, y es éste quien los llama cuando hay algún evento que notificar. Es decir, que el código que pongas ahí, sí se va a ejecutar, pero lo hace directamente el sistema opertaivo y no tu código.

Lo de los 4 dbedit, pues primro pueba si funciona con uno y ya luego vemos el resto ;)

// Saludos

novato_erick 10-08-2012 20:01:28

si claro ya funciono :Den el primer DBEdit...

Saludos...

ecfisa 11-08-2012 02:20:13

Hola.

Otro enfoque, tal vez un poco menos elegante, puede ser:
Código Delphi [-]
...
implementation

procedure TForm1.DBEditContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin
  Handled:= True;
end;

procedure TForm1.DBEditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
  Msg: TMsg;
begin
  if ((Shift = [ssCtrl] ) and (Key = Ord('V'))) then  // Ctrl+V
    PeekMessage(Msg, 0, WM_CHAR, WM_CHAR, PM_REMOVE);
  if (Shift = [ssShift])and(Key = VK_INSERT) then     // Shift+Insert
    Key:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i:= 0 to ComponentCount-1 do
    if Components[i] is TDBEdit then
    begin
      TDBEdit(Components[i]).OnContextPopup:= DBEditContextPopup;
      TDBEdit(Components[i]).OnKeyDown:= DBEditKeyDown;
    end;
end;
...

Saludos.

novato_erick 12-08-2012 17:23:19

Cita:

Hola.

Otro enfoque, tal vez un poco menos elegante, puede ser:
eficsa Gracias por tu enfoque es interesante aunque sabemos que un usuario si no le aparece un comportamiento que es acostumbrado nos dicen: "El sistema no Sirve".... Así que para darle un poco de colorido agregue algo en este procedimiento simple de novato como mi persona pero da un toque a tu código eficsa.

Código Delphi [-]
procedure TfrmIngresoCliente.DBEditContextPopup(Sender: TObject; MousePos: TPoint; var Handled: Boolean);
begin
   showmessage ('no se pertime tal cosa');// Este mensaje es lo diferente nada mas...
   Handled:= true;
end;

Pero hay algo que me gustaría arreglar... quiero que ese comportamiento solamente se de en ciertos dbedit por ejemplo en Dos Edit no e todo el form. trate desde los eventos de cada DBEdit que necesito pero nada.


que me sugieres?


//Saludos

ecfisa 12-08-2012 19:19:20

Hola.

Podes agregarle los eventos sólo a los edits que desees. Ya sea por código como en el ejemplo que te puse, o desde el Object Inspector en tiempo de diseño.

Saludos.


La franja horaria es GMT +2. Ahora son las 13:41:48.

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