Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Error al llamar a procedimiento (https://www.clubdelphi.com/foros/showthread.php?t=86468)

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);
{begin
  TrocearArchivo(labEdit1.Text,2048);
  button2.Enabled:= false;
end;}
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; //(data^).Path;
  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;        //1MB  --> los tamaños se muestran en Mbytes

      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.

roman 14-08-2014 21:25:33

No he revisado a fondo, pero desde el principio:

Código Delphi [-]
begin
  New(pDato);
  pDato := @Dato;
  Dato.Path := Principal.LabEdit1.text;
  Dato.Size := 2048;
  Thread.MsgWaitFor(ThreadExample, pDato);
end;

algo parece ir mal. Tú asignas memoria a pDato con la llamada a New, pero luego redireccionas pDato a la variable Dato que no ha sido inicializada y usas esta variable como si nada. Es lógico que te aparezca un "Access Violation".

// Saludos

danielmj 16-08-2014 09:59:24

Hola roman, perdona por no contestar antes, tienes razón, no está inicializada la variable, el problema es que hace meses que deje este mini proyecto aparcado y ahora que lo retomo pues salen fallos y no sé muy bien por donde tirar, también es verdad que debí dejar anotaciones para cuando continuase. De todos modos, yo recuerdo que antes de dejarlo lo podía usar, cortaba y unia archivos correctamente y no me daba errores, así que no me explico cmo ahora si falla, imagino que algo tocaria antes de "abandonarlo" y se jodio todo.
En fin, voy a revisarlo todo y ya te comento.

Saludos.


La franja horaria es GMT +2. Ahora son las 01:14:55.

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