Ver Mensaje Individual
  #1  
Antiguo 06-05-2010
Avatar de tgsistemas
tgsistemas tgsistemas is offline
Miembro
 
Registrado: dic 2003
Ubicación: Barcelona
Posts: 149
Reputación: 21
tgsistemas Va por buen camino
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 !!!!
__________________
Toni | blog
Responder Con Cita