Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=26)
-   -   Tratamiento de errores entorno al API de Windows (https://www.clubdelphi.com/foros/showthread.php?t=44364)

dec 05-06-2007 01:24:31

Hola,

Bueno. El que se levante una excepción puede ayudar. Ahora, la idea es que dicha excepción (en mi caso) aporte "algo". Es decir, no es lo mismo (en mi caso al menos, y según lo veo ahora...) que una función retorne "false" y nada más... a que retorne "false" y exista una variable global, digamos, "ultimoError", donde pueda consultarse el motivo del fallo de la función.

Esa es la idea. Ahora bien, se supone que no siempre tiene que retornar el mismo mensaje. Y ahí puede que esté la madre del cordero. Efectivamente, la excepción puede que sea siempre, como dices, del tipo "EOSError", empero, el mensaje de error que la acompañe, ¿será siempre el mismo?

En el caso de que el archivo o carpeta a borrar no exista, el mensaje de la excepción es "System Error. Code: 6. Controlador no válido". Supongo que en otro errores se darán otro tipo de mensajes, pero, ahora mismo no se me ocurre cómo puedo probar el asunto. :)

dec 05-06-2007 01:39:56

Hola,

Es curioso, ¿no?

Código Delphi [-]
  // SysUtils.pas


function Win32Check(RetVal: BOOL): BOOL;
begin
  if not RetVal then RaiseLastOSError;
  Result := RetVal;
end;

procedure RaiseLastOSError;
begin
  RaiseLastOSError(GetLastError);
end;

procedure RaiseLastOSError(LastError: Integer);
var
  Error: EOSError;
begin
  if LastError <> 0 then
    Error := EOSError.CreateResFmt(@SOSError, [LastError,
      SysErrorMessage(LastError)])
  else
    Error := EOSError.CreateRes(@SUnkOSError);
  Error.ErrorCode := LastError;
  raise Error;
end;

O sea. Si la función del API retorna "false" (esto usando "Win32Check"), levantamos una excepción con el último error del sistema. Cuando hacemos esto miramos, precisamente, el valor de "GetLastError", y creamos una excepción "EOSError" con el mensaje que consigamos de "SysErrorMessage"...

Y si "GetLastError" retorna un bonito cero... creamos la excepción con el mensaje "Error desconocido"...

¿Sólo a mí me parece curioso, luego de haber seguido este Hilo desde un principio? :)

Ahora, hasta ahí llego... me parece curioso, me llama la atención, pero, tampoco sé decir exactamente porqué... :)

dec 05-06-2007 01:55:45

Hola,

Qué grandes sois... estoy probando por aquí el asunto y se ve estupendo. Os agradezco de veras vuestras aportaciones. :)

seoane 05-06-2007 02:25:15

Bueno, yo crearia una funcion como esta:
Código Delphi [-]
const
  DE_SAMEFILE  = $71;
  DE_MANYSRC1DEST  = $72;
  DE_DIFFDIR  = $73;
  DE_ROOTDIR  = $74;
  DE_OPCANCELLED  = $75;
  DE_DESTSUBTREE  = $76;
  DE_ACCESSDENIEDSRC  = $78;
  DE_PATHTOODEEP  = $79;
  DE_MANYDEST  = $7A;
  DE_INVALIDFILES  = $7C;
  DE_DESTSAMETREE  = $7D;
  DE_FLDDESTISFILE  = $7E;
  DE_FILEDESTISFLD  = $80;
  DE_FILENAMETOOLONG  = $81;
  DE_DEST_IS_CDROM  = $82;
  DE_DEST_IS_DVD  = $83;
  DE_DEST_IS_CDRECORD  = $84;
  DE_FILE_TOO_LARGE  = $85;
  DE_SRC_IS_CDROM  = $86;
  DE_SRC_IS_DVD  = $87;
  DE_SRC_IS_CDRECORD  = $88;
  DE_ERROR_MAX  = $B7;
  DE_UNKHOWN = $402;
  ERRORONDEST  = $10000;

function SHCheck(Value: Integer): Boolean;
var
  Error: EOSError;
begin
  if Value <> 0 then
  begin
    Result:= FALSE;
    case Value of
      DE_SAMEFILE: Error:= EOSError.Create('The source and destination files are the same file.');
      DE_MANYSRC1DEST: Error:= EOSError.Create('Multiple file paths were specified in the source buffer, but only one destination file path.');
      DE_DIFFDIR: Error:= EOSError.Create('Rename operation was specified but the destination path is a different directory. Use the move operation instead.');
      DE_ROOTDIR: Error:= EOSError.Create('The source is a root directory, which cannot be moved or renamed.');
      DE_OPCANCELLED: Error:= EOSError.Create('The operation was cancelled by the user, or silently cancelled if the appropriate flags were supplied to SHFileOperation.');
      DE_DESTSUBTREE: Error:= EOSError.Create('The destination is a subtree of the source.');
      DE_ACCESSDENIEDSRC: Error:= EOSError.Create('Security settings denied access to the source.');
      DE_PATHTOODEEP: Error:= EOSError.Create('The source or destination path exceeded or would exceed MAX_PATH.');
      DE_MANYDEST: Error:= EOSError.Create('The operation involved multiple destination paths, which can fail in the case of a move operation.');
      DE_INVALIDFILES: Error:= EOSError.Create('The path in the source or destination or both was invalid.');
      DE_DESTSAMETREE: Error:= EOSError.Create('The source and destination have the same parent folder.');
      DE_FLDDESTISFILE: Error:= EOSError.Create('The destination path is an existing file.');
      DE_FILEDESTISFLD: Error:= EOSError.Create('The destination path is an existing folder.');
      DE_FILENAMETOOLONG: Error:= EOSError.Create('The name of the file exceeds MAX_PATH.');
      DE_DEST_IS_CDROM: Error:= EOSError.Create('The destination is a read-only CD-ROM, possibly unformatted.');
      DE_DEST_IS_DVD: Error:= EOSError.Create('The destination is a read-only DVD, possibly unformatted.');
      DE_DEST_IS_CDRECORD: Error:= EOSError.Create('The destination is a writable CD-ROM, possibly unformatted.');
      DE_FILE_TOO_LARGE: Error:= EOSError.Create('The file involved in the operation is too large for the destination media or file system.');
      DE_SRC_IS_CDROM: Error:= EOSError.Create('The source is a read-only CD-ROM, possibly unformatted.');
      DE_SRC_IS_DVD: Error:= EOSError.Create('The source is a read-only DVD, possibly unformatted.');
      DE_SRC_IS_CDRECORD: Error:= EOSError.Create('The source is a writable CD-ROM, possibly unformatted.');
      DE_ERROR_MAX: Error:= EOSError.Create('MAX_PATH was exceeded during the operation.');
      DE_UNKHOWN : Error:= EOSError.Create('An unknown error occurred. This is typically due to an invalid path in the source or destination. This error does not occur on Microsoft Windows Vista and later.');
      ERRORONDEST: Error:= EOSError.Create('An unspecified error occurred on the destination.');
      DE_ROOTDIR or ERRORONDEST: Error:= EOSError.Create('Destination is a root directory and cannot be renamed.');
    else
      Error:= EOSError.Create('Error desconocido');
    end;
    Error.ErrorCode:= Value;
    raise Error;
  end else
    Result:= TRUE;
end;

Y modificaría tu función de la siguiente manera:
Código Delphi [-]
function MoverCarpeta(const carpetaOrigen,
  carpetaDestion: string) : boolean;
var
  FileOp: TSHFileOpStruct;
begin
  FillChar(FileOp, SizeOf(FileOp),#0);
  with FileOp do begin
    wFunc := FO_MOVE;
    Wnd := GetActiveWindow();
    pTo := PChar(carpetaOrigen);
    pFrom := PChar(carpetaDestion+#0#0);
    fFlags := FOF_NOCONFIRMATION or FOF_SILENT
     or FOF_ALLOWUNDO or FOF_NOERRORUI;
  end;
  Result:= FALSE;
  if SHCheck(ShFileOperation(FileOp)) then
    Result := not FileOp.fAnyOperationsAborted;
end;

Ahora para dejarlo bonito deberías traducir los mensajes de error :p

dec 05-06-2007 02:48:11

Hola,

Joroba Seoane... no sé yo si llegaré a tanto (aunque tengo el trabajo hecho por lo visto), pero se agradece de veras. Sin embargoooooooooooo.... :) Puestos a ser puñeteros, pero puñeteros... ¿están contemplados todos los mensajes? Sí, sé que son muchos, pero, ¿están contemplados todos? ¿Los del futuro también? :D No sé si me explico. :D :D

En todo caso un monstruo, Seoane, ya te digo. :)

dec 05-06-2007 03:22:54

Hola,

Vale... vale... soy un puñetero. :D :D :D

egostar 05-06-2007 03:30:38

Cita:

Empezado por dec
Hola,

Joroba Seoane... no sé yo si llegaré a tanto (aunque tengo el trabajo hecho por lo visto), pero se agradece de veras. Sin embargoooooooooooo.... :) Puestos a ser puñeteros, pero puñeteros... ¿están contemplados todos los mensajes? Sí, sé que son muchos, pero, ¿están contemplados todos? ¿Los del futuro también? :D No sé si me explico. :D :D

En todo caso un monstruo, Seoane, ya te digo. :)

Cita:

Empezado por seoane

Código Delphi [-]
    
else
      Error:= EOSError.Create('Error desconocido');

Tu duda ya la contemplo Seoane, si si yo también soy puñetero:D:D:D

Salud OS.

dec 05-06-2007 03:43:58

Hola,

Ah... ahora que no nos oye Seoane (lo que le he respondido ha sido la gota que ha colmado el vaso y se marchó a dormir, e hizo bien, seguramente...), digo, ahora que no nos oye diré que muy probablemente haré uso de su código, entre otras cosas, porque, efectivamente, siempre estará el error "desconocido"...

Pero me estoy liando yo también... creo que me voy a dormir también... :D :D

egostar 05-06-2007 04:31:32

Cita:

Empezado por dec
Hola,

Ah... ahora que no nos oye Seoane (lo que le he respondido ha sido la gota que ha colmado el vaso y se marchó a dormir, e hizo bien, seguramente...), digo, ahora que no nos oye diré que muy probablemente haré uso de su código, entre otras cosas, porque, efectivamente, siempre estará el error "desconocido"...

Pero me estoy liando yo también... creo que me voy a dormir también... :D :D

A mira, o sea que estas jalando hilo para sacar madeja.

Espero que se levante temprano para que siga con el código.:D:D

Salud OS.


La franja horaria es GMT +2. Ahora son las 14:58:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi