Ir al contenido


Foto

[RESUELTO] Treeview como explorer con checkboxes


  • Por favor identifícate para responder
52 respuestas en este tema

#41 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 09 septiembre 2010 - 09:22

Para un formulario modal:



cpp
  1.   TForm1 *Form = new TForm1 (this);
  2.   if(Form ->ShowModal()==mrOk){
  3.       // Acciones si salió pulsando OK en caso de que definieras un ModalResult en los botones...
  4.       .......
  5.   }
  6.   delete Form;



O si no te interesa un ModalResult



cpp
  1.   TForm1 *Form = new TForm1 (this);
  2.   Form ->ShowModal();
  3.   delete Form;



Si queremos una destrucción automática del formulario entonces usa caFree en el evento OnClose.

Si el puntero usado para el formulario es de ámbito local, no lo vas a volver a usar. En ese caso no es necesario colocar su valor a cero ni realizar el test.

Si el puntero tiene un ámbito superior al de la función que lo usa, es bueno la asignación nula, sobre todo si no te hace falta o no quieres volverlo a crear.

Saludos.
  • 0

#42 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 09 septiembre 2010 - 10:37

ok, escafandra muchas gracias por la ayuda ya utilizare lo que me dices.
saludos
  • 0

#43 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 16 septiembre 2010 - 12:16

Hola escafandra he pesto el codigo para llamar a un formulario dinamico de la siguiente forma:



cpp
  1. TfrmOptions *frm = new TfrmOptions (this);
  2. frm->ShowModal();
  3. delete frm;



en el form dinámico pongo:



cpp
  1. void __fastcall TfrmOptions::FormClose(TObject *Sender, TCloseAction &Action) {
  2. Action = caFree;
  3. }



pero al intentar cerrar dicho formulario por un botón el cual tiene el siguiente código:


cpp
  1. this->Close();
  2. tambien intente con:
  3. frmOptions->Close();
  4. y
  5. frmOptions0->CloseModal();



me arroja un error.

  • 0

#44 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 12:56

Si tratas de cerrar el formulario desde una función de la clase TfrmOptions, vale con Close();
Si lo cierras desde el formulario que lo creó, o desde otro, entonces:



cpp
  1. frm->Close();



Al haber colocado la opción caFree en el evento OnClose, se va a autodestruir. no debes usar delete frm.

Yo, para evitar errores y descuidos siempre creo y destrullo manualmente (new y delete) no usando la opción caFree mas que para contadas ocasiones.

En resumen caFree es incompatible con delete pues destruyes dos veces, la primera bien, la segunda destruye algo que ya no es válido, generando un error.


Saludos.
  • 0

#45 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 16 septiembre 2010 - 01:55

gracias escafandra, intente hacer algunos arreglos.
en el formulario dinamico quite Action=caFree;
pero aun así cuando doy clic en un botón que inserte en ese mismo formulario para cerrarlo me da un error. el código del botón es frmOptions->Close();que puede ser?
  • 0

#46 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 16 septiembre 2010 - 03:03

Depende del tipo de error. Es posible que tengas algo mal en el destructor de la clase y destruyas mal algún puntero...

Saludos.
  • 0

#47 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 18 octubre 2010 - 09:09

Hola, con respecto a los formularios dinamicos y el formulario del treeview tengo el siguiente problema:
Tengo tres formularios: 1-Formulario principal, 2-Formulario dinamico con Memo1 (donde se muestran los path de los file), 3-Formulario dinamico con Treeview
Hago lo siguiente:
Levanto el form2 con:


cpp
  1. TfrmTask *frm = new TfrmTask (this);
  2. frm->ShowModal();
  3. delete frm;


Lo segundo es llamar a formulario 3 de la misma forma, cuando intento pasar los valores del treeview al memo utilizando la funcion:


cpp
  1. SaveFilesFormStrigns(frmTask->mmoSource->Lines);


o cuando intento utilizar la funcion:


cpp
  1. frmSource->LoadFilesFormStrigns(mmoSource->Lines);


me da un error o excepción, bueno un cartel de error. No se que pueda hacer, pero si se que comentariando las lineas el problema esta resuelto, pero no me sirve pues como sabes necesito utilizar ambas funciones.

Sin embargo si pongo el formulario 2 como no dinámico no curre ningún problema.
Saludos

  • 0

#48 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 18 octubre 2010 - 12:01

....Sin embargo si pongo el formulario 2 como no dinámico no curre ningún problema.


Exacto, ifirt. La cosa funciona así. No puedes usar nada del formulario 2 tras haberlo destruido, por eso no tienes errores cuando es estático. Recuerda que al destruir un objeto no sólo destruyes su ventana sino el conjunto del mismo.

La solución es:
1.- Que sea estático o
2.- Destruirlo sólo cuando ya no hace falta.

Saludos.
  • 0

#49 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 19 octubre 2010 - 06:40

Gracias escafandra.
Una pregunta com lo destruyo? es decir si pongo en un boton
delete frmTask;
y luego Close();
estaria bien?
Gracias y saludos
  • 0

#50 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 19 octubre 2010 - 03:39

...Una pregunta com lo destruyo?...


Bien Guardas como variable global el puntero al formulario para mas tarde destruirlo cuando quieras con un simple delete frmTask;

o Bien lo dejas a la destrucción automática dando el valor caFree al parámetro Action (TCloseAction) en el evento OnClose de dicho formulario.

Saludos.
  • 0

#51 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 20 octubre 2010 - 01:44

Gracias escafandra, ya lo puse en practica y todo bien. Muy agradecido
saludos
  • 0

#52 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 28 octubre 2010 - 07:30

Hola escafandra, trabajando con el treeview como explorer y creando backups con este creo que se nos quedo algo en el tintero y fue lo siguiente:
Cuando se utiliza:


cpp
  1. FileName = Destinos->Strings[d] + String (Strings->Strings[s].c_str() + 3);


Se le esta quitando, por ejemplo
a C:\\fichero.exe la C:\\ y se queda como fichero.exe
Luego en la carpeta destino del backup queda la siguiente:
Carpeta destino->Fichero.exe
Y aqui esta el inconveniente, y es que no se sabe de donde vino este fichero, me explico.
Si hacemos una salva del fichero que esta en D: o en C: o en F: siempre se guardara en destino sin decir de la unidad que vino y esto si pensamos un poquito mas puede que la haga falta a un usuario final saberlo. Decide quitar el + 3  pero no me funciona y me liado un poco. Espero me entiendas y puedas ayudarme por favor. Muchas gracias
  • 0

#53 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.111 mensajes
  • LocationMadrid - España

Escrito 30 octubre 2010 - 05:30

No termino de entenderte.

Ese fragmento de código está en el bucle del thread para copiar y lo que hace es eliminar del path el nombre del disco original, no se puede dar a un fichero el nombre que contenga, por ejemplo ":", de manera que el nombre del disco original no puede estar en el nombre del fichero destino.

Si quieres guardar el nombre del disco original deberás hacerlo en un archivo adjunto donde guardes todas las rutas de los ficheros pertenecientes al backup, por ejemplo. Puedes usar la información creada en el memo. De esta forma tienes el listado de los archivos, por si luego falta alguno. ;)

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.