¿Cómo crear varios TextEditor de forma dinámica? - Grandamakulo - 28-07-2023
Hola a todos:
Tengo un formulario en el que he incrustado el IconPanel «iconpAyuda». Pretendo leer varios archivos «html» de un directorio y que cargue cada uno en una nueva «Tab» en la que creo un TextEditor para poder incorporar el «RichtText» de cada ayuda. Antes lo hacía con un «ListView», un solo editor y una matriz de cadenas, pero me gustaría poder cambiarlo a la idea que explico.
El problema que tengo es que no sé cómo crear los TextEditor de manera dinámica. ¿Podéis ayudarme? Gracias de antemano.
El código que uso es éste:
Código: Public Sub _new()
Dim sArchivos As String[] ' Archivos de ayuda en formato html
Dim sArchivo As String ' Nombre archivo en tratamiento
Dim sPaso As String ' Para traspasar y operar cadena
Dim rTitulo As New RegExp ' RegExp para extraer el valor del título
Dim i As Integer ' Contador
Dim txeAyuda As New TextEdit[] ' TextEditor para mostrar la ayuda en RichText
' Título: se supone que este formulario va en una aplicación mayor
Me.Text = ("Ayuda") & " " & Application.Name & " " & Application.Version
sArchivos = Dir(Application.Path &/ "Ayuda").Sort()
i = 0
For Each sArchivo In sArchivos
sPaso = File.Load(Application.Path &/ "Ayuda" &/ sArchivo) ' Lista de archivos
rTitulo.Compile("<title[^>]*>(.*)</title>") ' Extraer título con RexEx
rTitulo.Exec(sPaso)
icopAyuda.Count = i + 1 ' Por cada archivo se añada una «Tab»
If rTitulo.Count > 0 Then
icopAyuda[i].Text = Util.HTMLaTexto(rTitulo[0].Text) ' Si existe título, se nombra la «Tab»
Else
icopAyuda[i].Text = ("Anónimo") ' Si no, ya veré qué poner...
Endif
txeAyuda.Add("Qué narices pongo aquí") '' ¿Qué narices pongo aquí? Tiene que ir un txe, pero es el
txeAyuda[i].Reparent(icopAyuda[i]) '' que estoy creando justo ahora...
txeAyuda[i].Expand = True
txeAyuda[i].RichText = sPaso
i = i + 1
Next
End
RE: ¿Cómo crear varios TextEditor de forma dinámica? - Shordi - 28-07-2023
Buff... no comprendo muy bien lo que quieres hacer, pero te apunto otra vía más sencilla:
creas un formulario con tu texteditor y todo lo que quieras y lo llamas (para el ejemplo FormEditador). Luego:
Código: dim f as formEditador
sArchivos = Dir(Application.Path &/ "Ayuda").Sort()
icopAyuda.Count=sArchivos.count ' Por cada archivo se añada una «Tab»
For i=0 to sArchivos.max
sPaso = File.Load(Application.Path &/ "Ayuda" &/ sArchivos) ' Lista de archivos
'Estas dos líneas de abajo las cambias al evento open del formulario f, que creamos a continuación
' rTitulo.Compile("<title[^>]*>(.*)</title>") ' Extraer título con RexEx
' rTitulo.Exec(sPaso)
f=new formEditador(icopAyuda[i) 'o como sea que se referencie la nueva tab.
f.Tag=sPaso 'en el tag le pasamos el archivo
f.visible=True
Next
El icoAyuda debera tener arrangement a Fill para que el formEditador llene la pestaña por completo y cada formEditador creado dispone del archivo en su propiedad Tag, y todo proceso lo haces dentro de él (evento open, sobre todo)
Así toda manipulación visual y todo tejemaneje sobre el archivo está aislada dentro del formEditador.
Es como yo lo haría.
Saludos
RE: ¿Cómo crear varios TextEditor de forma dinámica? - Grandamakulo - 28-07-2023
Solucionado gracias a Curso de Gambas
Código: ' Gambas class file
Public Sub _new()
Dim sArchivos As String[] ' Archivos de ayuda en formato html
Dim sPaso As String ' Para traspasar y operar cadena
Dim rTitulo As New RegExp ' RegExp para extraer el valor del título
Dim i As Integer ' Contador
Dim txeAyuda As New TextEdit[] ' TextEditor para mostrar la ayuda en RichText
' Título: se supone que este formulario va en una aplicación mayor
Me.Text = ("Ayuda") & " " & Application.Name & " " & Application.Version
sArchivos = Dir(Application.Path &/ "Ayuda", "*.HTML").Sort()
icopAyuda.Count = sArchivos.Count
i = 0
For i = 0 To sArchivos.Max
sPaso = File.Load(Application.Path &/ "Ayuda" &/ sArchivos[i])
rTitulo.Compile("<title[^>]*>(.*)</title>") ' Extraer título con RexEx
rTitulo.Exec(sPaso)
If rTitulo.Count > 0 Then
icopAyuda[i].Text = Util.HTMLaTexto(rTitulo[0].Text) ' Si existe título, se nombra la «Tab»
Else
icopAyuda[i].Text = ("Anónimo") ' Si no, ya veré qué poner...
Endif
Dim txeTemporal As New TextEdit(icopAyuda[i]) As ("Temporal")
txeAyuda.Add(txeTemporal)
txeAyuda[i].Expand = True
txeAyuda[i].RichText = sPaso
txeAyuda[i].ReadOnly = True
Next
End
@Shordi, he incorporado tu simplificación. No sé cómo lo ves ahora...
RE: ¿Cómo crear varios TextEditor de forma dinámica? - Shordi - 28-07-2023
Cita:@Shordi, he incorporado tu simplificación.
¿Dónde?, no lo veo...
RE: ¿Cómo crear varios TextEditor de forma dinámica? - Grandamakulo - 29-07-2023
Perdona, lo probé y más o menos funcionó, pero me obligaba a tener varias funciones ad latere y más código. Al final, dejé este último que me funciona, es todo el código de este formulario y, sin ser tan elegante, me parece menos lioso —es que soy muy cortico, jajaja—.
Vamos, que cambié el código en el mensaje, pero no el resto del mensaje... 
En cualquier caso, muchas gracias, tus enseñanzas no caen en saco roto —sí en cerebro agujereado, , pero eso es otra historia—.
|