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
  #1  
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,

De ahí parto Román... o es la intención: como "ShFileOperation" retorna "no cero"... busco el error con "GetLastError", pero, no parece estar ahí.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #2  
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,

De ahí parto Román... o es la intención: como "ShFileOperation" retorna "no cero"... busco el error con "GetLastError", pero, no parece estar ahí.
Según Microsoft no debes de usar "GetLastError" para esta función

Cita:
Empezado por msdn2.microsoft.com
Return Value


Returns zero if successful; otherwise nonzero. Applications normally should simply check for zero or nonzero.

It is good practice to examine the value of the fAnyOperationsAborted member of the SHFILEOPSTRUCT. SHFileOperation can return 0 for success if the user cancels the operation. If you do not check fAnyOperationsAborted as well as the return value, you cannot know that the function accomplished the full task you asked of it and you might proceed under incorrect assumptions.


Do not use GetLastError with the return values of this function.
Aquí el artículo completo.

Salud OS.
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #3  
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,

Gracias egostar. Me quedo con todo, pero, particularmente con esto:

Cita:
It is good practice to examine the value of the fAnyOperationsAborted member of the SHFILEOPSTRUCT. SHFileOperation can return 0 for success if the user cancels the operation.
Puesto que, efectivamente, he comprobado que si se cancela la tarea la función sigue retornando cero, o sea "True".

Gracias otra vez a todos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
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,

O sea:

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;
  if Win32Check((ShFileOperation(FileOp) = 0)) then
    result := not FileOp.fAnyOperationsAborted
  else
    result := false;
end;

Má o meno....
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #5  
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
No entiendo porque usar Win32Check. Esa función solo crea una excepción cuando el valor que le pasas no es TRUE, siempre el mismo tipo de excepción. Si es eso lo que quieres, perfecto, pero no creo que te haga falta.
Responder Con Cita
  #6  
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
  #7  
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
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 13:49:31.


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