Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   leer string por caracteres (https://www.clubdelphi.com/foros/showthread.php?t=67787)

tgsistemas 06-05-2010 10:18:02

leer string por caracteres
 
Hola a tod@s,

acudo de nuevo en vuestra ayuda con una tonteria que no soy capaz de resolver. En una qry de mysql obtengo un campo con el resultado de una suma de tiempo en formato segundos (es un longinteger), a partir de ese campo relleno un campo calculado (string) con el siguiente código :

Código Delphi [-]
    {pasamos el campo rllmndo de segundos a formato hora y lo carga en el rllmndo_temp en string}
    if ihoras > 0 then
    begin
      ivalor := Round(ihoras);
      ihor      := ivalor div 3600;
      imin      := (ivalor mod 3600) div 60;
      iseg      := (ivalor mod 3600) mod 60;
      if ihor < 10 then ihort := Format('%.2d', [ihor]) else ihort := FloatToStr(ihor);
      if imin < 10 then imint := Format('%.2d', [imin]) else imint := FloatToStr(imin);
      if iseg < 10 then isegt := Format('%.2d', [iseg]) else isegt := FloatToStr(iseg);
      FieldByName('rllmndo_temp').AsString := ihort + ':' + imint + ':' + isegt;
    end;

el cliente quiere ver en el dbgrid los dos campos de dedicación, en formato segundos y en formato hh:mm:ss, hasta aquí todo bien ;)

El problema lo tengo en que el grid debe pintar determinadas columnas en colores en función del valor del campo (entre ellos está el rllmndo_temp) y para ello utilizo el componente de TCustomizeGrid de Neftali ;) con el código siguiente en el evento OnpaintCellExt

Código Delphi [-]
{horas dedicacion EN STRING QUE CONVERTIMOS A SEGUNDOS !!!!}
  if (FieldName = 'rllmndo_temp') and (not (Field.IsNull)) then begin
    {pasamos el campo rllmndo de segundos a formato hora y lo carga en el rllmndo_temp}
    ivalort := StrToDateTime(Field.Value);
    DecodeTime(ivalort, ihor, imin, iseg, imseg);
    ivalor := (ihor *3600) + (imin *60) + iseg;

    if (ivalor < 3600) then begin
      ChangeColor := True;
      CellColor := clRed;
    end;
    if (ivalor >= 3600) and (ivalor <= 4499) then begin
      ChangeColor := True;
      CellColor := $0000BFFF;
    end;
    if (ivalor >= 4500) then begin
      ChangeColor := True;
      CellColor := $0000FF80; //clGreen;
    end;
  end;

pero hay registros dónde el valor del campo calculado rllmndo_temp (string) es del tipo 39:20:00 y no se puede pasar a DateTime.

Había pensado en leer la cadena del campo caracter a caracter para obtener los valores de las horas, minutos y segundos antes de pintar la celda de ese campo string, pero no se como hacerlo.

Muchas gracias por la ayuda !!!!

Caro 06-05-2010 14:52:09

Hola tgsistemas, puedes utilizar la función Copy:

Código Delphi [-]
 hora, minutos, segundos : String;
 ...................................
 if (FieldName = 'rllmndo_temp') and (not (Field.IsNull)) then begin
    hora := Copy(Field.Value, 1, 2);
    minutos := Copy(Field.Value, 4, 2);
    segundos := Copy(Field.Value, 7, 2);

   .............................
   .................................

Saluditos

duilioisola 06-05-2010 17:01:34

A lo que dice Caro, quisiera agregar que la hora no necesariamente será de 2 dígitos. Podrían ser 102:21:35.
Por lo tanto el primer copy debe ser desde el principio hasta el primer ":".

Código Delphi [-]
[...]
    p := pos (':',Field.Value);
    hora := Copy(Field.Value, 1, p-1);
    minutos := Copy(Field.Value, p+1, 2);
    segundos := Copy(Field.Value, p+4, 2);
[...]

tgsistemas 06-05-2010 21:15:00

gracias Caro y duilioisola por las respuestas, lo pruebo y os comento ;)

tgsistemas 07-05-2010 19:29:27

gracias Caro y duilioisola, vuestra ayuda ha funcionado perfectamente ;)
al final he creado una función ya que la necesitaré bastante en este proyecto :
Código Delphi [-]
Function ConvertStringaTime(CadenaHora: String): Integer;
var
  ihor, imin, iseg, p, ivalor : Integer;
begin
  if (CadenaHora <> Null) then
  begin
    p := pos (':',CadenaHora);
    ihor := StrToInt(Copy(CadenaHora, 1, p-1));
    imin := StrToInt(Copy(CadenaHora, p+1, 2));
    iseg := StrToInt(Copy(CadenaHora, p+4, 2));
    if ihor >0 then ivalor := (ihor *3600) else ivalor := 0;
    if imin >0 then ivalor := ivalor + (imin+60) else ivalor := ivalor;
    if iseg >0 then ivalor := ivalor + iseg else ivalor := ivalor;
  end;
  if ivalor>0 then  Result := ivalor else Result := 0;
end;

muchas gracias por la ayuda !!!!


La franja horaria es GMT +2. Ahora son las 10:00:21.

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