Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elmago00,

Cita:
Empezado por elmago00
...llevo horas tratando, pero creo que mejor haré los cambios, y lo guardare en SaveToStream para que guarde los cambios en el archivo original después de editarlo en memoria...
Pregunto: ¿Probastes el código del Msg #34 y la corrección del Msg#35?.

Nelson.
Responder Con Cita
  #2  
Antiguo 10-05-2014
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola elmago00.

¿ Es imprescindible que uses FireMonkey ? Por que el código del mensaje #33 esta probado, hace lo que buscas y funciona correctamente. También pude apreciar que no son tan radicales las modificaciones echas al código que parten de este enlce Codigo Hexadecimal para adecuarlas a FireMonkey.

Por otro lado, si deseas usa un editor hexadecimal mas poderoso, te vuelvo a sugerir lo que te mencioné en el otro hilo: HxD es totalmente gratuito.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 11-05-2014
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
Smile

Cita:
Empezado por ecfisa Ver Mensaje
Hola elmago00.

¿ Es imprescindible que uses FireMonkey ? Por que el código del mensaje #33 esta probado, hace lo que buscas y funciona correctamente. También pude apreciar que no son tan radicales las modificaciones echas al código que parten de este enlce Codigo Hexadecimal para adecuarlas a FireMonkey.

Por otro lado, si deseas usa un editor hexadecimal mas poderoso, te vuelvo a sugerir lo que te mencioné en el otro hilo: HxD es totalmente gratuito.

Saludos
todo el software tiene 15 unit, 6 dll. y 83 procesos y 57 funciones.
los procesos son muy grandes, el mínimo tiene 1200 lineas.

una unit tiene 11.453 lineas. las otras son de 2000. todo esto es bajo firemonkey, pasarlo a vcl es imposible en tan poco tiempo.
y la idea es que todo este en el mismo programa, pues el gerente informático de la otra empresa así lo solicito.(no se por que)


aun con VCL, tu me has ayudado enormemente y que decir de Nelson, tiene un cerebro para firemonkey, que me pregunto ¿son humanos?
Responder Con Cita
  #4  
Antiguo 11-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elmago00,

Cita:
Empezado por elmago00
...este es tu código que trato de usar sin el control...la idea es modificar el archivo sin visualizarlo...así la corrección en el inChipset.bin se hace mas rápido...
Revisa este código:
Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
  System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
  FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

// Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
var
   F1, F2 : TFileStream;
   Buffer : Array of Byte;
   AuxHex : String;
   i,p : Integer;

begin

   try

      F1 := TFileStream.Create(FileName, fmOpenRead);
      F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);

      SetLength(Buffer, Length(OldHex) div 2);

      while F1.Position < F1.Size do
      begin
         F1.Read(Buffer[0], Length(Buffer));

         AuxHex := EmptyStr;
         for i := Low(Buffer) to High(Buffer) do
            AuxHex := AuxHex + IntToHex(Buffer[i],2);

         if OldHex = AuxHex then
         begin
            p := 1;
            i := 0;
            while p <= Length(NewHex) do
            begin
               Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
               Inc(p,2);
               Inc(i,1);
            end;
            F2.Write(Buffer[0], Length(Buffer));
         end
         else
            F2.Write(Buffer[0], Length(Buffer));
      end;

      F1.Free;
      F2.Free;
      Result := True;

   except

      F1.Free;
      F2.Free;
      Result := False;

   end;

end;

// Sustituye en un Offset de archivo una cadena Hex
function ChangeFileOffset(Offset : Integer; NewHex, FileName : String) : Boolean;
var
   F1, F2 : TFileStream;
   Buffer : Array of Byte;
   AuxHex : String;
   i,p : Integer;
   CurrOffset,Step : Integer;

begin

   try

      F1 := TFileStream.Create(FileName, fmOpenRead);
      F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);

      Step := Length(NewHex) div 2;

      SetLength(Buffer, Step);

      CurrOffset := 0;

      while F1.Position < F1.Size do
      begin
         F1.Read(Buffer[0], Length(Buffer));

         if Offset = CurrOffset then
         begin
            p := 1;
            i := 0;
            while p <= Length(NewHex) do
            begin
               Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
               Inc(p,2);
               Inc(i,1);
            end;
            F2.Write(Buffer[0], Length(Buffer));
         end
         else
            F2.Write(Buffer[0], Length(Buffer));

         Inc(CurrOffset, Step);
      end;

      F1.Free;
      F2.Free;
      Result := True;

   except

      F1.Free;
      F2.Free;
      Result := False;

   end;

end;

// Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
procedure TForm1.Button1Click(Sender: TObject);
var
   OldHex, NewHex, Filename : String;

begin

   OldHex := '671254437573746F6D466F726D2E4C6F';
   NewHex := 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
   FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';

   if ChangeFileHex(OldHex,NewHex,Filename) then
      MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
   else
      MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);

end;

// Sustituye en un Offset de archivo una cadena Hex
procedure TForm1.Button2Click(Sender: TObject);
var
   Offset : Integer;
   NewHex, Filename : String;

begin

   Offset := 480;
   NewHex := 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
   FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';

   if ChangeFileOffset(Offset,NewHex,Filename) then
      MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
   else
      MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);

end;

end.
El código anterior en Delphi XE4 (FireMonkey) bajo Windows 7 Professional x32, permite cambiar una cadena hexadecimal en un archivo por medio de dos funciones:

1- Función ChangeFileHex: Cambia n ocurrencias de una cadena hexadecimal por una nueva cadena hexadecimal en un archivo dado y salva los cambios en un nuevo archivo del mismo nombre del original con extensión .new, en el mismo directorio del archivo de entrada.

2- Función ChangeFileOffset: Sustituye en un Offset (Dirección en Decimal) de un archivo dado una cadena hexadecimal y salva los cambios en un nuevo archivo del mismo nombre del original con extensión .new, en el mismo directorio del archivo de entrada.

Los Bytes Per Row (BPF) de ambas funciones están en función de la longitud de la cadenas de entrada OldHex (Función ChangeFileHex) y NewHex (Función ChangeFileOffset), siendo importante recordar que ambas cadenas deben ser del mismo tamaño en las funciones mencionadas.

Nota: Las dos funciones anteriores leen y modifican los archivos de entrada y salida directamente en disco, lo cual les permite procesar archivos de cualquier tamaño, limitados solo por las características del Sistema de Archivos del Sistema Operativo de forma rápida y eficiente e independientemente de cualquier componente de Delphi, funcionado correctamente según lo esperado en las pruebas realizadas.

Espero sea útil

Nelson.
Responder Con Cita
  #5  
Antiguo 11-05-2014
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
Muchas gracias ya esta resuelto todo. finalice el proyecto y mañana lo entrego a la empresa.
Gracias Nelson y ecfisa.
Responder Con Cita
  #6  
Antiguo 11-05-2014
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
elmago00,

Cita:
Empezado por elmago00
...finalice el proyecto y mañana lo entrego a la empresa...
Falta una pequeña corrección

Revisa este código:
Código Delphi [-]
 unit Unit1;
 
 interface
 
 uses
   System.SysUtils, System.Types, System.UITypes, System.Rtti, System.Classes,
   System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,
   FMX.StdCtrls;
 
 type
   TForm1 = class(TForm)
     Button1: TButton;
     Button2: TButton;
     procedure Button1Click(Sender: TObject);
     procedure Button2Click(Sender: TObject);
   private
     { Private declarations }
   public
     { Public declarations }
   end;
 
 var
   Form1: TForm1;
 
 implementation
 
 {$R *.fmx}
 
 // Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
 function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
 var
    F1, F2 : TFileStream;
    Buffer : Array of Byte;
    AuxHex : String;
    i,p : Integer;
    BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read
 
 begin
 
    try
 
       F1 := TFileStream.Create(FileName, fmOpenRead);
       F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
 
       BPF := Length(OldHex) div 2;
 
       SetLength(Buffer, BPF);
 
       while F1.Position < F1.Size do
       begin
          NBR := F1.Read(Buffer[0], BPF);
 
          AuxHex := EmptyStr;
          for i := Low(Buffer) to High(Buffer) do
             AuxHex := AuxHex + IntToHex(Buffer[i],2);
 
          if OldHex = AuxHex then
          begin
             p := 1;
             i := 0;
             while p <= Length(NewHex) do
             begin
                Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
                Inc(p,2);
                Inc(i,1);
             end;
             F2.Write(Buffer[0], NBR);
          end
          else
             F2.Write(Buffer[0], NBR);
       end;
 
       F1.Free;
       F2.Free;
       Result := True;
 
    except
 
       F1.Free;
       F2.Free;
       Result := False;
 
    end;
 
 end;
 
 // Sustituye en un Offset de archivo una cadena Hex
 function ChangeFileOffset(Offset : Integer; NewHex, FileName : String) : Boolean;
 var
    F1, F2 : TFileStream;
    Buffer : Array of Byte;
    AuxHex : String;
    i,p : Integer;
    CurrOffset : Integer;
    BPF, NBR : Integer;  // BPF = Bytes Per Row, NBR = Number of Bytes Read
 
 begin
 
    try
 
       F1 := TFileStream.Create(FileName, fmOpenRead);
       F2 := TFileStream.Create(ChangeFileExt(FileName,'.new'), fmCreate);
 
       BPF := Length(NewHex) div 2;
 
       SetLength(Buffer, BPF);
 
       CurrOffset := 0;
 
       while F1.Position < F1.Size do
       begin
 
          NBR := F1.Read(Buffer[0], BPF);
 
          if Offset = CurrOffset then
          begin
             p := 1;
             i := 0;
             while p <= Length(NewHex) do
             begin
                Buffer[i] := StrToInt('$' + Copy(NewHex,p,2));
                Inc(p,2);
                Inc(i,1);
             end;
             F2.Write(Buffer[0], NBR);
          end
          else
             F2.Write(Buffer[0], NBR);
 
          Inc(CurrOffset, BPF);
       end;
 
       F1.Free;
       F2.Free;
       Result := True;
 
    except
 
       F1.Free;
       F2.Free;
       Result := False;
 
    end;
 
 end;
 
 // Cambia n ocurrencias de una cadena Hex por una nueva cadena Hex en un archivo
 procedure TForm1.Button1Click(Sender: TObject);
 var
    OldHex, NewHex, Filename : String;
 
 begin
 
    OldHex := '671254437573746F6D466F726D2E4C6F';
    NewHex := 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
    FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';
 
    if ChangeFileHex(OldHex,NewHex,Filename) then
       MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
    else
       MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);
 
 end;
 
 // Sustituye en un Offset de archivo una cadena Hex
 procedure TForm1.Button2Click(Sender: TObject);
 var
    Offset : Integer;
    NewHex, Filename : String;
 
 begin
 
    Offset := 480;
    NewHex := 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
    FileName := 'C:\Developers\Delphi XE4\Test-17 (ChangeFileHex)\FileTest.dcu';
 
    if ChangeFileOffset(Offset,NewHex,Filename) then
       MessageDlg('Cambio de Archivo Realizado', TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0)
    else
       MessageDlg('Error en Cambio de Archivo', TMsgDlgType.mtError,[TMsgDlgBtn.mbOk],0);
 
 end;
 
 end.
El código anterior en Delphi XE4 (FireMonkey) bajo Windows 7 Professional x32, es la versión 2 del código del Msg #41 con los siguientes cambios:

1- Optimiza el código y lo hace más legible.

2- Corrige el Número de Bytes a Escribir en función del NBR (Number of Bytes Read) en el caso de que los archivos procesados no sean múltiplos de BPF (Bytes Per Row).

Espero sea útil

Nelson.
Responder Con Cita
  #7  
Antiguo 11-05-2014
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
gracias, lo tendré en cuenta, ya que hoy lo enviare por correo a la empresa. muchas gracias
sin ustedes nunca hubiera solucionado el problema, gracias
Responder Con Cita
  #8  
Antiguo 06-01-2015
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
Hola Nelson,
Perdona la molestia, pero ahora tengo una pregunta, sera posible cambiar todas las cadenas hexadecimales, que tengan un mismo valor?
es que tu código solo me permite, cambiar una sola linea, pero debo cambiar varias, y con tu código, solo cambia una a la vez.

Gracias por tu respuesta.
Responder Con Cita
  #9  
Antiguo 11-05-2014
elmago00 elmago00 is offline
Miembro
NULL
 
Registrado: ago 2013
Posts: 86
Poder: 11
elmago00 Va por buen camino
Cita:
Empezado por nlsgarcia Ver Mensaje
elmago00,


Pregunto: ¿Probastes el código del Msg #34 y la corrección del Msg#35?.

Nelson.

Porsupuesto Nelson y dejame decirte que funciona perfecto. pero bajo un control TSringGrid.
y estoy usando el código de efisa del msg#17 este código me permite almacenarlo en variable y editarlo desde un archivo y sin usar el Control visible.
lo que hago en estos momentos es pasar tu código para que al igual al de ecfisa editarlo en un archivo guardado. y luego pasarlo a binario, tal y como lo tienes tu que funciona, pero que no eso ese método por que se demora, 15 minutos en cargar un archivo de 9mb.
Código Delphi [-]
// Salvar StringGrig a Binario
procedure TForm1.SaveDumpBinary(aFileName:TFileName; const BPF: Word);
var
  MS: TMemoryStream;
  c,r: Integer;
  Buffer: Byte;
  Msg : String;
begin
  with StringGrid1 do
  begin
    MS:= TMemoryStream.Create;
    try
      for r:= 1 to RowCount-1 do
      begin
        for c:= 0 to BPF-1 do
        begin
           if (Cells[c+1, r] <> '') then
           begin
              Buffer := StrToInt('$'+Cells[c+1, r]);
              MS.WriteBuffer(Buffer, 1);
           end;
        end;
      end;
      MS.SaveToFile(aFileName);
    finally
      MS.Free;
      Msg := 'Generación de Archivo Binario Completada Satisfactoriamente';
      MessageDlg(Msg,TMsgDlgType.mtInformation,[TMsgDlgBtn.mbOk],0);
    end;
  end;
end;

este es tu código que trato de usar sin el control.

dirás por que este se complica tanto. por la idea es modificar el archivo sin visualizarlo. así la corrección en el IC se hace mas rápido, y el procesador (que no es muy poderoso) lo ejecuta rápido.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
ayuda con este codigo kurono Varios 5 02-04-2014 00:25:11
Se estrena este foro sobre FireMonkey Neftali [Germán.Estévez] FireMonkey 9 09-11-2012 13:05:30
ayuda con este codigo kurono Varios 4 13-06-2008 01:03:29
necesito ayuda con este codigo kurono Varios 4 06-05-2008 07:02:07
procedimiento almacenado ayuda con este codigo pipecato Varios 5 16-12-2005 12:24:34


La franja horaria es GMT +2. Ahora son las 16:33:46.


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
Copyright 1996-2007 Club Delphi