Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Mostrar fichero en TMemo (https://www.clubdelphi.com/foros/showthread.php?t=84628)

Metal_Kingdom 14-11-2013 03:41:50

Mostrar fichero en TMemo
 
Hola, solicito ayuda tras mil y un intentos y no encontrar una explicación lógica ni una solución al problema.

Pretendo mostrar en un Memo el contenido de un fichero cualquiera (sea *.exe, *.rar, etc; NO *.txt), y digo un memo como puedo decir un simple Showmessage.

Bien, al lío, probando este simple código:

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  F: file;
  ByteAct: byte;
  Res: string;
begin
  assignfile(F, 'c:\fichero.rar'); // Un fichero cualquiera
  reset(F, 1);
  while not eof(F) do
  begin
    blockread(F, ByteAct, 1);
    Res := Res + char(ByteAct);
  end;
  closefile(F);
  Memo1.Text := Res;
end;

Del modo anterior sólo se muestran los primeros bytes, por qué???

Para mostrarlos todos basta hacer esto:

Código Delphi [-]
procedure TForm1.Button3Click(Sender: TObject);
var
  F: file;
  ByteAct: byte;
  Res: string;
  i: integer;
begin
  assignfile(F, 'c:\fichero.rar'); // Un fichero cualquiera
  reset(F, 1);
  while not eof(F) do
  begin
    blockread(F, ByteAct, 1);
    Res := Res + char(ByteAct);
  end;
  closefile(F);
  for i := 1 to length(Res) do
    Memo1.Text := Memo1.Text + Res[i];
end;


Pero, volviendo al primer código, si se supone que estoy almacenando todo el fichero en la variable Res, por qué coj... sólo escribe los primeros bytes? en cambio recorriendolo byte a byte sí los escribe todos, qué sentido tiene? alguna solución?

Gracias por su atención.

ecfisa 14-11-2013 08:04:10

Hola Metal_Kingdom.

Intenta de este modo:
Código Delphi [-]
procedure FileToTString(TS: TStrings; const aFileName: TFileName);
var
  F      : file;
  nRead  : Integer;
  Buffer : array[0..4095] of byte;
  Cadena : string;
  CadPtr : PChar;
begin
  AssignFile(F, aFileName);
  Reset(F, 1);
  TS.BeginUpdate;
  try
    repeat
      BlockRead(F, Buffer, SizeOf(Buffer), nRead);
      CadPtr := @Buffer;
      SetString(Cadena, CadPtr, nRead);
      TS.Add(Cadena);
    until nRead = 0;
  finally
    TS.EndUpdate;
  end;
  CloseFile(F);
end;

Uso:
Código Delphi [-]
...
  Memo1.Clear;
  FileToTString(Memo1.Lines, 'fichero.rar');

Saludos :)

Neftali [Germán.Estévez] 14-11-2013 10:30:46

Si estás abriendo un EXE, por ejemplo, imagino que hay caracteres que no son "imprimibles". Imagino que de alguna forma tendrás que convertir lo que lees a algo que se puede colocar en un memo.
Imagino que esta puede ser la razón por la que se te corta el texto.

Metal_Kingdom 14-11-2013 14:50:18

Cita:

Empezado por Neftali (Mensaje 469599)
Si estás abriendo un EXE, por ejemplo, imagino que hay caracteres que no son "imprimibles". Imagino que de alguna forma tendrás que convertir lo que lees a algo que se puede colocar en un memo.
Imagino que esta puede ser la razón por la que se te corta el texto.

Así es, pensé exactamente lo mismo, pero observa que en el segundo código sí se escriben todos los bytes, algo muy extraño.. si son los mismos bytes convertidos a char, inicialmente debería imprimirlos de una sola tirada sin tener que recorrer cada byte, es algo que no me cuadra.

Es decir, si yo hago un:
Código Delphi [-]
ShowMessage(Res);

Debería imprimir de una tirada los que sí imprime byte a byte usando un For:

Código Delphi [-]
for i: 1 to length(res) do
  Showmessage(Res[i]);

Es donde no encuentro el por qué.

Lo comprobaría con otros lenguajes, pero sólo dispongo de Delphi 7 y Delphi XE5.

PD: ecfisa, probaré de la manera que sugieres, en teoría debería funcionar, pero el misterio de que la otra forma no funcione sigue en pie jaja.

Sigo buscando, muchas gracias.


La franja horaria es GMT +2. Ahora son las 21:26:59.

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