danielmj |
14-08-2014 20:45:26 |
Error al llamar a procedimiento
Hola de nuevo después de mucho tiempo, llevo unos días recuperando un proyecto que dejé hace tiempo sin terminar al estilo hacha y me encuentro que cuando ejecuto con F9, todo va bien hasta que hago la llamada a un procedimiento, este:
Código Delphi [-]Procedure TPrincipal.Button1Click(Sender: TObject);
var
Dato: TData;
pDato: ^TData;
begin
New(pDato);
pDato := @Dato;
Dato.Path := Principal.LabEdit1.text;
Dato.Size := 2048;
Thread.MsgWaitFor(ThreadExample, pDato);
end;
Y el procedimiento "ThreadExample" sería este:
Código Delphi [-]procedure TPrincipal.ThreadExample(Data: pointer);
var
Path: string;
Size: integer;
begin
Path := Principal.LabEdit1.Text; Size := 2048;
TrocearArchivo(Path, Size);
end;
Que a su vez llama a este otro:
Código Delphi [-]procedure TrocearArchivo(sArchivo: TFileName; iLongitudTrozo: Long64 );
var
i: Word;
FS, Stream: TFileStream;
nombreFile: String;
label iniciar;
begin
try
principal.memo1.Lines.Add(CalcHash(principal.labedit1.Text,haSHA1));
principal.Memo1.Lines.SaveToFile(principal.labEdit2.Text+ '\'+ extractFileName(principal.LabEdit1.Text+'.crc'));
except
on EFCreateError do
begin
showMessage ('Unidad seleccionada no válida. Selecciona una unidad' +
chr(13)+'de disco duro local que sea accesible.');
principal.Memo1.Text:= '';
exit;
end;
end;
if principal.opc1.Checked then
begin
iLongitudTrozo:= 1048576;
FS := TFileStream.Create(sArchivo, fmOpenRead or fmShareDenyWrite);
try
principal.Memo2.Lines.Add((Chr(13))+(Chr(10)));
principal.Memo2.Lines.Add('LISTADO DE ARCHIVOS [ORIGINAL TROCEADO]');
principal.Memo2.Lines.Add((Chr(13))+(Chr(10))+'·································');
for i := 1 to Trunc( FS.Size / iLongitudTrozo ) + 1 do
begin
principal.prBar.Max:= FS.Size div iLongitudTrozo;
principal.prBar.Position:= i;
principal.prBar.Refresh;
nombreFile:= extractFileName(sArchivo);
try
sArchivoPartido := ChangeFileExt(principal.labEdit2.Text +'\'+
nombreFile, '.' + FormatFloat('000', i ) );
Stream := TFileStream.Create(sArchivoPartido, fmCreate or fmShareExclusive);
except
on EFileStreamError do
ShowMessage ('Unidad seleccionada no valida. Selecciona una unidad de disco duro local.');
end;
principal.labEdit2.SelStart:= 0;
principal.labEdit2.SelLength:= length(principal.labEdit2.Text);
if (principal.labEdit2.SelLength) = 3 then
principal.Memo2.Lines.Append(principal.labEdit2.Text + extractFileName(sArchivoPartido))
else
principal.Memo2.Lines.Append(principal.labEdit2.Text+'\'+extractFileName(sArchivoPartido));
try
if fs.Size - fs.Position < iLongitudTrozo then
iLongitudTrozo := FS.Size - FS.Position;
Stream.CopyFrom( FS, iLongitudTrozo );
finally
Stream.Free;
end;
end;
finally
FS.Free;
principal.Button1.Enabled:= false;
principal.Memo2.Lines.Add((Chr(13))+ (chr(10)));
principal.Memo2.Lines.Add('Archivo original: '+principal.LabEdit1.Text);
principal.memo2.Lines.Add('Ruta destino: '+principal.labEdit2.Text);
principal.Memo2.Lines.Add('Código HASH: '+principal.Memo1.Text);
end;
if principal.prBar.Max = principal.prBar.Position then
principal.Timer1.Enabled:= true;
Principal.lblTerminado.Visible:= true;
principal.Button2.Enabled:= true;
principal.guardarM.Enabled:= true;
principal.copiarM.Enabled:= true;
principal.Volver1.Enabled:= true;
end;
El resto del código de este procedimiento es igual con la única diferencia de ir aumentando los trozos en los que se cortará el archivo original (2Mb, 5Mb, 10.... etc)
Adjunto captura del error.
¿Alguna idea o sugerencia?
Saludos y gracias.
|