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
public
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function ChangeFileHex(OldHex, NewHex, FileName : String) : Boolean;
var
F1, F2 : TFileStream;
Buffer : Array of Byte;
AuxHex : String;
i,p : Integer;
BPF, NBR : Integer;
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;
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;
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;
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;
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.