https://foro.gambas-es.org/viewtopic.php?f=1&t=368&p=2077#p2077
-----------------------------------
fabianfv
Viernes, 22 Enero 2010, 23:24

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
Pablo, te debes haber equivocado al simplificar el código, pero la simplificación que propone soplo es correcta y es necesario que lo hagas porque de otro modo terminarás construyendo programas que serán muy difíciles de mantener.

Entonces lo que deberías hacer es mostrarnos el código que simplificaste para ver cuál es el error.

Reproduzco el código introduciéndole preguntas como comentarios.

[code linenumbers=false syntax=gambas]

'¿Desde dónde se llama este procedimiento? ¿Es el evento Click de una opción de menú?

PUBLIC SUB Abrir_editor_Click()

DIM arrCad AS NEW String[]
DIM txtTemp AS TextArea
DIM c, ruta AS String

  Dialog.Title = "Seleccione un archivo"
  Dialog.Filter = ["*.cfg", "Ficheros de Configuracion"]

 IF Dialog.OpenFile() THEN

   'Si asumes que el usuario no seleccionó nada intencionalmente, entonces este mensaje no tiene sentido

   Message.Info("No ha seleccionado nada")
 ELSE

   'Las 2 líneas que siguen no parecen tener sentido
   ruta = Dialog.Path
   arrCad = Split(File.Load(ruta), "\n")

   txtTemp = Editor.Children[0]
 END IF
 
 'Hasta aquí el usuario abrió el cuadro de diálogo "Abrir archivo" y pudo:
 ' * haber elegido un archivo
 ' * haber elegido varios archivos (para evitarlo se debe llamar así: Dialog.OpenFile(False) ). No estás manejando esta posibilidad.
 ' * haber cancelado el cuadro. No estás manejando correctamente esta posibilidad. Si el usuario cancela el cuadro la función debería terminar.
 ' ¿Cómo es que decides crear una nueva pestaña en función de si txtTemp.Text es una cadena nula?
 IF txtTemp.Text <> "" THEN
   nuevaHoja()
 END IF

'Las sentencias a continuación parecen ser innecesarias
FOR EACH c IN arrCad
  Editor.Text = ruta
  txtTemp = Editor.Children[0]
  txtTemp.Text &= c & "\n"
NEXT
[/code]

Bueno, Pablo. El problema más importante que veo aquí es que estás diseñando mal.

Supongamos que:

[b]1) El usuario hace clic en la opción de menú: Archivo > Nuevo[/b]

[b][i]¿Qué debería hacer tu programa?[/i][/b]

1.a- Añadir una pestaña

1.b- Crear un nuevo control (supongo que estás usando TextArea), que tenga como contenedor (parent) a la pestaña recién creada.

[b]2) Supongamos ahora que el usuario hace clic en la opción de menú: Archivo > Abrir[/b]

[b][i]¿Qué debería hacer tu programa?[/i][/b]

2.a- Presentar el cuadro de diálogo Abrir archivo

2.b.1- El usuario pulsa el botón Cancelar, no hay que hacer nada, absolutamente nada (es decir, la rutina que lanzó el cuadro de diálogo Abrir archivo debe terminar, sin hacer nada más).

2.b.2.a- El usuario eligió un archivo hay que realizar los puntos 1.a y 1.b, para luego asignarle al nuevo control TextArea el contenido del archivo.

2.b.2.b- El usuario eligió varios archivos por lo tanto hay que realizar los pasos del punto 2.b.2.a tantas veces como archivos haya seleccionado el usuario.



La descripción anterior es básicamente lo que se conoce como "caso de uso" y si la sigues (corrígela si falta o sobra algo) producirás un diseño mucho mejor de las funciones o procedimientos y te librarás de repetir código inútilmente.

Observa que en el c.d.u. anterior se observa que las acciones 1.a y 1.b deben formar parte de una rutina (ya que se repiten en 2.b.2).

La acción 2.b.1 te indica que hay un error de lógica en tu código actual.

La acción 2.b.2.a te indica que debe haber una llamada a la rutina creada para las acciones 1.a y 1.b

La acción 2.b.2.b te indica que tanto 2.b.2.a como 2.b.2.b son casos particulares de un mismo curso de acción que sigue el usuario y como ambas tienen como resultado la elección de uno o más archivos deberán ser procesadas por una misma rutina.

Para completar esta información deberías estudiar un poco más [url=http://gambasdoc.org/help/comp/gb.qt/dialog/openfile]cómo funciona la clase Dialog

Saludos cordiales.


