no creo que se le pueda pedirm mas al codigo que haz dejado
Si te parece, entonces, podemos poner el tema como resuelto.
Saludos.
Escrito 02 marzo 2010 - 05:53
no creo que se le pueda pedirm mas al codigo que haz dejado
Escrito 02 marzo 2010 - 10:11
........ no creo que se le pueda pedirm mas al codigo que haz dejado .....
Escrito 21 abril 2010 - 06:14
Escrito 22 abril 2010 - 04:29
Hola amigos, un calido saludo a todos.Solo una sugerencia
Cuando se selecciona MiPC da un error si el treeview no esta expandido (es decir el unico elemento del treeview es MiPC) sugiero que tanto MiPC como Panel de control no tengan checkbox
Atentamente ifrit
Escrito 11 mayo 2010 - 05:27
Escrito 11 mayo 2010 - 04:43
void __fastcall TForm1::Button2Click(TObject *Sender) { Button2->Enabled = false; Stop = false; char Path[MAX_PATH]; char File[MAX_PATH]; TDir* Dir; TTreeNode* Node; char* fin; int L, Len; Node = TreeView->Items->Item[0]; // Expando el primer elemento (Mi PC) Node->Expand(false); for(int n=0; n<Memo1->Lines->Count; n++){ if(Trim(Memo1->Lines->Strings[n])=="") continue; strcpy(File, Trim(Memo1->Lines->Strings[n]).c_str()); fin = File; int i = 0; while(fin){ // Rompemos la ruta del archivo en carpetas y las buscamos en el arbol Len = strlen(File); fin = strchr(fin+1, '\\'); if(!fin) L = Len; else L = (DWORD)fin-(DWORD)File; // Buscamos en el arbol for(; i<TreeView->Items->Count; i++){ Application->ProcessMessages(); Node = TreeView->Items->Item[i]; if(!Node->Text.IsEmpty()){ Dir = (TDir*)(Node->Data); SHGetPathFromIDList(Dir->AbsoluteIdl, Path); if(!strnicmp(File, Path, L) && L+1 >= strlen(Path)){ if(L<Len) // Si es carpeta la expando Node->Expand(false); else // Si es archivo lo marco SetState(Node, Checked); break; } } } } } Button2->Enabled = true; }
Escrito 12 mayo 2010 - 10:59
Escrito 12 mayo 2010 - 12:27
...era exactamente lo que me propuse hacer...
if(!strnicmp(File, Path, L))
if(!strnicmp(File, Path, L) && L+1 >= strlen(Path))
Escrito 01 septiembre 2010 - 05:00
Escrito 02 septiembre 2010 - 06:08
Entiendo lo que expones. Para conseguir lo que quieres tenemos que realizar algunos cambios en la forma de trabajar. Básicamente debemos realizar:
1.- Si está elegida una carpeta, guardar su nombre solamente en el StringList, no los archivos.
2.- Modificar la rutina de copia para que sea capaz de copiar carpetas.
Lo primero es modificar SaveFilesFormStrigns, quedará de esta forma:
void TForm1::SaveFilesFormStrigns(TStrings *Strings) { Stop = false; Strings->Clear(); char Path[MAX_PATH]; TDir* Dir; TTreeNode* Node; for(int i=0 ; i<TreeView->Items->Count; i++){ Application->ProcessMessages(); Node = TreeView->Items->Item; if(Node->StateIndex == Disable || !Node->Parent) continue; if(Stop){ Strings->Clear(); break; } if(!Node->Text.IsEmpty()){ Dir = (TDir*)(Node->Data); SHGetPathFromIDList(Dir->AbsoluteIdl, Path); if(Node->StateIndex == Checked && Node->Parent->StateIndex != Checked && *Path){ if(!Dir->File) strcat(Path, "\\"); Strings->Add(String(Path)); } } } }
Al guardar el nombre de la carpeta le añade un carácter '\' para que el sistema de copia distinga con facilidad que debe copiar una carpeta y no un archivo.
LoadFilesFormStrigns debe ser modificado también para quitar ese carácter '\' que hemos añadido y cargue los archivos y carpetas en el árbol del TreeView.
He añadido una nueva función a la clase para desmarcar todos los elementos del árbol, ResetState
Lo siguiente es diseñar el sistema de copia. Puesto que te interesaba hacerlo manejando Threads así lo he diseñado. La copia de carpetas puede hacerse de varias formas con la API. Yo he implementado una forma recursiva que termina llamando a FileCopy. Puedes cambiar esto para llamar a FileCopyEx si quieres. Esto te puede dar el control en una barra de progreso que te indicaría la copia de cada archivo.
Te expongo el sistema de copia:
CreatePath se encarga de crear las carpetas destino necesarias:
void CreatePath(char* path) { if(DirectoryExists(path)) return; char Path[MAX_PATH]; char* fin = strchr(path, '\\'); while((fin = strchr(fin+1, '\\'))!=0){ *Path = 0; strncat(Path, path, (DWORD)fin-(DWORD)path); CreateDirectory(Path, 0); } }
[i]CopyFolder Copia una carpeta y sus subcarpetas en un destino de forma recursiva:
void CopyFolder(String Folder, String Destination) { if(Folder=="" || Destination =="") return; TSearchRec sr; if(!FindFirst(Folder + "\\*.*", faAnyFile, sr)) do{ if(sr.Name != "." && sr.Name != ".."){ if(sr.Attr & faDirectory){ CreatePath((Destination + sr.Name + "\\").c_str()); CopyFolder(Folder + sr.Name + "\\", Destination + sr.Name + "\\"); }else CopyFile((Folder + sr.Name).c_str(), (Destination + sr.Name).c_str(), false); } } while (!FindNext(sr)); FindClose(sr); }
Por último te muestro la función principal del hilo de copiado:
void __fastcall ThCopyFiles::Execute() { String FileName; for(int n=0; n < Strings->Count; n++){ FileName = Destino + String(Strings->Strings[n].c_str()+3); CreatePath(ExtractFilePath(FileName).c_str()); // Detectamos si es una carpeta... if(Strings->Strings[n][Strings->Strings[n].Length()]=='\\') CopyFolder(Strings->Strings[n], FileName); else CopyFile(Strings->Strings[n].c_str(), FileName.c_str(), false); if(Terminated) return; } }
Y eso es todo. Adjunto un ejemplo de todo el código tal y como quedaría y he probado.
Saludos.
Escrito 02 septiembre 2010 - 09:57
Escrito 02 septiembre 2010 - 10:29
Escrito 03 septiembre 2010 - 02:24
Escrito 08 septiembre 2010 - 05:52
Escrito 08 septiembre 2010 - 06:09
Form2->Función_lo_que_sea(Parámetros...);
Escrito 08 septiembre 2010 - 09:43
if(!strnicmp(File, Path, L) && L+1 >= strlen(Path)){
Escrito 08 septiembre 2010 - 11:40
cpp
if(!strnicmp(File, Path, L) && L+1 >= strlen(Path)){
de la funcion LoadFilesFormStrigns me da un warning
[BCC32 Warning] uSource.cpp(667): W8012 Comparing signed and unsigned values
if(!strnicmp(File, Path, L) && L+1 >= (int)strlen(Path)){
y lo otro es que cuando yo despliego el treeview y selecciono una carpeta o fichero y luego no la agrego al memo, cierro el form y luego lo vuelvo a abrir se mantienen seleccionados los ficheros o carpeta que había marcado.Espero que me entiendas lo que te quise decir..Es decir no es un error ni nada solo que seria bueno que al cerrar el form los ficheros seleccionados (se hallan pasado o no al memo) se des seleccionen
Escrito 09 septiembre 2010 - 05:04
Escrito 09 septiembre 2010 - 08:34
if (formulario_dinamico == NULL){ formulario_dinamico = new formulario_dinamico(this); formulario_dinamico->ShowModal(); }
formulario_dinamico = NULL; Action = caFree;