Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Ayuda a crear edit con sus propias politicas (https://www.clubdelphi.com/foros/showthread.php?t=82465)

bigguntm 09-03-2013 16:43:04

Ayuda a crear edit con sus propias politicas
 
Hola a toda la comunidad, voy a tomar el ejemplo ya puesto, si deseo introducir la Cédula: V-12.837.967, yo quisiera que al colocar 'V' se marque automaticamente '-' luego coloco '12' y automaticamente '.', asi sucesivamente, en mi caso seria MEP-04598-005. Al colocar 'MEP' se marque '-' y que no se pueda volver a colocar una letra, osea que el Maximo de las letras sea tres. y luego que la letra sea introducida, se pueda comenzar a introducir los numeros. ejemplo, coloco '04598' y se marca automaticamene '-' para colocar los ultimos 3 numeros, esto fue lo que se me ocurrio, pero no funciona correctamente,

Código Delphi [-]
 procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
 begin if StrLen( PChar(Edit2.Text) ) < 3 then
  if not( key in [#8,'m','e','p','-']) then    
begin
    MessageBeep(MB_ICONERROR);
    key := #0;  
if StrLen( PChar(Edit2.Text) ) > 3 then
  if not( key in [#8,'0'..'9','-']) then
begin   
MessageBeep(MB_ICONERROR);
key := #0;
  end;
 end; 
end;


Saludos

ecfisa 09-03-2013 17:16:01

Hola bigguntm.

Creo que una alternativa mas simple le daría solución a tu problema, usar un TMaskEdit.

Por ejemplo:
Código Delphi [-]
procedure TForm.FormCreate(Sender: TObject);
begin
  with MaskEdit1 do
  begin
    Text     := '';
    EditMask := 'LLL-00000-000; ; ';
    CharCase := ecUpperCase;
  end;
end;

Saludos.

nlsgarcia 09-03-2013 19:19:15

bigguntm,

Cita:

Empezado por bigguntm
Ayuda a crear edit con sus propias politicas...en mi caso seria MEP-04598-005...

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

interface

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

type
  TForm1 = class(TForm)
    MaskEdit1: TMaskEdit;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
   MaskEdit1.EditMask := 'MEP-00000-000;1;_';
end;

end.
El código anterior permite ingresar solo números en un control TMaskEdit con un formato de mascara predefinido en la propiedad EditMask configurada según tu requerimiento. Como se comento en el Msg #2 esta solución es más fácil de implementar.

Revisa estos links:

Espero sea útil :)

Nelson.

bigguntm 09-03-2013 23:04:07

Son unos duros en la programacion, cualquiera de los dos funciona correctamente, pero tengo un detallito, el MaskEdit deberia de habilitar el btnCalculate cuando llene todo los caracteres,
Código Delphi [-]

if StrLen( PChar(Edit2.Text) ) > 12 then //al Maskedit le puse como name Edit2.Text
btnCalculate.Enabled := true;

if StrLen( PChar(Edit2.Text) ) < 13 then
btnCalculate.Enabled := false;
end;

ese code me funciona fino en un Edit, pero el problema de el MaskEdit esq siempre esta lleno.. un ejemplo de eso, MEP-_____-___ o MEP- - , yo borro, y lo que hace es retroceder. Y si lo pongo

Código Delphi [-]
if not StrLen( PChar(Edit2.Text) ) = 13 then 
btnCalculate.Enabled := false;

entonces siempre estaria habilitado ya que cuenta los '_' , ' ', '.' ... Saludos

ecfisa 10-03-2013 00:00:32

Hola bigguntm.

Proba de este modo:
Código Delphi [-]
...
procedure TForm1.FormCreate(Sender: TObject);
begin
  with MaskEdit1 do
  begin
    EditMask  := 'LLL-00000-000;0; ';
    CharCase  := ecUpperCase;
    Text      := '';
    MaxLength := 12;
  end;
end;

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  with MaskEdit1 do 
    btnCalculate.Enabled:= SelStart = 12;
end;
...

Saludos.

ecfisa 10-03-2013 00:43:55

Hola de nuevo.

Me quedó rondando en la cabeza y si... El código anterior, provoca un efecto no deseado cuando se presiona Backspace u otra tecla más allá del caracter 12.

Mejor es:
Código Delphi [-]
procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
  with Sender as TMaskEdit do
    if SelStart < 13 then
      btnCalculate.Enabled:= (SelStart = 12) and (key <> #8);
end;

Saludos.

nlsgarcia 10-03-2013 01:18:07

bigguntm,

Cita:

Empezado por bigguntm
...el MaskEdit deberia de habilitar el btnCalculate cuando llene todo los caracteres...

Revisa este código:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
   MaskEdit1.EditMask := 'MEP-00000-000;0;_';
end;

procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
   if Length(MaskEdit1.Text) = 8 then
      Button1.Enabled := True;
end;
Este código establece a True la propiedad enabled de un control TButton al ingresar todos los caracteres numéricos en el control TMaskEdit.

Nota: La longitud del control TMaskEdit es 8 dado que esta basada en la longitud de los caracteres de entrada. Si posteriormente requieres el valor entrado con su Mascara de Edición puedes aplicar el siguiente código:
Código Delphi [-]
...
var
   s : String;
begin
   s := Format('MEP-%s-%s',[Copy(MaskEdit1.Text,1,5),Copy(MaskEdit1.Text,1,3)])
end;
Espero sea útil :)

Nelson.

alsn 10-03-2013 10:54:12

Otra posibilidad:

Código Delphi [-]
procedure TForm1.MaskEdit1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  btnCalculate.Enabled := Pos(' ',TMaskEdit(Sender).Text) = 0;
end;

Saludos

ricardopl65 10-03-2013 16:11:51

prueba esto
 
para que funcione el segundo campo de la propiedad EditMask debe ser 0
EditMask := 'LLL-00000-000;0; ';

Código Delphi [-]
if trim(maskEdit1.EditText)<>'' then 
button1.enabled:=true else
button1.enabled:=false;

bigguntm 11-03-2013 19:40:26

Hola a todos, gracias a todos por responder, el codigo quedo asi..

Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
      with Edit2 do
  begin
    Text     := '';
    EditMask := 'MEP-00000-000;0; ';
    CharCase := ecUpperCase;

Código Delphi [-]
procedure TForm1.Edit2Change(Sender: TObject);
begin
   if Length(Edit2.Text) = 8 then
      btnCalculate.Enabled := True else
      btnCalculate.Enabled := false;

Código Delphi [-]
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
begin
  with Sender as TMaskEdit do
    if SelStart < 13 then
      btnCalculate.Enabled:= (SelStart = 12) and (key <> #8);

Todo anda perfecto, si MaskEdit no tiene los 8 numeros ingresados el btnCalculate esta en false, y si ingresamos los 8 digitos se habilita, esto lo hace Edit2Change, entonces si MEP-56456-456, y borramos el (5), MEP-56456-4_6, el btnCalculate queda habilitado, por eso se usa el Edit2KeyPress, quien hace vulnerable ese efecto, hasta ahi todo funciona correctamente, pero coloco MEP-56456-456, el btn queda habilitado, presiono el btnCalculate, luego le borro el ultimo numero MEP-56456-45_, y cierro el form en btnExit(KillTask), me da una funcion no deseada(error)! lo solucione con

Código Delphi [-]
procedure TForm1.btnExitMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Edit2.Text     := ' ';
end;

Gracias y Saludos

bigguntm 14-03-2013 22:33:48

hola a todos de nuevo, el problema que creí haber solucionado, con..
Código Delphi [-]
procedure TForm1.btnExitMouseMove(Sender: TObject; Shift: TShiftState; X,   Y: Integer); begin Edit2.Text     := ' '; end;
se convirtió en un problemon.. ejejejeje

Ahora me da error por casi todo, cuando quedaban con los numeros incompletos, lo logre solucionar con otros maskedit que me enviara la informacion cuando estos queden incompletos, pero necesito que solo se pueda escribir desde el comienzo del edit, cuando haga click y marqe un numero se ingrese al primer campo,
Código Delphi [-]
length(edit1.text) = 0
ya que si se escribe desde cualquier length ejemplo.. MEP-_____-__5 me habilita el btnCalculate,, ='S Disculpen la molestia, saludos

ecfisa 14-03-2013 23:01:08

Hola bigguntm.
Cita:

Empezado por bigguntm (Mensaje 456839)
,.. y cierro el form en btnExit(KillTask), me da una funcion no deseada(error)! ...

Realmente no logro entender claramente la situación, he probado el código:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  with MaskEdit1 do
  begin
    EditMask  := 'LLL-00000-000;0; ';
    CharCase  := ecUpperCase;
    Text      := '';
    MaxLength := 12;
  end;
  btnCalculate.Enabled:= False;
end;

procedure TForm1.MaskEdit1KeyPress(Sender: TObject; var Key: Char);
begin
   with Sender as TMaskEdit do
    if SelStart < 13 then
      btnCalculate.Enabled:= (SelStart = 12) and (key <> #8);
end;
Parece funcionar correctamente y no recibo ningún mensaje de error al cerrar el form, ¿ A que componente corresponde el evento que mencionas y cuál es el código existente en btnExit ?

Cita:

Empezado por bigguntm (Mensaje 456839)
...
pero necesito que solo se pueda escribir desde el comienzo del edit, cuando haga click
...

Para ese punto podes hacer:
Código Delphi [-]
procedure TForm1.MaskEdit1Click(Sender: TObject);
begin
  (Sender as TMaskEdit).SelStart:= 0
end;

Saludos.

roman 14-03-2013 23:27:45

Hola,

Creo que la comprobación para habilitar/inhabilitar el botón puede hacerse únicamente usando el evento OnChange del MaskEdit:

Código Delphi [-]
procedure TForm1.MaskEdit1Change(Sender: TObject);
var
  IsValid: Boolean;

begin
  IsValid := true;

  try
    MaskEdit1.ValidateEdit;
  except
    on EDBEditError do
      IsValid := false;
  end;

  btnCalculate.Enabled := IsValid and (Length(MaskEdit1.Text) = 8);
end;

Cuando se llena el MaskEdit, y luego se le borran caracteres, MaskEdit.Text está "lleno" pero es inválido.

Por otra parte, también puede optarse por usar dos controles TEdit para capturar cada una de las partes.

// Saludos

bigguntm 15-03-2013 02:12:24

Cita:

Parece funcionar correctamente y no recibo ningún mensaje de error al cerrar el form, ¿ A que componente corresponde el evento que mencionas y cuál es el código existente en btnExit ?
lo que pasa es que yo tambien le agregue al Onchange del Edit
Código Delphi [-]
if Length(Edit1.Text) = 8 then
btnCalculate.Enabled = true else
btnCalculate.Enabled = false:

el btnExit contine
Código Delphi [-]
KillTask(miProject):

pero no solo cuando presiono btnExit me da el error, tambien cuando presiono los listbox, otros edits, y memos de mi project, el error sale cuando no termino de escribir en el Maskedit , ejemplo MEP-6____-___.. y hago click en otro lado..

no se si eso tenga que ver, pero con el codigo de escribir, siempre desde el comienzo del edit, pudiera estar listo, manana cuando este en mi pc pruebo el code.. y el de roman, Saludos

ecfisa 15-03-2013 05:12:56

Cita:

Empezado por roman (Mensaje 456845)
Creo que la comprobación para habilitar/inhabilitar el botón puede hacerse únicamente usando el evento OnChange del MaskEdit

Es muy probable que estés acertado, al menos veo que resulta mucho más simple desde allí. Por otro lado tengo que destacar que me resultó muy novedoso el código con que encaraste la comprobación ^\||/.

Otra opción que se me ocurre, esta vez usando el evento OnChange, es:
Código Delphi [-]
procedure TForm1.MaskEdit1Change(Sender: TObject);
begin
  btnCalculate.Enabled:= Length(StringReplace(MaskEdit1.Text, ' ', '', [rfReplaceAll])) = 11;
end;

Saludos. :)

bigguntm 15-03-2013 15:33:23

listo solucione con el escribir desde el principio, les dejo una copia del proyecto para que vean,

http://www.4shared.com/rar/LJuAP5kN/Cal.html

Saludos.

ecfisa 15-03-2013 17:40:02

Hola bigguntm.

Me tomé el atrevimiento de componer el enlace, que por el número de tus mensajes no te está permitido, para que de este modo sea más sencillo acceder a él.

Saludos. :)

roman 15-03-2013 18:43:23

Creo que sería adecuado que pusieras aquí la solucuión final, ya que se desarrolló aquí. Por otra parte, ese servicio de descargas me pide un número de celular lo cual no me parece correcto.

// Saludos


La franja horaria es GMT +2. Ahora son las 05:02:59.

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