Ver Mensaje Individual
  #13  
Antiguo 24-03-2013
paquechu paquechu is offline
Miembro
 
Registrado: oct 2008
Posts: 51
Reputación: 16
paquechu Va por buen camino
Hola de nuevo,
Os pego el trozo de codigo (aparecen variables declaradas globalmente) en el que estoy trabajando
que de momento parece que me funciona aunque seguro que se puede mejorar/optimizar, pero es por donde voy :-)
Código Delphi [-]

procedure TfrmPrinc.bProcesarClick(Sender: TObject);
var
  vLinea:String;
begin
    bSalir:=False;
    PosUltimaLinea:=0;
    while Not bSalir do
    begin
      vLinea:=GetLastLine(sDirTrab+'\'+sArchLog);
      mLog.lines.add(vLinea);
      // Aqui procesar la línea
    end;
end;

function TfrmPrinc.GetLastLine(const aFileName: string): string;
var
  buf : Char;
  i,j,PosiLinea   : LongInt;

begin
  FSPrin := TFileStream.Create(aFileName, fmOpenRead + fmShareDenyNone );
  try
    bLinea:=False;
    while Not bLinea do
    begin
       // Ir al final de fichero
       i := FSPrin.Size-nCarLi;
       PosUltimaAux:=i+nCarLi;
       if PosUltimaAux<>PosUltimaLinea then
       begin
         try
           PosUltimaLinea:=PosUltimaAux;
           buf:=#0;
           FSPrin.Seek(i, soBeginning);
           FSPrin.Read(buf, SizeOf(buf));
           if (buf = #10) or (buf = #13) then
           begin
             bLinea:=True;
             PosiLinea:=i;
           end;
         except;
         end;
         Application.ProcessMessages;
         if bSalir then begin break; exit; end;
       end;
       Application.ProcessMessages;
       if bSalir then begin break; exit; end;
       Sleep(strtoint(dfRetardo.Text));
    end;
    // Se localiza retorno de carro al final del archivo y se entiende
    // que hay una línea.
    // Hay que leer la linea hacia atras hasta encontrar retorno de carro
    // de la anterior linea o inicio de fichero.

    Result := '';
    Buf:=#0;
    i := 1;
    while (buf <> #10) and (buf <> #13) and (FSPrin.position<>0) do
    begin
      try
        buf:=#0;
        //FSPrin.Seek(PosiLinea-i, soBeginning);
        FSPrin.Position:=PosiLinea-i;
        FSPrin.Read(buf, SizeOf(buf));
        if (buf <> #10) and (buf <> #13) then
           Insert(buf, Result, 1);
        Inc(i);
      except;
      end;
      Application.ProcessMessages;
      if bSalir then exit;
    end;
  finally
    FSPrin.Free;
  end;
end;
Responder Con Cita