Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abrir archivos en TMemo o equivalente (https://www.clubdelphi.com/foros/showthread.php?t=46102)

Delar 24-07-2007 13:17:44

Abrir archivos en TMemo o equivalente
 
A ver, no es lo que el titulo dice exactamente, pues eso si que lo se hacer. Lo que necesito saber, es, como abrir por ejemplo un .jpg en un TMemo (como texto, no como imagen) y que pulsando un boton el contenido de ese TMemo se extraiga en el nombre deseado. Aquí dejo el codigo que tengo, y que abriendo un .exe solo lee las 3 primeras letras.
Código Delphi [-]
OpenD1.Execute;
Memo1.Lines.LoadFromFile(OpenD1.FileName);
Y al pulsar el botón:
Código Delphi [-]
SaveD1.Execute;
Memo1.Lines.SaveToFile(SaveD1.FileName);

Saludos y gracias de antemano!

seoane 24-07-2007 13:36:02

:confused: ¿Por que quieres abrir un jpg, o un .exe en un memo? Ten en cuenta que el memo piensa que lo que esta abriendo es un archivo de texto, y por lo tanto que cada byte se corresponde con un carácter. En lo archivos que tu nombras, hay muchos bytes que no se corresponden con ningún carácter "imprimible" y por lo tanto no se pueden mostrar, es mas, el byte 0 se considera como final del texto, por eso en el caso del .exe solo te muestra las 3 primeras letras, porque la cuarta siempre es 0.

En resumen, por que no explicas mejor lo que quieres conseguir con esto e intentamos buscar una solución mejor :)

Delar 24-07-2007 14:09:48

Es como un "copiador" de archivos. Ya se que hay metodos mucho más fáciles, pero es por experimentar.
También probé con un TStringList, pues no ha de "imprimir" los carácteres, pero tampoco funciona.
Saludos!

seoane 24-07-2007 14:31:13

Bien, así que se trata de copiar archivos. Pues como ya has visto, el TMemo no es la mejor opción. Hay algunas mejores.

Tenemos la evidente:
Código Delphi [-]
  CopyFile(PChar('Origen.exe'),PChar('Destino.exe'),FALSE);

Esta otra hace un buen uso de los stream:
Código Delphi [-]
var
  Origen, Destino: TFileStream;
begin
  Origen:= TFileStream.Create('Origen.jpg', fmOpenRead or fmShareDenyWrite);
  try
    Destino:= TFileStream.Create('Destino.jpg', fmCreate);
    try
      Destino.CopyFrom(Origen,0);
    finally
      Destino.Free;
    end;
  finally
    Origen.Free;
  end;
end;

Y por que no, siempre quedan los clasicos:
Código Delphi [-]
var
  Buffer: Array[1..10*1024] of Char;
  Origen, Destino: File;
  Leidos, Escritos: Cardinal;
begin
  Filemode:= 0;
  AssignFile(Origen,'Origen.jpg');
  {$I-}
    Reset(Origen,1);
  {$I+}
  if IOResult = 0 then
  try
    AssignFile(Destino,'Destino.jpg');
    {$I-}
      Rewrite(Destino,1);
    {$I+}
    if IOResult = 0 then
    try
      repeat
        BlockRead(Origen,Buffer,Sizeof(Buffer),Leidos);
        BlockWrite(Destino,Buffer,Leidos,Escritos);
      until Leidos < Sizeof(Buffer);
    finally
      CloseFile(Destino);
    end;
  finally
    CloseFile(Origen);
  end;
end;

Delar 24-07-2007 14:35:01

Esos codigos son geniales, pero me interesa que si se borra el archivo que he de copiar se quede almacenado en el programa para que aunque ya no esté el archivo pueda seguir copiandolo.

Saludos!

seoane 24-07-2007 14:44:36

Bien, entonces volvamos sobre los Streams. Existen un tipo de Stream, llamado TMemoryStream, que nos permiten almacenar datos en memoria. Así que solo tenemos que crear un Stream de este tipo, cargar el archivo y guardarlo donde queramos.

Vamos con un poco de código:
Código Delphi [-]
// Primero declaramos el Stream como variable global
Stream: TMemoryStream;

// En el evento OnCreate, por ejmplo, lo creamos
Stream:= TMemoryStream.Create;

// En el evento OnClose, por ejmplo, lo desturimos
Stream.Free;

// Para cargar el archivo
Stream.LoadFromFile('Origen.jpg');

// Para guardar el archivo
Stream.SaveToFile('Destino.jpg');

:confused: ¿Nos vamos acercando a lo que tu quieres?

Delar 24-07-2007 14:56:02

Sip, es eso lo que ando buscando.
Y podria hacer por ejemplo, Stream[1], Stream[2], ... o e de utilizar variables diferentes?

Saludos y gracias!

seoane 24-07-2007 15:03:32

Cita:

Empezado por Delar
Y podria hacer por ejemplo, Stream[1], Stream[2], ... o e de utilizar variables diferentes?

Si sabes el numero máximo de Streams que vas a necesitar, puedes usar algo como esto:
Código Delphi [-]
// Declaramos un array de 10 Streams
Stream: array[1..10] of TMemoryStream;

// En el evento OnCreate, por ejmplo, los creamos
var
  i: Integer;
begin
  for i:= Low(Stream) to High(Stream) do
    Stream[i]:= TMemoryStream.Create;
end;

// En el evento OnClose, por ejmplo, los desturimos
var
  i: Integer;
begin
  for i:= Low(Stream) to High(Stream) do
    Stream[i].Free;
end;

// Para cargar el archivo
Stream[5].LoadFromFile('Origen.jpg');

// Para guardar el archivo
Stream[5].SaveToFile('Destino.jpg');

Delar 24-07-2007 15:04:21

OK ahora si que está listo. Saludos y gracias!!!


La franja horaria es GMT +2. Ahora son las 19:24: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