Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Verificar que el contenido de un String este dentro de cierto rango (https://www.clubdelphi.com/foros/showthread.php?t=88071)

FGarcia 09-04-2015 00:00:39

Verificar que el contenido de un String este dentro de cierto rango
 
Hola!

Con este codigo (que no he probado aun) intento ver que el string solo tenga numeros, el caracter de espacio y el punto decimal

Código Delphi [-]
procedure TfrmPrincipal.UpdateCaptura1;
var
  sTemp,sFinal: string;
  i: Integer;
  rPeso: Real;
begin
  
  sTemp := MidStr(dmComPort.NuevaCaptura1,10,7);

  for i := 0 to length(stemp)  do
    if sTemp[i] in ['0'..'9',#32,'.'] then
      sFinal := sFinal + sTemp[i];

  try
    rValor := StrToFloat(sFinal);
  except
    on Exception : EConvertError do
      ShowMessage(Exception.Message);
  end;

end;

Es correcto el enfoque? No lo he verificado en la practica.
El control de excepcion lanza una ventana de aviso, ¿Es posible solo ignorar la excepcion? se me ocurre para no esperar que el operador Acepte el mensaje solo guardar un log ¿Como haria eso?

Como siempre agradezco su ayuda y tiempo invertido!! :)

Al González 09-04-2015 02:56:43

Hola Fidel.

Sabiendo que tienes Delphi XE2 y disposición para usar GH Freebrary, te paso un ejemplo de cómo hacerlo con una función de esta biblioteca.
Código Delphi [-]
Uses
  GHFRTL;
...
Var
  S :String;
Begin
  S := ' Prueba';

  If ghIsChrs (S, ghchDotDecimals + [' ']) Then
    ShowMessage ('es válida')
  Else
    ShowMessage ('no es válida');

  S := '12 345.';

  If ghIsChrs (S, ghchDotDecimals + [' ']) Then
    ShowMessage ('es válida')
  Else
    ShowMessage ('no es válida');

  S := '93     ';

  If ghIsChrs (S, ghchDotDecimals + [' ']) Then
    ShowMessage ('es válida')
  Else
    ShowMessage ('no es válida');
La función ghIsChrs comprueba si una cadena dada (S) se compone de, y sólo de, caracteres que se encuentren en un conjunto dado, en este caso punto, dígitos decimales y espacio en blanco. En el ejemplo, el primer If no se cumple, los segundos dos Ifs sí.

Desde luego, puede haber otras soluciones para esta situación. La mía es sólo una alternativa. :)

Saludos.

ecfisa 09-04-2015 20:43:03

Hola Fidel.
Cita:

... se me ocurre para no esperar que el operador Acepte el mensaje solo guardar un log ¿Como haria eso?
Sobre ese punto, podes hacer algo como esto:
Código Delphi [-]
function VerifyInput(str: string; var Value: Double): Boolean;
var
  logf: string;
begin
  str := StringReplace( str, ' ','', [rfReplaceAll] );
  Result := TryStrToFloat( str, Value );
  if not Result then
  begin
    logf := ExtractFilePath( Application.ExeName ) +
      FormatDateTime( 'yyyy-mm-dd',Date ) + 'E_ComPort.LOG';
    with TStringList.Create do
    try
      Value := 0;
      if FileExists( logf ) then
        LoadFromFile( logf );
      Add( Format( 'Valor: %s : %s',[str,
        FormatDateTime( 'dd/mm/yyyy - hh:mm:ss',Now )] ) );
      SaveToFile( logf );
    finally
      Free;
    end;
  end;
end;

Llamada:
Código Delphi [-]
...
var
  s : string;
  v: Double;
begin
  s := ' 0.123 456789';
  if VerifyInput( s, v ) then
  begin
     // En v hay un valor correcto, continuar
     ...


Saludos :)

FGarcia 10-04-2015 01:01:47

Alberto y Daniel gracias por sus respuestas, no he podido realizar las pruebas necesarias pues se me ha complicado el día sin embargo a la primera oportunidad estaré en ello y les informare.

Muchas gracias por su interés.

nlsgarcia 10-04-2015 07:13:07

FGarcia,

Cita:

Empezado por FGarcia
...Verificar que el contenido de un String este dentro de cierto rango...solo tenga números, el carácter de espacio y el punto decimal...guardar un log...

:rolleyes:

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

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  Data : Array[1..5] of String = (' 123456789.0','#123456789.0',' 123456789,0','A123456789.0',' @23456789.0');

var
  Form1: TForm1;

implementation

{$R *.dfm}

function CheckInput(Value : String) : Boolean;
var
   i : Integer;
   F : TextFile;
   FileName : String;

begin

   Result := True;

   FileName := ExtractFilePath(Application.ExeName) + 'History.txt';
   FileMode := fmOpenWrite or fmShareExclusive;
   AssignFile(F, FileName);

   if FileExists(FileName) then
      Append(F)
   else
      Rewrite(F);

   for i := 1 to Length(Value) do
      if not (Value[i] in ['0'..'9',' ','.']) then
      begin
         WriteLn(F,FormatDateTime('yyyy/mm/dd hh:nn:ss',Now) + ' ' + Value);
         Result := False;
         Break;
      end;

   CloseFile(F);

end;

procedure TForm1.Button1Click(Sender: TObject);
var
   i : Integer;
begin
   for i := Low(Data) to High(Data) do
      CheckInput(Data[i]);
end;
      
end.
El código anterior en Delphi 7 sobre Windows 7 Professional x32, Realiza la verificación de un string y guarda un registro por cada caso de error en un archivo histórico, como se muestra en la siguiente imagen:



Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 22:56:54.

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