Foros Club Delphi

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

ethangio 15-08-2019 07:56:45

Procedimiento externo
 
Buen día a todos y gracias por la ayuda de antemano.

Tengo un procedimiento llamado "Numero" declarado en mi Form, el cual cuando selecciono el TEdit puedo asignarle éste procedimiento en el evento OnKeyPress.

Código Delphi [-]
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Numero(Sender: TObject; var Key: Char);
begin
  if (pos('.',(Sender as TEdit).Text)=0) then
  begin
    if not CharInSet(Key, ['0'..'9','.',#8]) then key:=#0;
 end
 else
 if not CharInSet(Key, ['0'..'9',#8]) then key:=#0;
end;

end.




Como es un procedimiento que ocuparé en otros Form's, he creado un archivo llamado proc_func.pas y he puesto ahí el procedimiento Numero, en la clausula USES de mi Form puse el archivo proc_func.pas.

La cuestión es que cómo puedo referenciar a ese procedimiento y asignárselo a al evento OnKeyPress del Edit sin tener que poner el código:


Código Delphi [-]
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
   proc_func.Numero(Sender, Key); 
end;

Sino asignárselo de manera directa como en la imagen anterior.


Muchas gracias.

movorack 15-08-2019 17:00:11

Hola, lo que muestras se puede solucionar creando Forms que hereden de otro Form. Pero no se si sea lo correcto del todo. Esas validaciones las puedes hacer usando algún otro componente como el SpinEdit o hasta creando tu propio componente cuya base sea el TEdit (Como en este pequeño ejemplo)

Bueno, de todos modos así puedes hacer lo que quieres:

UFormBase:

Código Delphi [-]
unit UFormBase;

interface

..

type
  TFormBase = class(TForm)
    procedure EsNumero(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  FormBase: TFormBase;

implementation

{$R *.dfm}

{ TForm2 }

procedure TFormBase.EsNumero(Sender: TObject; var Key: Char);
begin
  if (pos('.',(Sender as TEdit).Text)=0) then
  begin
    if not CharInSet(Key, ['0'..'9','.',#8]) then key:=#0;
  end
  else
   if not CharInSet(Key, ['0'..'9',#8]) then key:=#0;
end;

end.

Unit1:
Código Delphi [-]
unit Unit1;

interface

..

type
  TForm1 = class(TFormBase)
    Edit1: TEdit;
    procedure EsNumero(Sender: TObject; var Key: Char);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

//Este procedimiento se puede asociar desde Inspector de Objetos 
procedure TForm1.EsNumero(Sender: TObject; var Key: Char);
begin
  inherited; //Aquí llama el procedimiento TFormBase.EsNumero de UFormBase

  // Comportamiento propio de TForm1
end;

end.

ethangio 15-08-2019 19:42:36

Gracias por tu ayuda [movorack]


Probé con el componente SpinEdit pero no me sirve porque lo que necesito capturar en los TEdit son números reales, no solo enteros. A menos que no haya sabido configurarlo adecuadamente.

Probé con el código que me proporcionarte y no me funcionó, revisé varias veces y no me valida solo números en el procedimiento donde coloco inherited .

Lo que pretendo hacer es no generar más código en los Form's.

Casimiro Notevi 15-08-2019 21:22:05

Propiedad ValueType

movorack 15-08-2019 22:05:26

Cita:

Empezado por Casimiro Notevi (Mensaje 533184)
Propiedad ValueType

Ese es del TJvSpinEdit :D

^\||/^\||/^\||/

Casimiro Notevi 15-08-2019 23:11:30

Cita:

Empezado por movorack (Mensaje 533185)
Ese es del TJvSpinEdit :D

^\||/^\||/^\||/

Pues tendrá que usar ese :D

ethangio 15-08-2019 23:53:23

Cita:

Empezado por Casimiro Notevi (Mensaje 533186)
Pues tendrá que usar ese :D




:D ... Les agradezco de corazón el tiempo que se tomaron para leer este hilo y la ayuda prestada.


Soy de la idea de evitar usar componentes de terceros a menos que sean muy necesarios y en este caso pues creo que no lo es y tendré que hacer en cada Form un evento OnKeyPress para todos los TEdit que requieran la validación :

Código Delphi [-]

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); 
begin

      proc_func.Numero(Sender, Key);
end;


Saludos desde Puebla, México.


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

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