Recent

Author Topic: De C# a Lazarus Free Pascal  (Read 2580 times)

RJH71

  • New Member
  • *
  • Posts: 12
De C# a Lazarus Free Pascal
« on: October 25, 2019, 10:20:03 am »
Saludos amigos del foro, disculpen la molestia, yo estuve trabajando con C# cree una rutina para validaciones de datos, me podran ayudar como lo paso a Lasarus, soy principiante en esto:

//Funcion Multiple para Validar si se Acepta un Entero, Decimal o Alfanumérico
//Como se accesa:
//e.Handled = !libreria.IsValidChar(e.KeyChar, libreria.ValueType.Entero);
//e.Handled = !libreria.IsValidChar(e.KeyChar, libreria.ValueType.Decimal, txtPrecio.Text);
//e.Handled = !libreria.IsValidChar(e.KeyChar, libreria.ValueType.Alfanumérico);

public enum ValueType { Entero, Decimal, Alfanumérico }

public static bool IsValidChar(char e, ValueType tipo, string texto = null) {
   if (tipo == ValueType.Decimal) {
      var decimalSeparator =
      System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator;
      return (char.IsDigit(e) || char.IsControl(e) || ((e.ToString() == decimalSeparator) && !texto.Contains(decimalSeparator)));
   }
   else if (tipo == ValueType.Entero {
      return (char.IsDigit(e) || char.IsControl(e));
   }
   return true;
}

Edson

  • Hero Member
  • *****
  • Posts: 1301
Re: De C# a Lazarus Free Pascal
« Reply #1 on: October 27, 2019, 04:53:00 am »
No manejo C# pero por el código que muestras, se puede ver que podrías fácilmente traducirlo, usando conjuntos.

Para verificar si un caracter es un dígito, podrías usar algo como:

Code: Pascal  [Select][+][-]
  1. if e in ['0'..'9'] then begin
  2.  
  3. end;

Así la sentencia:

Code: Pascal  [Select][+][-]
  1. return (char.IsDigit(e) || char.IsControl(e));

podría traducirse como:

Code: Pascal  [Select][+][-]
  1. exit( e in [#0..#31, '0'..'9']);

Asumiendo que los caracteres de control son los código del 0 al 31.

Ahora si trabajas en Unicode, habría que modificar un poco el código.


Lazarus 2.2.6 - FPC 3.2.2 - x86_64-win64 on Windows 10

RJH71

  • New Member
  • *
  • Posts: 12
Re: De C# a Lazarus Free Pascal
« Reply #2 on: October 27, 2019, 04:34:57 pm »
Gracias por Responder Edson, me podrás ayudar por favor a armar un código, la verdad que soy novato en esto, estoy estudiando mediante videos tutoriales, gracias de antemano.

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: De C# a Lazarus Free Pascal
« Reply #3 on: October 27, 2019, 05:38:51 pm »
Ahí va una "unidad" completa que implementa la función equivalente en Pascal:

Code: Pascal  [Select][+][-]
  1. unit CharTest;
  2.  
  3. interface
  4.  
  5. type
  6.   TValueType = (vtEntero, vtDecimal, vtAlfanumerico);
  7.  
  8. function IsValidChar(e: char; tipo: TValueType; texto: String = ''): Boolean;
  9.  
  10. implementation
  11.  
  12. uses sysutils;
  13.  
  14. function IsControl(e: char): Boolean;
  15. begin
  16.   Result := e in [#0..#31];
  17. end;
  18.  
  19. function IsDigit(e: char): Boolean;
  20. begin
  21.   Result := e in ['0'..'9'];
  22. end;
  23.  
  24. function IsValidChar(e: char; tipo: TValueType; texto: String = ''): Boolean;
  25. var
  26.   DecSep: Char;
  27. begin
  28.   DecSep := DefaultFormatSettings.DecimalSeparator;
  29.   case tipo of
  30.   vtEntero: Result := IsDigit(e) or IsControl(e);
  31.   vtDecimal: Result :=  (IsDigit(e) or IsControl(e) or
  32.                          ((e = DecSep) and
  33.                           not texto.Contains(DecSep));
  34.   else Result := True;
  35.   end;
  36. end;
  37.  
  38. end;

No la he testado pero no debería haber errores serios. Deberías tomarte un poco de tiempo para ver las correspondencias (¡y las diferencias!). :)
« Last Edit: October 27, 2019, 05:46:54 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

RJH71

  • New Member
  • *
  • Posts: 12
Re: De C# a Lazarus Free Pascal
« Reply #4 on: October 28, 2019, 03:02:28 pm »
Gracias por responder Lucamar, lo voy a revisar ok gracias y te aviso.

RJH71

  • New Member
  • *
  • Posts: 12
Re: De C# a Lazarus Free Pascal
« Reply #5 on: October 28, 2019, 03:57:20 pm »
Lucamar disculpa, en el KeyPressed pongo así:

procedure TForm1.EdtPrecioKeyPress(Sender: TObject; var Key: char);
begin
   IsValidChar(Key, vtDecimal, EdtPrecio.Text);
end;

no se como va por eso te escribo, quedo de ti...

RJH71

  • New Member
  • *
  • Posts: 12
Re: De C# a Lazarus Free Pascal
« Reply #6 on: October 28, 2019, 04:13:59 pm »
En C# pongo asi:

private void txtPrecio_KeyPress(object sender, KeyPressEventArgs e) {
     e.Handled = !libreria.IsValidChar(e.KeyChar, libreria.ValueType.Decimal, txtPrecio.Text);
}

lucamar

  • Hero Member
  • *****
  • Posts: 4219
Re: De C# a Lazarus Free Pascal
« Reply #7 on: October 28, 2019, 06:39:38 pm »
No hay equivalente in Pascal para ese evento salvo que interceptes el mensaje directamente, que es lo que parece que hace (más o menos) C#

Si lo que quieres es validar cada pulsación usa el evento OnKeyDown or OnKeyUp. Algo así como esto:

Code: Pascal  [Select][+][-]
  1. procedure TForm1.EdtPrecioKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  2. begin
  3.   if not IsValidChar(Key, vtDecimal, EdtPrecio.Text) then
  4.     Key := 0;
  5. end;

Lo que ese código provoca es que EdtPrecio ignore cualquier caracter no válido para un "precio". No es exactamente lo mismo (creo) que en C# pero basta para validar la pulsación de tecla.

Date cuenta de que el código anterior es sólo un ejemplo, muy poco robusto. Por ejemplo, también interceptará (¡y dará por válidos!) "Shift+1", "Alt+2", etc.
« Last Edit: October 28, 2019, 06:43:19 pm by lucamar »
Turbo Pascal 3 CP/M - Amstrad PCW 8256 (512 KB !!!) :P
Lazarus/FPC 2.0.8/3.0.4 & 2.0.12/3.2.0 - 32/64 bits on:
(K|L|X)Ubuntu 12..18, Windows XP, 7, 10 and various DOSes.

RJH71

  • New Member
  • *
  • Posts: 12
Re: De C# a Lazarus Free Pascal
« Reply #8 on: October 31, 2019, 05:52:52 am »
Gracias Lucamar funciona a la perfección, gracias!

 

TinyPortal © 2005-2018