PDA

Ver la Versión Completa : Cortar y copiar archivos...


[Gunman]
08-04-2006, 18:21:38
Buenoooo, tengo un conjunto de funciones y procedimientos para copiar y cortar archivos, el problema es que funcionan "cuando les da la gana" y no se por que.
Bueno, el objeto CutCopy es un objeto propio que tiene dos propiedades, List (la lista de archvios a cortar o copiar) y Func (la función a desempeñar), así que sólo pongo uno.
Antes que nada el código de la función Operation (lo único que hace es llamar a SHFileOperation, la he creado por comodidad)

procedure Operation(Wnd: HWND; wFunc: UINT; pFrom: PAnsiChar; pTo: PAnsiChar;
fFlags: FILEOP_FLAGS; lpszProgressTitle: PAnsiChar);
var
SHFileOpStruct: TSHFileOpStruct;
begin
ShFileOpStruct.Wnd := Wnd;
ShFileOpStruct.wFunc := wFunc;
ShFileOpStruct.pFrom := pFrom;
ShFileOpStruct.pTo := pTo;
ShFileOpStruct.fFlags := fFlags;
ShFileOpStruct.lpszProgressTitle := lpszProgressTitle;
SHFileOperation(SHFileOpStruct);
end;

El código de las acciones de Copiar y Cortar son idénticos, sólo cambia el valor de CutCopy.Func (ccCopy o ccPaste), así que sólo pongo una acción:

procedure TMainFrm.LcCopyActExecute(Sender: TObject);
var
I: Integer;
begin
CutCopy.List.Clear;
for I := 0 to LcList.Items.Count - 1 do
if LcList.Items[i].Selected then
CutCopy.List.Add(LcCurrentDir+LcList.Items[i].Caption);
CutCopy.Func := ccCopy;
end;

Y finalmente el código de la acción Paste, que es la que se encarga de llamar a la función Operation (es decir, SHFileOperation):

procedure TMainFrm.LcPasteActExecute(Sender: TObject);
var
I: Integer;
begin
if CutCopy.Func = ccCut then
begin
for I := 0 to CutCopy.List.Count - 1 do
begin
Operation(Handle, FO_MOVE, PAnsiChar(CutCopy.List.Strings[i]),
PAnsiChar(LcCurrentDir+ExtractFileName(CutCopy.List.Strings[i])),
FOF_SIMPLEPROGRESS+FOF_NOCONFIRMATION,'');
end;
end;
if CutCopy.Func = ccCopy then
begin
for I := 0 to CutCopy.List.Count - 1 do
begin
Operation(Handle, FO_COPY, PAnsiChar(CutCopy.List.Strings[i]),
PAnsiChar(LcCurrentDir+ExtractFileName(CutCopy.List.Strings[i])),
FOF_SIMPLEPROGRESS+FOF_NOCONFIRMATION,'');
end;
end;
LcRefreshAct.Execute;
CutCopy.Func := ccNone;
end;

Bueno, pues como he dicho, esto me funciona con algunos archivos y carpetas y con otros no, a veces si uno no podia copiarlo cierro el programa y si puedo copiarlo. Por qué sucede esto? Falta algo? Sobra algo?
Muchas gracias de anticipado, y disculpad por haceros leer tan largo post... ;)