https://foro.gambas-es.org/viewtopic.php?f=1&t=368
-----------------------------------
Pablo-GNU
Viernes, 22 Enero 2010, 17:54

Problema Con La Fabricacion De Un Editor De Texto... (Solucionado, Cambio De Diseño)
-----------------------------------
Buenas tardes, estoy intentando hacer una aplicacion para la generacion de Compact Flash como HDD, pero necesito añadir un modulo para editar ciertos ficheros de configuracion con extension .cfg

Consigo cargar los ficheros pero no veo el archivo entero en si...

PUBLIC SUB Abrir_editor_Click()

DIM arrCad AS NEW String[]
DIM txtTemp AS TextArea
DIM c AS String
DIM ruta AS String
Dialog.Title = "Seleccione un archivo"
Dialog.Filter = ["*.cfg", "Ficheros de Configuracion"]
IF Dialog.OpenFile() THEN
Message.Info("No ha seleccionado nada")
ELSE 
ruta = Dialog.Path
arrCad = Split(File.Load(ruta), "\n")
txtTemp = Editor.Children[0]
END IF
IF txtTemp.Text <> "" THEN 
nuevaHoja()
END IF
FOR EACH c IN arrCad
Editor.Text = ruta
txtTemp = Editor.Children[0]
txtTemp.Text &= c & "\n"
NEXT

END

Con este codigo consigo cargarlo, pero lo dicho, no veo el fichero entero... solo veo una parte...

#####################################################
#
CO CN=O61PCINC TA=DIF001 NE=14 NU=1 MO=1 EN=H IM=40 LI=0 LR=251 MI=0 MR=50.2 VR=999999999 UI=lm2  DE="PRECIP. CM EN VALIRA EN SEO DE URGEL"
#
#####################################################
#    --> Definicion VARIABLES CALCULADAS
#####################################################
#
CO AI=O65QRIO1 TA=AILOG1 NE=2 NU=0 MO=1 NS=1000 EN=N CV=NULO FI=0 VA=A HH=23 HI=80 LO=20 LL=10 HU=0.0 HD=0.0 GP=0.0 GN=0.0 HG=0.0 UI=m3S DE="Q. RIO VALIRA EN SEO DE URGEL"
#


Esas lineas son las que veo, pero el fichero contiene 144 lineas a mostrar...

El error que veo en el IDE es el siguiente...

(Texto:3682): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed

lo veo muchas veces...

Como puedo conseguir verlas todas? No le encuentro el fallo la verdad...

Por cierto, para luego guardar los cambios si lo modifico? como deberia de hacerlo? Desde ya muchas gracias...


-----------------------------------
soplo
Viernes, 22 Enero 2010, 20:31

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
Vamos a ver

[code linenumbers=false syntax=gambas]PUBLIC SUB Abrir_editor_Click()

DIM arrCad AS NEW String[]
DIM txtTemp AS TextArea
DIM c AS String
DIM ruta AS String
Dialog.Title = "Seleccione un archivo"
Dialog.Filter = ["*.cfg", "Ficheros de Configuracion"]
IF Dialog.OpenFile() THEN
   Message.Info("No ha seleccionado nada")
ELSE
   ruta = Dialog.Path
   arrCad = Split(File.Load(ruta), "\n") 'aquí tienes cada línea de ese archivo
   txtTemp = Editor.Children[0] 'esto no se que es
END IF
IF txtTemp.Text <> "" THEN
   nuevaHoja() 'esto tampoco se que es
END IF
FOR EACH c IN arrCad 
   Editor.Text = ruta
   txtTemp = Editor.Children[0] 'no lo entiendo
   txtTemp.Text &= c & "\n" 'aquí vas metiendo línea a línea todo lo que separaste antes con el \n y poniéndolo de  nuevo
NEXT[/code]

Falta información para saber lo que te ocurre.

En vez de hacer esto
[code linenumbers=false syntax=gambas]arrCad = Split(File.Load(ruta), "\n") 'aquí tienes cada línea de ese archivo[/code]
con lo que dejas cada línea sin \n en cada elemento del array
y luego hacer un bucle para recorrer ese array y en cada línea deshacer lo anterior
[code linenumbers=false syntax=gambas]txtTemp.Text &= c & "\n"[/code]
¿No sería mejor meterlo ya directamente?
[code linenumbers=false syntax=gambas]txttemp.text=file.load(ruta)[/code]
Esto no te resuelve nada. Solo lo simplifica

¿Podrías especificar para qué quieres txttemp si en realidad tu quieres tu archivo en un editor?

De hecho se me ocurren bastantes soluciones mas sencillas como por ejemplo un textedit
[code linenumbers=false syntax=gambas]textedit.text=file.load(ruta)[/code]
Y ya tienes todo tu texto allí y solo necesitas los métodos de textedit para hacer lo que quieras hacer. Entiendo que con el Editor te vale igual (si le haces una sintaxis incluso mejor) pero no sé usarlo.

Vamos que me da la impresión que te haces un lío aunque no estoy seguro de haber entendido bien tu código
 :mryellow: 
 :mryellow:


-----------------------------------
Pablo-GNU
Viernes, 22 Enero 2010, 21:17

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
Te contesto a lo que me has dicho, he probado lo de simplificar codigo, y no me muestra absolutamente nada, cuando de la otra manera si que lo hace...

[code linenumbers=false syntax=gambas]
txtTemp = Editor.Children[0] 'esto no se que es[/code]

En txtTemp lo que haces es pasarle todas las propiedades del Editor, el Editor es el nombre que tiene un grupo de Pestañas...

[code linenumbers=false syntax=gambas]   nuevaHoja() 'esto tampoco se que es[/code]

nuevaHoja() es una funcion, se encarga de que si yo abro mas archivos, vaya creando distintas pestañas, justamente por eso lo compruebo en esta seccion de codigo:

[code linenumbers=false syntax=gambas]IF txtTemp.Text <> "" THEN
  nuevaHoja() 'esto tampoco se que es[/code]

Te incluyo la funcion de nuevaHoja para que la veas


[code linenumbers=false syntax=gambas]PUBLIC SUB nuevaHoja()

DIM cfgEditAux AS TextArea
DIM conTabs AS Float

Editor.Count += 1
conTabs += 1
Editor.Index = conTabs
cfgEditAux = NEW TextArea(Editor)
cfgEditAux.X = cfgEdit.X
cfgEditAux.Y = cfgEdit.Y
cfgEditAux.Height = cfgEdit.Height
cfgEditAux.Width = cfgEdit.Width
cfgEditAux.Visible = TRUE

END[/code]


El textedit.text que me dices no lo he encontrador. no se como incluirlo, soy un poco nuevo en esto de gambas y estoy aprendiendo leyendo y a golpe de corazon, pero vamos, que aprendo... tenme paciencia please :D. Te lo agradezco de verdad...


-----------------------------------
soplo
Viernes, 22 Enero 2010, 22:34

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
ah entonces el editor no es un control editor sino un tabstrip.

[quote]El textedit.text que me dices no lo he encontrador[/quote]
Ahora estoy en windows y no puedo verlo para decírtelo con seguridad pero creo que está incluído en gb.qt osea que te vas a las propiedades del foro - componentes y lo marcas.

De todas formas para probar intenta usar un textarea
[code linenumbers=false syntax=gambas]textarea.text=file.load(ruta)[/code]

Con el textedit lo harás mejor y con el editor aún mejor pero para probar te vale.

Sigo sin entender lo que quieres hacer porque para editar un texto no hay necesidad alguna de grupos de pestañas ni tabstrip ni nada pero bueno tu prueba eso que te digo y yo creo que acabamos antes

Un saludo
 :mryellow:


-----------------------------------
Pablo-GNU
Viernes, 22 Enero 2010, 23:01

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
Ya le he pillado el truco, justo entraba para contestarte y darte las gracias, he activado los gb.qt y gb.qt.ext y he usado el Editor, pero me he dado cuenta de que el fallo que tengo ahora es que los acentos no los saca bien, he usado el editor y no el textedit, porque he leido que el editor acepta texto plano y el textedit es para texto enriquezido, te adjunto unas imagenes para que veas porque uso las tabString y asi de paso me ayudas si puedes a ver porque tengo el siguiente problema...

En esta veras el problema de los acentos...
[img]http://img638.imageshack.us/i/pantallazotextov.png/[/img]

El siguiente problema es curioso, si abro un archivo va bien, si abro otro, me crea otra pestaña y sin problemas, pero al añadir mas, lo unico que hace es crear una pestaña en blanco con el nombre Tab2, me cierra el ultimo archivo abriendo el siguiente encima pero tampoco me muestra el contenido..

[img]http://img714.imageshack.us/i/pantallazotexto1.png/[/img]

Tambien te adjunto el codigo a ver si con eso lo podemos sacar, voy a seguir mirando a ver que veo...

[code linenumbers=false syntax=gambas]PUBLIC SUB Abrir_editor_Click()

DIM arrCad AS NEW String[]
DIM txtTemp AS Editor
DIM c AS String
DIM ruta AS String
Dialog.Title = "Seleccione un archivo"
Dialog.Filter = ["*.cfg", "Ficheros de Configuracion"]
IF Dialog.OpenFile() THEN
Message.Info("No ha seleccionado nada")
ELSE 
ruta = Dialog.Path
arrCad = Split(File.Load(ruta), "\n")
txtTemp = Editor_tab.Children[0]
END IF
IF txtTemp.Text <> "" THEN 
nuevaHoja()
END IF
Editor_tab.Text = ruta
txtTemp = Editor_tab.Children[0]
FOR EACH c IN arrCad
Editor_tab.Text = ruta
txtTemp = Editor_tab.Children[0]
txtTemp.Text &= c & "\n"
NEXT

END


PUBLIC SUB nuevaHoja()

DIM cfgEditAux AS Editor
DIM conTabs AS Float

Editor_tab.Count += 1
conTabs += 1
Editor_tab.Index = conTabs
cfgEditAux = NEW Editor(Editor_tab)
cfgEditAux.X = cfgEdit.X
cfgEditAux.Y = cfgEdit.Y
cfgEditAux.Height = cfgEdit.Height
cfgEditAux.Width = cfgEdit.Width
cfgEditAux.Visible = TRUE

END[/code]


-----------------------------------
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.


-----------------------------------
Pablo-GNU
Viernes, 22 Enero 2010, 23:53

Re: Problema Con La Fabricacion De Un Editor De Texto...
-----------------------------------
Fabian, ante todo gracias por tu respuesta, me acababa de hacer una lista en papel de todas las opciones posibles y me he dado cuenta de que lo estaba haciendo tan complejo (lo digo porque en realidad no hacia falta) que estaba cometiendo demasiados errores, he anulado ambas cosas, ya que he planteado editar ficheros de uno en uno para no complicar demasiado al usuario, asi que las cosas han cambiado, te voy a subir una imagen para que lo veas, de todos modos antes de cambiarlo lo he probado y si que es verdad que funciona su simplificacion, por ello quiero pedirle disculpas, si que es cierta... sigo con el problema de los acentos.

[img]http://img705.imageshack.us/img705/8896/pantallazotexto.png[/img]


Como puedo hacer que nos muestre el acento?

EDIT:

Bueno, tengo ya el editor casi acabado, solo me queda hacer que muestre bien los caracteres, he estado leyendo sobre la funcion Dconv y Sconv pero no se como hacerlo, la verdad que se me escapa un poco... de momento el codigo lo tengo implementado asi...

[code linenumbers=false syntax=gambas]PUBLIC SUB Abrir_editor_Click()

Editor_body.Enabled = TRUE
Editor_body.Text = File.Load(Selector.SelectedPath)

END

PUBLIC SUB Guardar_editor_Click()

File.Save(Selector.SelectedPath, Editor_body.Text)
Editor_body.Text = ""
Editor_body.Enabled = FALSE

END[/code]

[img]http://img46.imageshack.us/img46/2899/pantallazotexto2.png[/img]


