Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Sistemas operativos > Windows
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #21  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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.
__________________
David Esperalta
www.decsoftutils.com

Última edición por dec fecha: 05-06-2007 a las 01:33:11.
Responder Con Cita
  #22  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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é...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #23  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Qué grandes sois... estoy probando por aquí el asunto y se ve estupendo. Os agradezco de veras vuestras aportaciones.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #24  
Antiguo 05-06-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 26
seoane Va por buen camino
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
Responder Con Cita
  #25  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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? No sé si me explico.

En todo caso un monstruo, Seoane, ya te digo.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #26  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Vale... vale... soy un puñetero.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #27  
Antiguo 05-06-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
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? No sé si me explico.

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

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #28  
Antiguo 05-06-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.142
Poder: 36
dec Tiene un aura espectaculardec Tiene un aura espectacular
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...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #29  
Antiguo 05-06-2007
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.572
Poder: 27
egostar Va camino a la fama
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...
A mira, o sea que estas jalando hilo para sacar madeja.

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

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Duda sobre entorno Delphi para Windows Vista geru_deusto Varios 9 12-01-2007 13:07:12
Tratamiento de Errores jsc Varios 2 15-09-2005 16:20:01
Siguen Errores de CORBA con Windows ME zuriel_zrf Providers 0 11-08-2004 08:35:34
conectar Firebird bajo entorno windows djavier22 Firebird e Interbase 2 05-07-2004 20:10:07
Tratamiento de la Voz muli Varios 0 03-11-2003 19:46:53


La franja horaria es GMT +2. Ahora son las 00:17:06.


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