FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
mlara, me alegro que hayas descubierto el misterio.
Algo me dice que tras muchas horas de estar peliandote con este problema vas a poder dormir más tranquilo. Quisiera aprovechar, si no te es molestia, darte algunos consejos. Y es algo que ya te han estado aconsejando. Por empezar ¿6000 líneas de código? Disculpa que lo diga pero es demencial. Si con 1000 ya son muchas, 6000 rebasa lo esperado y pensado. ¿Todo en una unidad? ¿A que se debe tan extraña necesidad? Se que tras obtener 6000 líneas ponerse a modularizar y estructurar mejor va a ser un dolor de cabeza, pero a la larga te beneficiará. Conseguirás módulos más o menos independiente, por lo que el mantenimiento al código se hace más llevadero y además, mantiene un valor de cohesión posiblemente más elevado que tu diseño original. Como te han sugerido, emplea frames. Si buscas frames en el buscador obtendrás hilos que tratan el tema. Y aprovecha la herencia visual (de hecho, los frames se basan en ella). Un ejemplo, a modo de práctica, de como se consigue es esto: 1. Crear un form, añade unos controles y guardalo con el proyecto. 2. Ve a File -> New -> Other -> Proyect1 (o el nombre del proyecto). 3. Seleccionas el Form. 4. Selecciona la opción Inherit. 5. Presiona OK Si has seguido los pasos, deberás obtener un nuevo Form, con la apariencia visual del Form elegido. Si te fijas en el código obtendras algo como esto:
En mi caso, Form2, es el "padre". Del cual deriva el Form3. Cualquier cambio que realices en Form2, se propagará a sus hijos, asi que cuando lleves a la práctica esta técnica debes asegurarte de que y como será el form base o padre sobre el que se heredará. ¿Y que pasa con el código?¿Que sucede si el form base tiene código? El form que hereda de él hereda también el comportamiento de dicho código. He dicho comportamiento ya que no ves el código asociado al padre. Supongamos que tienes un botón en la fdrma padre. Digamos que el código es este:
¿Que sucede si pulsamos doble click sobre el de la forma heredada? Obtendrás una "extraño" palabra: ¿Que signfica esto? Pues simplemente que heredará el comportamiento y todo lo que haga en form2. Modificamos el código, por algo como este:
Guarda y ejecuta. Cuando se pulse el botón de Form3 recibirás dos avisos. Primero el de "Estoy en form2" y luego "He pulsado al botón de form3". ¿Y si le borramos la cláusula inherithed?
Simplemente se ignora el código del padre y obtendrás un flamante "He pulsado al botón de form3". Creo que esto da una introducción (Tal vez demasiado rápida) al tema de herencia visual. Espero que te haya sido de ayuda. Por el tema de frames, mejor no digo ya que se ha tratado, ya ha sido mucho sobre el tema. Saludos, |
#22
|
||||
|
||||
Muchas gracias Delphius. Como decía más arriba en este hilo, quizá haya usado la herencia visual, aunque sea de forma intuitiva. Bueno, no sabía a qué exactamente se hacía referencia en ese momento, pero ahora que das el ejemplo, pues te cuento que en mis proyectos sí la he usado, y lo he intentado hacer de la mejor manera.
Bueno, la verdad es que no sé si pudiera usar la herencia visual en este proyecto específicamente para esta ventana. Te voy a contar por qué. Se trata de una ventana de configuración. Como las que ya conocemos, tipo ventana de opciones de Firefox o la misma ventana Editor Properties del IDE de Delphi. Tenemos varias secciones de configuración. Cada una de estas hace referencia a una parte específica de nuestro sistema, exactamente a 35 secciones. Cada sección a la que se puede acceder a través de un TreeView tiene componentes como ComboBox, CheckBox, Edit, una que otra grilla, botones, imágenes, pestañas, etc. Las secciones se parecen muy poco unas con otras, y la ventana dentro del sistema es única. Como puedes imaginar, en primera instancia no creo que pueda usarse la herencia visual, aunque sí estoy de acuerdo en que se puede optimizar el funcionamiento de dicha ventana. para dar una idea más exacta de lo que es, he decidido poner algunos "WindowShots" en este link. Claro, como siempre, se aceptan sugerencias , ya que entre otras cosas ya se me hace necesario optimizar esta ventanita.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. Última edición por mlara fecha: 19-05-2008 a las 05:24:33. |
#23
|
||||
|
||||
Hola mlara,
A como veo, yo diría que en este caso lo más útil es emplear frames. Los frames son como forms bajo la herencia visual, pero ha diferencia de éstos, se pueden crear/detruir a demanda y se incorporan a un form. es decir que un form puedes colocar más de um frame. Cada frame puede contener su código, y no necesitaría alterarlo. Burdamente se podría decir que son forms dentro de forms. ¿Y parte del código puede reducirse? Saludos, |
#24
|
||||
|
||||
mmm, pues no sé. En esto debo trabajar. Lo curioso de esta ventana es que a través de ella no se hacen procesos complejos ni nada que se le parezca, ya que simplemente se leen y guardan los valores de configuración, salvo en un par de secciones en donde se usan algunos componentes de base de datos. Para dar una idea del código, transcribo un fragmento del mismo aquí:
Código:
procedure TfConfiguracion.bGuardarCambiosClick(Sender: TObject); var IniFile: TIniFile; CI, TextLine, ModoVista: string; I: Short; begin CI := IntToStr(fMaestro.CurrentInstitution); IniFile := TIniFile.Create(fMaestro.IniFileName); // + Estudiantes - Datos adicionales with sgDatosAdicionalesEstudiantes1 do begin IniFile.WriteString('Estudiantes', CI+'-Dato1_Nombre', Cells[4, 1]); IniFile.WriteString('Estudiantes', CI+'-Dato2_Nombre', Cells[4, 2]); ... if Cells[3, 1] = 'SI' then IniFile.WriteBool('Estudiantes', CI+'-Dato1_Habilitado', True) else IniFile.WriteBool('Estudiantes', CI+'-Dato1_Habilitado', False); ... end; // + Indicadores IniFile.WriteBool('Logros', 'AutoInc', ckbAutoIncCodigoLogro.Checked); IniFile.WriteInteger('Logros', 'LogrosConsulta.Rejilla', rgRejilla.ItemIndex); if rbDistribucionVertical.Checked then IniFile.WriteInteger('Ventanas', 'LogrosConsulta.DBGLogros.Style', 2) else IniFile.WriteInteger('Ventanas', 'LogrosConsulta.DBGLogros.Style', 1); // + Evaluaciones y asistencia (Estilo de visualización) IniFile.WriteInteger('LogrosAsistencia', 'Estilo', rgEstiloEvaluacionesAsistencia.ItemIndex); // + Evaluaciones y asistencia (Estilo de visualización por estudiante) IniFile.WriteInteger('LogrosAsistencia', 'EstudiantesVisibles', rbEstudiantesVisibles.ItemIndex); IniFile.WriteBool('LogrosAsistencia', 'OrganizarEstudiantesAuto', ckbOrganizarEstudiantesAuto.Checked); IniFile.WriteBool('LogrosAsistencia', 'ConservarCodigoLogro', ckbConservarCodigo.Checked); IniFile.WriteBool('LogrosAsistencia', 'ConservarValoracionLogro', ckbConservarValoracion.Checked); IniFile.WriteBool('LogrosAsistencia', 'AutoDesplazamiento', ckbAutoDesplazamiento.Checked); IniFile.WriteBool('LogrosAsistencia', 'FaltasTotalesPeriodo', ckbPermitirFaltasTotalesPeriodo.Checked); IniFile.WriteBool('LogrosAsistencia', 'ForzarAreaMateria', ckbPermitirForzarAreaMateria.Checked); IniFile.WriteBool('LogrosAsistencia', 'NoActualizarEval', ckbNoActualizarEval.Checked); IniFile.WriteBool('LogrosAsistencia', 'SolicitarDocumentoRec', ckbSolicitarDocumentoRespaldoRec.Checked); // + Evaluaciones y asistencia (Estilo de visualización por materia) IniFile.WriteInteger('LogrosAsistencia2', 'NombresApellidos', rgListaEstudiantes.ItemIndex); IniFile.WriteInteger('LogrosAsistencia2', 'DireccionEvaluacion', rgDireccionEvaluacion.ItemIndex); IniFile.WriteInteger('LogrosAsistencia2', 'TipoSonido', cbSonidos.ItemIndex); ...
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#25
|
||||
|
||||
La verdad es que la tienes dificil
En fin, quedará en ti analizar si es viable a estas alturas estructurar el código. Lo único que se me ocurre es separar la configuración en varias partes, lo más independientemente posible, en formas separadas y tratar de conseguir un procedimiento al estilo: procedure SaveConfiguratiosFromForm(TForm: TCustomForm); Y buscar la manera de centralizar en un sólo punto los elementos comunes. O algo por el estilo. E incluso, se podría conseguir con los Frames. Yo al menos soy de la idea de que si hay mucho que configurar, separo el trabajo en diversas configuraciones. No se que más decirte por el momento, se me acabaron las ideas por hoy... Se me está apgando el cerebro. Por el momento, lo que si puedo darte es ánimos. No dejes que esas KLDC te dominen. Saludos, |
#26
|
||||
|
||||
jajajajajjj... muchas gracias Delphius.
y bueno, yo por hoy me voy a dormir, después de las horas buscando la razón del error, como dijiste, puedo dormir más tranquilo. Saludos.
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#27
|
||||
|
||||
¡Que bueno que llegamos a una conclusión mlara!
Sería interesante ver si en Delphi 2007 ocurre lo mismo o si ya había sido tomada en cuenta la sugerencia de aceptar LFs solos. Cita:
Desde mi punto de vista, ninguna rutina debe tener más de unas cuantas decenas de líneas. He llegado a crear algunas de hasta 50 o 70 líneas, pero por lo general no las escribo con más de un pequeño puñado de sentencias. El código atomizado es más fácil de depurar y mantener y goza de mayor aprovechamiento. Se empieza por buscar patrones de código consistentes, susceptibles a ser optimizados. Código:
... { Ajusté los nombres de los cuadros de verificación para que concordaran con los nombres de las llaves } IniFile.WriteBool('LogrosAsistencia', 'OrganizarEstudiantesAuto', ckbOrganizarEstudiantesAuto.Checked); IniFile.WriteBool('LogrosAsistencia', 'ConservarCodigoLogro', ckbConservarCodigoLogro.Checked); IniFile.WriteBool('LogrosAsistencia', 'ConservarValoracionLogro', ckbConservarValoracionLogro.Checked); ... Se me ocurre que puede escribirse un procedimiento que pueda ser llamado de esta forma:
Incluso podría reducirse más, lo anterior es solo una aproximación. Me alegro por haber ayudado a resolver el misterio. Un abrazo con retorno y sin fin. Al González. |
#28
|
||||
|
||||
Cita:
Como en todo, se dice el pecado pero no el pecador, así que hasta aquí puedo leer. Lo que sí es cierto es que Delphi 7 + GExpert + cnpacks se comporta de forma excelente manejando esos archivos. Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#29
|
||||
|
||||
Bueno, antes que nada gracias nuevamente a Delphius y a Al por sus sugerencias. La última sugerencia de Al es muy buena. La tendré muy en cuenta. Por otra parte, y con relación al número de líneas de código, no quise discutirlo antes, pero pienso que no es bueno limitarse tanto, aunque siempre pensando en que el código debe estar bien estructurado, y que cuando sea necesario hay que usar POO. Yo particularmente he escrito algunos procedimientos en SQL y también otros en Delphi que tienen algunos cientos de líneas, luego de haberlos depurado "al máximo" (aunque claro, siempre se puede un poco más).
__________________
...y mañana caminaré por las calles pasando inadvertido, como siempre. |
#30
|
||||
|
||||
Cita:
Disculpa que lo diga, pero el haber dicho "se dice el pecado pero no el pecador" no me agradó demasiado. Como si yo hubiera cometido una ofensa. Lepe te pido disculpas si te has sentido ofendido. No pretendo decir que está mal tener miles de líneas, pero es que cifras tan altas llaman a revisión y examen. No se cuales son los motivos por los cuales te ves envuelto en esas 30000 lineas, pero Dios quiera que no te sea dificil entenderlas. Será que me cuesta creer que en la idea de más de 2 KLDC. Pero, yo en ningún momento he machacado a alguien por escribir x lineas en vez de y. Simplemente he dado una opinión. Será que tengo demasiado (tal vez, en extremo) impregnado en mi el sentido de reducir el código. No me creo un genio en programación y respeto tus grandes dotes de programación, pero no hace falta ser un genio para saber que donde hay miles de lineas, el encontrar una posible fuente de error (en caso de que exista) es un dolor de cabeza. Y posiblemente el esfuerzo en solucionarlo sea más que el de sólo hallarlo. Lo siento si alguien se molesta el que diga esto. Pero lo cierto es cierto: la magnitud e impacto de un error es proporcional a la cantidad de líneas. No es lo mismo detectar y solucionar un error en 1000 lineas, que detectarlo en 100000. Tal vez se puede haber una excepción a la regla. Pero mientras tanto, yo prefiero someterme a un valor bajo de LDC/Unidad. Y repito. Sólo es mi opinión. Saludos, Última edición por Delphius fecha: 19-05-2008 a las 20:04:25. |
#31
|
||||
|
||||
Cita:
Lo normal es tener en una unidad, como máximo, 1.000- 2.000 LDC, si se necesita más, empieza a cuestionar el diseño, tienes toda la razón. En mi caso concreto, estoy trabajando para una empresa, compró los fuentes de "un componente comercial" y éste tiene varias unidades, la media, 30.000 LDC cada archivo. Puesto que no he comprado yo los fuentes, no me parece correcto decir el nombre de "ese componente", de ahí la frase "se dice el pecado pero no el pecador",. Como ves esa frase no iba hacia tu persona, sino al propio componente y a sus creadores . Te pido disculpas por dejar tanto margen a malinterpretaciones. En estos momentos hasta Dios se está riendo de mí Mi comentario iba más en ese sentido, existir... existe componentes comerciales que superan los dos kilos. Y estoy totalmente de acuerdo con tu opinión.
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
#32
|
||||
|
||||
Cita:
Disculpame por no haber sabido manejar la situación. Saludos, |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Statement expected, but expression of type 'Boolean' found | Shikanda | Conexión con bases de datos | 7 | 06-09-2007 13:26:19 |
"Undeclared Identifier "CLOSE" | anghell77 | OOP | 4 | 09-10-2006 12:18:26 |
Error "File not found: AHMSystemClass.dcu" | Miriamc | Varios | 2 | 05-06-2006 16:13:36 |
Error: "Record not found or changed by another user" | jmlifi | Varios | 0 | 27-01-2006 10:16:57 |
Solución para el error "Field ID not found" | Calderin | Conexión con bases de datos | 5 | 24-11-2004 11:18:26 |
|