PDA

Ver la Versión Completa : Ayuda a crear edit con sus propias politicas


bigguntm
09-03-2013, 16:43:04
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,

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:

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,


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


Revisa este código:

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:

Input Mask editor
http://docwiki.embarcadero.com/RADStudio/XE3/en/Input_Mask_editor#See_Also

MaskUtils.TEditMask Type
http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/MaskUtils_TEditMask.html

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,


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


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:

...
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:

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,


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


Revisa este código:

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:

...
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:

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
para que funcione el segundo campo de la propiedad EditMask debe ser 0
EditMask := 'LLL-00000-000;0; ';

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..


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



procedure TForm1.Edit2Change(Sender: TObject);
begin
if Length(Edit2.Text) = 8 then
btnCalculate.Enabled := True else
btnCalculate.Enabled := false;



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


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.. 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, 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.
,.. 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:

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 ?


...
pero necesito que solo se pueda escribir desde el comienzo del edit, cuando haga click
...

Para ese punto podes hacer:

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:


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
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

if Length(Edit1.Text) = 8 then
btnCalculate.Enabled = true else
btnCalculate.Enabled = false:


el btnExit contine

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
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:

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