Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Orden Clear me manda de nuevo al pricipio del procedimiento (https://www.clubdelphi.com/foros/showthread.php?t=88091)

alexglez1255 11-04-2015 03:11:02

Orden Clear me manda de nuevo al pricipio del procedimiento
 
Hola jovenes tengo una pregunta, tengo este codigo


Código Delphi [-]
procedure Taltadecontratos.edtBuscarCteChange(Sender: TObject);
var
 cadenaAbuscar: string;
 codcliente:Integer;
begin

  if (cmbBusqCte.ItemIndex=1) then
    DBGrid1.Visible:=True
  else
    DBGrid1.Visible:=False;
  CadenaAbuscar:=edtBuscarCte.Text;

  if (cmbBusqCte.ItemIndex<>1)and(CadenaAbuscar<>'') and (not TryStrToInt(cadenaAbuscar,codcliente)) then
  begin
   ShowMessage('En el campo de Codigo solo puede escribir numeros, ponga cuidado por favor');
   edtBuscarCte.Clear;
   exit;
//   raise Exception.Create(
//  'Solo introducir numeros por favor para buscar en campo de '+cmbBusqCte.Text);
  end;

//Buscar numero de cliente

  if cmbBusqCte.ItemIndex=0 then
  logicanegocio.CDSclieCOD.Locate('COD_CLIENTE',edtBuscarCte.Text,[loPartialKey]);
  if cmbBusqCte.ItemIndex=1 then
  begin
    logicanegocio.CDSclieCOD.Locate('CLIENTE',edtBuscarCte.Text,[loPartialKey]);

    with logicanegocio.CDSclieCOD do
    begin
      Filtered := False;
      Filter   := Format( 'CLIENTE LIKE %s ', [ QuotedStr(edtBuscarCte.Text + '%' ) ] );
      Filtered := True;
    end;
 end;
end;

En este codigo cuando se escribe numeros en el campo manda un mensaje de error, luego le hago un edtbuscarCte.clear
para borrar los datos pero la cosa es que en ves de esperar otra ves captura del operador me ejecuta de nuevo el procedure... que puedo hacer para que no se ejecute de nuevo el procedimiento ya que el clear me hace que se autoejecute..gracias

ecfisa 11-04-2015 05:38:54

Cita:

Empezado por alexglez1255 (Mensaje 491147)
Hola jovenes tengo una pregunta,...

Se agrace... :)

Es inevitable que el uso del método Clear dispare el evento OnChange ya que el contenido del TEdit cambia. Y si esto lo haces dentro del evento OnChange....

Una forma de que funcione ( aunque me desagrada en absoluto ) es desasignar el evento antes de la llamada al método Clear y reasignarlo luego:
Código Delphi [-]
procedure Taltadecontratos.edtBuscarCteChange(Sender: TObject);
var
  tn : TNotifyEvent;
  tmp: Integer;
begin
  width logicanegocio do
  begin
    case cmbBusqCte.ItemIndex of
      0: begin
           if not TryStrToInt(edtBuscarCte.Text, tmp) then
           try
             ShowMessage('En el campo de Codigo solo puede escribir numeros');
             tn := edtBuscarCte.OnChange;  // guardar 
             edtBuscarCte.OnChange:= nil;  // desasignar
             edtBuscarCte.Clear;           // borrar
             Exit;
           finally
             edtBuscarCte.OnChange := tn;  // reasignar
           end;
           CDSclieCOD.Locate( 'CUSTNO', edtBuscarCte.Text,[loPartialKey] );
         end;
      1: begin
           DBGrid1.Visible := True;
           CDSclieCOD.Locate( 'COMPANY', edtBuscarCte.Text,[loPartialKey] );
           CDSclieCOD.Filtered := False;
           CDSclieCOD.Filter   := Format( 'COMPANY LIKE %s ', [ QuotedStr(edtBuscarCte.Text + '%' ) ] );
           CDSclieCOD.Filtered := True;
         end;
    end;
  end;
end;

Lo que yo haría es avisar del error y dejar que el usuario lo corrija:
Código Delphi [-]
procedure Taltadecontratos.edtBuscarCteChange(Sender: TObject);
var
  tmp: Integer;
begin
  width logicanegocio do
  begin
    case cmbBusqCte.ItemIndex of
      0: begin
           if not TryStrToInt(edtBuscarCte.Text, tmp) then
           begin
             ShowMessage('En el campo de Codigo solo puede escribir numeros');
             edtBuscarCte.SetFocus;
             Exit;
           end;
           CDSclieCOD.Locate( 'COD_CLIENTE', edtBuscarCte.Text,[loPartialKey] );
         end;
      1: begin
           DBGrid1.Visible := True;
           CDSclieCOD.Locate( 'CLIENTE', edtBuscarCte.Text,[loPartialKey] );
           CDSclieCOD.Filtered := False;
           CDSclieCOD.Filter   := Format( 'CLIENTE LIKE %s ', [ QuotedStr(edtBuscarCte.Text + '%' ) ] );
           CDSclieCOD.Filtered := True;
         end;
    end;
  end;
end;
Por otro lado, el primer código es poco amable con el usuario. Imagina que lleva ingresado: 0123456789a.
¿ Por que borrarle todo el contenido si solo tiene un caracter erroneo ?

Saludos :)

nlsgarcia 11-04-2015 16:30:21

alexglez1255,

Cita:

...hago un edtbuscarCte.clear para borrar los datos...Orden Clear me manda de nuevo al principio del procedimiento edtBuscarCteChange...
:rolleyes:

Revisa esta información:



El método Clear del TEdit, dispara el evento OnChange al producirse un cambio en el contenido del TEdit.

Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    edtBuscarCte: TEdit;
    procedure edtBuscarCteKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.edtBuscarCteKeyPress(Sender: TObject; var Key: Char);
begin
   if not (Key in ['0'..'9',#8]) then
      Key := #0;
end;

end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Solo permite la entrada de números, tecla de retroceso y flechas de dirección en un TEdit evitando la necesidad de validar dicha entrada por caracteres distintos a dígitos.

Espero sea útil :)

Nelson.

alexglez1255 12-04-2015 04:36:05

muchas gracias ECFISA por sus consejos creo que usare la que le pide que lo reescriba


La franja horaria es GMT +2. Ahora son las 10:20:00.

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