Mostrando entradas con la etiqueta TEdit. Mostrar todas las entradas
Mostrando entradas con la etiqueta TEdit. Mostrar todas las entradas

domingo, 22 de agosto de 2021

SetFocus y un error muy común.

Casi todos los componentes visuales de Lazarus tienen un procedimiento llamado SetFocus, por lo que es normal que si tenemos 10 TEdit en un Form, queramos que el primero de ellos tenga el "focus", y luego el segundo y así sucesivamente. Y ahí el dicho "code first, think later" o "escribe el código primero, piensa después" se pone de manifiesto cuando intentamos un Edit1.SetFocus en el método FormCreate y tenemos un hermoso error en tiempo de ejecución. ¿Por qué?

[TCustomForm.SetFocus] Form1:TForm1 Can not focus.

Justamente porque pedimos poner el foco en algo que todavía no existe, el Edit1, en el evento FormCreate que hace lo que dice, crea el formulario, los TEdit todavía no existen.

Sí, todo muy lindo y suena hasta lógico, ¿pero entonces cómo lo consigo?

Opción 1: usando la opción "Orden de tabulación", click derecho sobre el formulario.

Opción 2: precisamente en el procedimiento FormCreate estableciendo el control activo de la siguiente forma: 

procedure TForm1.FormCreate(Sender: TObject);
begin
  ActiveControl:=Edit1;
end; 

Y la duda razonable, si no se puede un setfocus ¿por qué sí un ActiveControl?, la respuesta está en el código fuente de la unidad Forms (forms.pp), wincontrol.inc y customform.inc. La respuesta corta es que edit1.setfocus aún no está disponible porque estamos llamando a un evento de un TEdit en FormCreate, en cambio ActiveControl es una propiedad de TForm.

En el código de la unidad control.pp podemos encontrar:

    function CanFocus: Boolean; virtual;
    function CanSetFocus: Boolean; virtual;  

que son funciones públicas de la clase (class) TWinControl que hereda de TControl y también pueden ser usadas para evitar errores al utilizar el procedimiento SetFocus.

Otras opciones:

procedure TForm1.FormActivate(Sender: TObject);
begin
  Edit1.SetFocus;
end;    

procedure TForm1.FormShow(Sender: TObject);
begin
 Edit1.SetFocus;
end;    

Funcionan bien con formularios mostrados mediante ShowModal, no obstante recomiendo las dos primeras.

viernes, 17 de agosto de 2018

TEdit: rellenar con ceros u otro caracter.

La función AddChar incluida en la unidad StrUtils hace esto.

function AddChar(C: Char; const S: string; N: Integer): string; 

El primer parámetro es el caracter con el cual vamos a rellenar los espacios del string, el segundo parámetro es el string a rellenar y el tercero la cantidad de lugares a rellenar (lo normal es que sea la misma cantidad de caracteres del string).

Ejemplo: un TEdit para que el usuario ingrese el número de un comprobante y al abandonar el TEdit, el mismo complete con ceros a la izquierda. Nos valemos del método OnExit del TEdit:

procedure TForm1.edNroExit(Sender: TObject);
begin
  edNro.Text:=AddChar('0',edNro.Text,8);
end;


El edNro es la variable del tipo TEdit y la propiedad MaxLength es 8, el resto de las propiedades son las predefinidas por el IDE Lazarus.
En lugar de pasar el número 8 se podría pasar la propiedad edNro.MaxLength.

miércoles, 4 de julio de 2018

TEdit solo números.

Para que una variable del tipo TEdit acepte solo números hay que definir el evento OnKeyPress de esta forma:

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


De esta forma el usuario solo podrá ingresar números y borrar.

Si bien el tipo TEdit tiene una propiedad NumbersOnly, la misma no funciona si se utiliza el widget GTK-2 en sistemas operativos GNU con kernel Linux.

#8 es para permitir borrar y #9 la tecla de tabulación, cualquier otra tecla se anula con Key:=#0.

jueves, 7 de septiembre de 2017

Cambiar color de varios TEdit OnEnter OnExit

Si tenemos pocos (2 o 3) Tedit en un formulario, podemos rápidamente hacer uso de los eventos OnEnter y OnExit de cada edit y listo, total, son pocos. Pero si tenemos muchos TEdit cómo crear un evento para OnEnter y otro para OnExit que sirva para todos los Edits, sean 1, 2, 10 o 50. Simple, creamos dos procedimiento en la clase del formulario, no aparte del Form, sino como miembros de la clase Form.

Ejemplo:

procedure EntraEdit(Sender: TObject);
procedure SaleEdit(Sender: TObject);


Luego implementamos dichos eventos:

procedure TForm1.EntraEdit(Sender: TObject);
begin
 TDBEdit(Sender).Color:=clMoneyGreen;
end;

procedure TForm1.SaleEdit(Sender: TObject);
begin
  TDBEdit(Sender).Color:=clDefault;
end;


Ahora, desde el inspector de objetos, en la parte Eventos, en cada TEdit deberemos seleccionar en todos el evento OnEnter y OnExit asignando EntraEdit y SaleEdit respectivamente. Con esto logramos reducir la cantidad de código. Con esta optimización, otra ventaja es que si deseamos cambiar el color y tenemos 20 edits, solo necesitamos modificar una sola línea de código.