<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[Comunidad Gambas-es - Programación en otros lenguajes]]></title>
		<link>https://gambas-es.org/</link>
		<description><![CDATA[Comunidad Gambas-es - https://gambas-es.org]]></description>
		<pubDate>Thu, 30 Apr 2026 01:28:54 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Ordenando las carpetas]]></title>
			<link>https://gambas-es.org/thread-1992.html</link>
			<pubDate>Wed, 22 Oct 2025 13:57:17 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=19">tercoide</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1992.html</guid>
			<description><![CDATA[Estoy en la movida de tarducir GambasCAD y estru3D de Gb a C# a efectos de hacerlos multiplataforma. La carga de trabajo grande la hace un programin que hice traductor (aunque hay sitios que tambien pueden traducir codigo) y el resto lo esta haciendo la IA de Copilot (me suscribi por usd10/mes , el costo de 2 vinos que he dejado de tomar). Casi no escribo codigo, todo es Vibe Coding (googlear!).<br />
<br />
Pero quiero ordenar bien las carpetas para que no me ocurran lo que me esta pasando que es tener el codigo desordenado como dormitorio de adolescente. Escucho sugerencias:<br />
<br />
/Core: aqui van las clases y modulos que no son la User Interface, ni operaciones que dependan de la plataforma (Win, Linux, OSX)<br />
/UI: la main form y demas formularios que hacen a la interzas con el usuario<br />
/Cross: modulos de comunicacion con el entorno<br />
/Data: imagenes, librerias de datos<br />
<br />
De momento uso el toolkit GTK4.]]></description>
			<content:encoded><![CDATA[Estoy en la movida de tarducir GambasCAD y estru3D de Gb a C# a efectos de hacerlos multiplataforma. La carga de trabajo grande la hace un programin que hice traductor (aunque hay sitios que tambien pueden traducir codigo) y el resto lo esta haciendo la IA de Copilot (me suscribi por usd10/mes , el costo de 2 vinos que he dejado de tomar). Casi no escribo codigo, todo es Vibe Coding (googlear!).<br />
<br />
Pero quiero ordenar bien las carpetas para que no me ocurran lo que me esta pasando que es tener el codigo desordenado como dormitorio de adolescente. Escucho sugerencias:<br />
<br />
/Core: aqui van las clases y modulos que no son la User Interface, ni operaciones que dependan de la plataforma (Win, Linux, OSX)<br />
/UI: la main form y demas formularios que hacen a la interzas con el usuario<br />
/Cross: modulos de comunicacion con el entorno<br />
/Data: imagenes, librerias de datos<br />
<br />
De momento uso el toolkit GTK4.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[¿ Qué os parece desarrollar para Android ?]]></title>
			<link>https://gambas-es.org/thread-1964.html</link>
			<pubDate>Fri, 23 May 2025 09:36:26 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1964.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
¿ Qué os parece desarrollar aplicaciones para móviles ?. <br />
Pequeños juegos por ejemplo.<br />
<br />
¿ Alguien se ha dedicado o lo ha conocido ?. <br />
<br />
¿ Qué opinión os merece  Play Store ?.  <img src="https://gambas-es.org/images/smilies/rolleyes.png" alt="Rolleyes" title="Rolleyes" class="smilie smilie_6" /> <br />
( Gratis no va a ser..) <img src="https://gambas-es.org/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
¿ Qué os parece desarrollar aplicaciones para móviles ?. <br />
Pequeños juegos por ejemplo.<br />
<br />
¿ Alguien se ha dedicado o lo ha conocido ?. <br />
<br />
¿ Qué opinión os merece  Play Store ?.  <img src="https://gambas-es.org/images/smilies/rolleyes.png" alt="Rolleyes" title="Rolleyes" class="smilie smilie_6" /> <br />
( Gratis no va a ser..) <img src="https://gambas-es.org/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /> <br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Traductor de Gambas a Vala]]></title>
			<link>https://gambas-es.org/thread-1435.html</link>
			<pubDate>Wed, 05 Jul 2023 20:10:26 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=19">tercoide</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1435.html</guid>
			<description><![CDATA[Comencé un traductor, en realidad solo la UI que no tiene gran complejidad. Aquí esta:<br />
<br />
<a href="https://github.com/tercoide/valaconverter" target="_blank" rel="noopener" class="mycode_url">https://github.com/tercoide/valaconverter</a><br />
<br />
Quisiera saber si hay algún interesado en colaborar con este proyecto. Aclaro que aun no he estudiado Vala y lo iré haciendo a medida que codifique el traductor. Ese lenguaje es parecido a C#. Hay cosas que deberá traducirse a mano, como ser la interacción con los componentes.]]></description>
			<content:encoded><![CDATA[Comencé un traductor, en realidad solo la UI que no tiene gran complejidad. Aquí esta:<br />
<br />
<a href="https://github.com/tercoide/valaconverter" target="_blank" rel="noopener" class="mycode_url">https://github.com/tercoide/valaconverter</a><br />
<br />
Quisiera saber si hay algún interesado en colaborar con este proyecto. Aclaro que aun no he estudiado Vala y lo iré haciendo a medida que codifique el traductor. Ese lenguaje es parecido a C#. Hay cosas que deberá traducirse a mano, como ser la interacción con los componentes.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Vala !]]></title>
			<link>https://gambas-es.org/thread-1429.html</link>
			<pubDate>Thu, 29 Jun 2023 12:03:00 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=19">tercoide</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1429.html</guid>
			<description><![CDATA[Siguiendo con mi búsqueda de un lenguaje que cumpla las siguientes consignas:<br />
<br />
-OpenSource<br />
-GPL3<br />
-Orientado a objetos<br />
-Compilado a código rápido<br />
-Multiplataforma<br />
-Con una IDE decente para programar<br />
-Parecido a Gambas<br />
-Con una comunidad activa<br />
<br />
y habiendo descartado a al resto, di con Vala que cumple con todas esas características. Tal vez la única (gran) contra es que esta atado a Glib, la librería base de Gnome.<br />
<br />
Armar el sistema de trabajo para empezar a escribir código es la parte que Gb nos resuelve de entrada con la IDE y es lo que frena a muchos puesto que se requiere un gran conocimiento de cosas que no manejamos habitualmente, pero Gnome nos soluciono la existencia con Builder, que usando en conjunto a Glade y Meson , nos arma un entorno de desarrollo en un par de clicks.<br />
<br />
Dejo un link para los interesados:<br />
<br />
<a href="https://wiki.gnome.org/Apps/Builder/Downloads" target="_blank" rel="noopener" class="mycode_url">https://wiki.gnome.org/Apps/Builder/Downloads</a><br />
<br />
y un ejemplo de uso:<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/2XT8wfIwjWg" frameborder="0" allowfullscreen="true"></iframe>]]></description>
			<content:encoded><![CDATA[Siguiendo con mi búsqueda de un lenguaje que cumpla las siguientes consignas:<br />
<br />
-OpenSource<br />
-GPL3<br />
-Orientado a objetos<br />
-Compilado a código rápido<br />
-Multiplataforma<br />
-Con una IDE decente para programar<br />
-Parecido a Gambas<br />
-Con una comunidad activa<br />
<br />
y habiendo descartado a al resto, di con Vala que cumple con todas esas características. Tal vez la única (gran) contra es que esta atado a Glib, la librería base de Gnome.<br />
<br />
Armar el sistema de trabajo para empezar a escribir código es la parte que Gb nos resuelve de entrada con la IDE y es lo que frena a muchos puesto que se requiere un gran conocimiento de cosas que no manejamos habitualmente, pero Gnome nos soluciono la existencia con Builder, que usando en conjunto a Glade y Meson , nos arma un entorno de desarrollo en un par de clicks.<br />
<br />
Dejo un link para los interesados:<br />
<br />
<a href="https://wiki.gnome.org/Apps/Builder/Downloads" target="_blank" rel="noopener" class="mycode_url">https://wiki.gnome.org/Apps/Builder/Downloads</a><br />
<br />
y un ejemplo de uso:<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/2XT8wfIwjWg" frameborder="0" allowfullscreen="true"></iframe>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Como se hace en gambas para ...]]></title>
			<link>https://gambas-es.org/thread-1401.html</link>
			<pubDate>Thu, 15 Jun 2023 09:32:49 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=12">tincho</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1401.html</guid>
			<description><![CDATA[Hola amigos.<br />
Estoy repasando el lenguaje Gambas para compararlo con otros lenguajes y hay cosas que no recuerdo o no se, así que iré preguntando por aquí lo que vaya surgiendo <br />
<br />
Como saben "Print" imprime escribe en la terminal una cadena de texto mas un salto de linea pero...<br />
[Pendiente] ¿Como se hace para imprimir por la consola pero sin el salto de línea?<br />
[Pendiente] ¿Como se hace para imprimir por la consola pero sustituyendo el texto anterior?<br />
<br />
<br />
[Pendiente] ¿Cual es la forma optima de ingresar una orden por terminal a un programa?<br />
Estoy usando esto:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Function Command() As String<br />
<br />
  Dim str As String<br />
<br />
  Line Input #File.In, str<br />
  Return str<br />
<br />
End</code></div></div>]]></description>
			<content:encoded><![CDATA[Hola amigos.<br />
Estoy repasando el lenguaje Gambas para compararlo con otros lenguajes y hay cosas que no recuerdo o no se, así que iré preguntando por aquí lo que vaya surgiendo <br />
<br />
Como saben "Print" imprime escribe en la terminal una cadena de texto mas un salto de linea pero...<br />
[Pendiente] ¿Como se hace para imprimir por la consola pero sin el salto de línea?<br />
[Pendiente] ¿Como se hace para imprimir por la consola pero sustituyendo el texto anterior?<br />
<br />
<br />
[Pendiente] ¿Cual es la forma optima de ingresar una orden por terminal a un programa?<br />
Estoy usando esto:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Function Command() As String<br />
<br />
  Dim str As String<br />
<br />
  Line Input #File.In, str<br />
  Return str<br />
<br />
End</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Faltaria Go]]></title>
			<link>https://gambas-es.org/thread-1400.html</link>
			<pubDate>Thu, 15 Jun 2023 09:22:09 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=12">tincho</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1400.html</guid>
			<description><![CDATA[Jesús por favor cuando puedas podrías agregar Go a la lista de otros lenguajes de programación.<br />
Gracias.]]></description>
			<content:encoded><![CDATA[Jesús por favor cuando puedas podrías agregar Go a la lista de otros lenguajes de programación.<br />
Gracias.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Secuencias de escape ANSI]]></title>
			<link>https://gambas-es.org/thread-1323.html</link>
			<pubDate>Sun, 09 Apr 2023 08:42:15 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1323.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
En un libro de Java el primer ejemplo fue como mostrar por la consola un texto en color.<br />
Para ello usa secuencias de escape ANSI ( a ver si lo dije bien ).<br />
<br />
En el primer ejemplo "sencillo" en Java<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>public class ColoreadoDeTexto {<br />
<br />
    public static void main(String[] args) {<br />
        System.out.println("&#92;033[33m mandarina");<br />
        System.out.println("&#92;033[32m hierba");<br />
        System.out.println("&#92;033[31m tomate");<br />
        System.out.println("&#92;033[37m sábanas");<br />
        System.out.println("&#92;033[36m cielo");<br />
        System.out.println("&#92;033[35m nazareno");<br />
        System.out.println("&#92;033[34m mar");<br />
    }<br />
}</code></div></div><br />
Lo primero que usa es el código \033 que es "Esc", lo gracioso de este, que ahora me he dado cuenta es que está en "octal"<br />
cuando pensaba que estaba en hexadecimal.<br />
<br />
Así que me animé a hacer otro ejemplo en Gambas. Lo cierto es que se pueden hacer muchas combinaciones.<br />
En el caso de Gambas he usado hexadecimal.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Sub Main()<br />
 <br />
  'Comenzamos con el código de escape ANSI &#92;x1b<br />
  'Podemos añadir<br />
  '[1; para activar negrita<br />
  '[0; para no activar negrita]<br />
  '3 para poner color del texto<br />
  '4 para poner color del fondo<br />
  '5 para que parpadeé  <br />
  '&#92;x1b[0m Para volver al estado inicial<br />
  '¿ Intensidad del color ? ¿ normal, claro ?<br />
 <br />
  '&#92;x1b[b;fg;bg m]<br />
 <br />
  'Añado al final &#92;x1b[0m para que el texto siguiente al mostrarlo no se muestre del mismo color<br />
 <br />
  Print "&#92;x1b[0;32m Texto en verde suave&#92;x1b[0m"<br />
  Print "&#92;x1b[1;42m Fondo de texto en verde sin brillo y negrita&#92;x1b[0m"<br />
  Print "&#92;x1b[5;34m Texto en azúl parpadeante&#92;x1b[0m"<br />
  Print "&#92;x1b[1;3m Texto"<br />
 <br />
  'Para volver al estado inicial<br />
  Print "&#92;x1b[0m"<br />
  Print "Letra sin colores de texto y sin fondo"<br />
 <br />
  Print "El valor hexa h1B corresponde con el valor decimal: " &amp; Int(&amp;h1b)<br />
  Print "El valor octal 033 corresponde con el valor decimal: " &amp; Int(&amp;o33)<br />
 <br />
End</code></div></div><br />
<br />
<img src="https://i.imgur.com/KdnkcAm.png" loading="lazy"  alt="[Imagen: KdnkcAm.png]" class="mycode_img" /><br />
<br />
Se pueden lograr más efectos lógicamente.<br />
Lo de presentar el valor h1B en decimal fue para comprobar a que valor se correspondía en decimal.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Ojo</span>:<br />
Si convertimos 033 que es un valor octal a decimal, no es un cero es una "o"<br />
<br />
<a href="http://gambaswiki.org/wiki/lang/type/integer" target="_blank" rel="noopener" class="mycode_url">Tipo entero en Gambas</a><br />
<br />
<a href="https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797" target="_blank" rel="noopener" class="mycode_url">Códigos de escape en ANSI</a><br />
<br />
En ese último enlace encontrareis el tema de los colores en: Colors / Graphics Mode<br />
Y naturalmente todo lo referente a secuencias de escape ANSI.<br />
<br />
Es una sentencia algo compleja que los programadores de "C" estarán muy acostumbrados a ver.<br />
 <br />
<hr class="mycode_hr" />
Añado otro enlace:<br />
<br />
<a href="https://es.wikipedia.org/wiki/C%C3%B3digo_escape_ANSI" target="_blank" rel="noopener" class="mycode_url">Código escape ANSI</a><br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
En un libro de Java el primer ejemplo fue como mostrar por la consola un texto en color.<br />
Para ello usa secuencias de escape ANSI ( a ver si lo dije bien ).<br />
<br />
En el primer ejemplo "sencillo" en Java<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>public class ColoreadoDeTexto {<br />
<br />
    public static void main(String[] args) {<br />
        System.out.println("&#92;033[33m mandarina");<br />
        System.out.println("&#92;033[32m hierba");<br />
        System.out.println("&#92;033[31m tomate");<br />
        System.out.println("&#92;033[37m sábanas");<br />
        System.out.println("&#92;033[36m cielo");<br />
        System.out.println("&#92;033[35m nazareno");<br />
        System.out.println("&#92;033[34m mar");<br />
    }<br />
}</code></div></div><br />
Lo primero que usa es el código \033 que es "Esc", lo gracioso de este, que ahora me he dado cuenta es que está en "octal"<br />
cuando pensaba que estaba en hexadecimal.<br />
<br />
Así que me animé a hacer otro ejemplo en Gambas. Lo cierto es que se pueden hacer muchas combinaciones.<br />
En el caso de Gambas he usado hexadecimal.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Sub Main()<br />
 <br />
  'Comenzamos con el código de escape ANSI &#92;x1b<br />
  'Podemos añadir<br />
  '[1; para activar negrita<br />
  '[0; para no activar negrita]<br />
  '3 para poner color del texto<br />
  '4 para poner color del fondo<br />
  '5 para que parpadeé  <br />
  '&#92;x1b[0m Para volver al estado inicial<br />
  '¿ Intensidad del color ? ¿ normal, claro ?<br />
 <br />
  '&#92;x1b[b;fg;bg m]<br />
 <br />
  'Añado al final &#92;x1b[0m para que el texto siguiente al mostrarlo no se muestre del mismo color<br />
 <br />
  Print "&#92;x1b[0;32m Texto en verde suave&#92;x1b[0m"<br />
  Print "&#92;x1b[1;42m Fondo de texto en verde sin brillo y negrita&#92;x1b[0m"<br />
  Print "&#92;x1b[5;34m Texto en azúl parpadeante&#92;x1b[0m"<br />
  Print "&#92;x1b[1;3m Texto"<br />
 <br />
  'Para volver al estado inicial<br />
  Print "&#92;x1b[0m"<br />
  Print "Letra sin colores de texto y sin fondo"<br />
 <br />
  Print "El valor hexa h1B corresponde con el valor decimal: " &amp; Int(&amp;h1b)<br />
  Print "El valor octal 033 corresponde con el valor decimal: " &amp; Int(&amp;o33)<br />
 <br />
End</code></div></div><br />
<br />
<img src="https://i.imgur.com/KdnkcAm.png" loading="lazy"  alt="[Imagen: KdnkcAm.png]" class="mycode_img" /><br />
<br />
Se pueden lograr más efectos lógicamente.<br />
Lo de presentar el valor h1B en decimal fue para comprobar a que valor se correspondía en decimal.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Ojo</span>:<br />
Si convertimos 033 que es un valor octal a decimal, no es un cero es una "o"<br />
<br />
<a href="http://gambaswiki.org/wiki/lang/type/integer" target="_blank" rel="noopener" class="mycode_url">Tipo entero en Gambas</a><br />
<br />
<a href="https://gist.github.com/fnky/458719343aabd01cfb17a3a4f7296797" target="_blank" rel="noopener" class="mycode_url">Códigos de escape en ANSI</a><br />
<br />
En ese último enlace encontrareis el tema de los colores en: Colors / Graphics Mode<br />
Y naturalmente todo lo referente a secuencias de escape ANSI.<br />
<br />
Es una sentencia algo compleja que los programadores de "C" estarán muy acostumbrados a ver.<br />
 <br />
<hr class="mycode_hr" />
Añado otro enlace:<br />
<br />
<a href="https://es.wikipedia.org/wiki/C%C3%B3digo_escape_ANSI" target="_blank" rel="noopener" class="mycode_url">Código escape ANSI</a><br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ey, Java!. :-D]]></title>
			<link>https://gambas-es.org/thread-1317.html</link>
			<pubDate>Mon, 03 Apr 2023 12:38:35 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1317.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
Está claro que al administrador no le gusta Java. No hay subforo.<br />
<br />
Es que tenía una pregunta. Espero que sencilla. A ver si encuentro usuarios de gambas<br />
que usen o les guste "un poco" Java.<br />
<br />
Mi intención "siempre" a la hora de aprender un lenguaje es la de llevar a Gambas una idea,<br />
mejorar la programación. Y sobre todo mejorar el aprendizaje de la programación orientada a<br />
objetos.<br />
<br />
"A modo sencillo". Si comparásemos un proyecto "básico" de Java con uno de Gambas.<br />
¿ Cuál pensáis que son las diferencias "principales" ?.<br />
<br />
Ayer estuve creando otro ejemplo en Java y creando uno similar en Gambas.<br />
<br />
Imaginar un proyecto de consola para Gambas.<br />
- Tenemos un Main como la rutina principal<br />
<br />
En Java también tenemos un main, solo que este main es "estático".<br />
Si recordamos bien, es un método común a todas las instancias que se cree de esta clase.<br />
<br />
Voy a poner el ejemplo que hice ayer hecho en Java. Se trata de "ir" insertando valores en un array,<br />
hasta que este está lleno de valores distintos a cero. Este array está desordenado.<br />
<br />
Parece que en Java todo son clases.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>package capitulo5tablas;<br />
<br />
import java.util.Arrays;<br />
<br />
public class InsertarEnTabla {<br />
<br />
    static int numElem;<br />
    static int[] t = new int[5];<br />
<br />
    public static void main(String[] args) {<br />
<br />
        InsercionNoOrdenada(12);<br />
        InsercionNoOrdenada(7);<br />
        InsercionNoOrdenada(45);<br />
        InsercionNoOrdenada(80);<br />
        InsercionNoOrdenada(4);<br />
        InsercionNoOrdenada(129); // No se puede realizar por tabla llena<br />
        InsertarEnTabla.InsercionNoOrdenada(56);<br />
<br />
    }<br />
<br />
    public static void InsercionNoOrdenada(int valor) {<br />
        // El orden no importa.<br />
        // Se inserta detrás del último elemento de la tabla<br />
        // mientras exista un hueco libre<br />
        if (numElem == t.length) {<br />
            System.out.println("La tabla está llena");<br />
        } else {<br />
            t[numElem] = valor;<br />
            System.out.println(Arrays.toString(t));<br />
            numElem++;<br />
        }<br />
    }<br />
}</code></div></div><br />
Fijaros, que tanto el main, como el método, como las variables publicas son "estáticas".<br />
Aparentemente todo lo que se llama desde el main, tiene que ser estático. Y logicamente<br />
las variables deben cumplir esa condición.<br />
<br />
En este ejemplo no se está creando instancias de una clase.<br />
Se podría haber hecho, pero en este ejemplo seria una "mala practica" hacer eso.<br />
<br />
En Gambas creé una clase de este ejemplo, pero no tiene mucho sentido, ya que la clase no es instanciable,<br />
no tiene constructor, se puede llevar parte del código a un módulo o a donde se encuentra el Main.<br />
<br />
Os muestro el código en Gambas. Hace lo mismo, pero no hay métodos "estáticos",<br />
ni variables de la misma condición.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Private numElem As Integer<br />
Private tarray As New Integer[5]<br />
<br />
Public Sub Main()<br />
 <br />
  InserccionNoOrdenada(12)<br />
  InserccionNoOrdenada(7)<br />
  InserccionNoOrdenada(45)<br />
  InserccionNoOrdenada(80)<br />
  InserccionNoOrdenada(4)<br />
  InserccionNoOrdenada(129) 'No se puede realizar por array lleno<br />
 <br />
End<br />
<br />
Public Sub InserccionNoOrdenada(valor As Integer)<br />
 <br />
  If numElem = tarray.Count Then<br />
    Print "El array está lleno"<br />
  Else         <br />
    tarray[numElem] = valor    <br />
    ACadena()   <br />
    Inc numElem<br />
  Endif<br />
 <br />
End<br />
<br />
Public Sub ACadena()<br />
 <br />
  Print "[ ";<br />
  For a As Integer = 0 To tarray.Max<br />
    Print tarray[a];<br />
    If a &lt; tarray.Max Then Print " , ";<br />
  Next<br />
  Print " ]"<br />
 <br />
End</code></div></div><br />
La salida de ambos ejemplo podrían ser como esta:<br />
 <br />
<blockquote class="mycode_quote"><cite>Cita:</cite>[ 12 , 0 , 0 , 0 , 0 ]<br />
[ 12 , 7 , 0 , 0 , 0 ]<br />
[ 12 , 7 , 45 , 0 , 0 ]<br />
[ 12 , 7 , 45 , 80 , 0 ]<br />
[ 12 , 7 , 45 , 80 , 4 ]<br />
El array está lleno</blockquote>
<br />
No digo que sea ni peor ni mejor. Debe ser cuestión de constumbres, que no me acostumbro a que el main de Java sea estático.<br />
Lógicamente desde este se pueden crear instancias de una clase, como podíamos hacer también en Gambas desde su Main.<br />
Eso de estático me choca un poco, cuando el ejemplo es "sencillo", no manejo clases. En Java si, es la clase InsertarTabla.<br />
<br />
A ver que me podéis comentar los que habéis conocido un poco Java.<br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
Está claro que al administrador no le gusta Java. No hay subforo.<br />
<br />
Es que tenía una pregunta. Espero que sencilla. A ver si encuentro usuarios de gambas<br />
que usen o les guste "un poco" Java.<br />
<br />
Mi intención "siempre" a la hora de aprender un lenguaje es la de llevar a Gambas una idea,<br />
mejorar la programación. Y sobre todo mejorar el aprendizaje de la programación orientada a<br />
objetos.<br />
<br />
"A modo sencillo". Si comparásemos un proyecto "básico" de Java con uno de Gambas.<br />
¿ Cuál pensáis que son las diferencias "principales" ?.<br />
<br />
Ayer estuve creando otro ejemplo en Java y creando uno similar en Gambas.<br />
<br />
Imaginar un proyecto de consola para Gambas.<br />
- Tenemos un Main como la rutina principal<br />
<br />
En Java también tenemos un main, solo que este main es "estático".<br />
Si recordamos bien, es un método común a todas las instancias que se cree de esta clase.<br />
<br />
Voy a poner el ejemplo que hice ayer hecho en Java. Se trata de "ir" insertando valores en un array,<br />
hasta que este está lleno de valores distintos a cero. Este array está desordenado.<br />
<br />
Parece que en Java todo son clases.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>package capitulo5tablas;<br />
<br />
import java.util.Arrays;<br />
<br />
public class InsertarEnTabla {<br />
<br />
    static int numElem;<br />
    static int[] t = new int[5];<br />
<br />
    public static void main(String[] args) {<br />
<br />
        InsercionNoOrdenada(12);<br />
        InsercionNoOrdenada(7);<br />
        InsercionNoOrdenada(45);<br />
        InsercionNoOrdenada(80);<br />
        InsercionNoOrdenada(4);<br />
        InsercionNoOrdenada(129); // No se puede realizar por tabla llena<br />
        InsertarEnTabla.InsercionNoOrdenada(56);<br />
<br />
    }<br />
<br />
    public static void InsercionNoOrdenada(int valor) {<br />
        // El orden no importa.<br />
        // Se inserta detrás del último elemento de la tabla<br />
        // mientras exista un hueco libre<br />
        if (numElem == t.length) {<br />
            System.out.println("La tabla está llena");<br />
        } else {<br />
            t[numElem] = valor;<br />
            System.out.println(Arrays.toString(t));<br />
            numElem++;<br />
        }<br />
    }<br />
}</code></div></div><br />
Fijaros, que tanto el main, como el método, como las variables publicas son "estáticas".<br />
Aparentemente todo lo que se llama desde el main, tiene que ser estático. Y logicamente<br />
las variables deben cumplir esa condición.<br />
<br />
En este ejemplo no se está creando instancias de una clase.<br />
Se podría haber hecho, pero en este ejemplo seria una "mala practica" hacer eso.<br />
<br />
En Gambas creé una clase de este ejemplo, pero no tiene mucho sentido, ya que la clase no es instanciable,<br />
no tiene constructor, se puede llevar parte del código a un módulo o a donde se encuentra el Main.<br />
<br />
Os muestro el código en Gambas. Hace lo mismo, pero no hay métodos "estáticos",<br />
ni variables de la misma condición.<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Private numElem As Integer<br />
Private tarray As New Integer[5]<br />
<br />
Public Sub Main()<br />
 <br />
  InserccionNoOrdenada(12)<br />
  InserccionNoOrdenada(7)<br />
  InserccionNoOrdenada(45)<br />
  InserccionNoOrdenada(80)<br />
  InserccionNoOrdenada(4)<br />
  InserccionNoOrdenada(129) 'No se puede realizar por array lleno<br />
 <br />
End<br />
<br />
Public Sub InserccionNoOrdenada(valor As Integer)<br />
 <br />
  If numElem = tarray.Count Then<br />
    Print "El array está lleno"<br />
  Else         <br />
    tarray[numElem] = valor    <br />
    ACadena()   <br />
    Inc numElem<br />
  Endif<br />
 <br />
End<br />
<br />
Public Sub ACadena()<br />
 <br />
  Print "[ ";<br />
  For a As Integer = 0 To tarray.Max<br />
    Print tarray[a];<br />
    If a &lt; tarray.Max Then Print " , ";<br />
  Next<br />
  Print " ]"<br />
 <br />
End</code></div></div><br />
La salida de ambos ejemplo podrían ser como esta:<br />
 <br />
<blockquote class="mycode_quote"><cite>Cita:</cite>[ 12 , 0 , 0 , 0 , 0 ]<br />
[ 12 , 7 , 0 , 0 , 0 ]<br />
[ 12 , 7 , 45 , 0 , 0 ]<br />
[ 12 , 7 , 45 , 80 , 0 ]<br />
[ 12 , 7 , 45 , 80 , 4 ]<br />
El array está lleno</blockquote>
<br />
No digo que sea ni peor ni mejor. Debe ser cuestión de constumbres, que no me acostumbro a que el main de Java sea estático.<br />
Lógicamente desde este se pueden crear instancias de una clase, como podíamos hacer también en Gambas desde su Main.<br />
Eso de estático me choca un poco, cuando el ejemplo es "sencillo", no manejo clases. En Java si, es la clase InsertarTabla.<br />
<br />
A ver que me podéis comentar los que habéis conocido un poco Java.<br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Curso de Lazarus desde cero]]></title>
			<link>https://gambas-es.org/thread-936.html</link>
			<pubDate>Wed, 29 Jun 2022 12:02:31 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-936.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
Os presento el vídeo de introducción del curso para aprender a programar con Lazarus.<br />
Lógicamente está hecho para personas que no saben programar, aunque eso no quiere<br />
decir que no pueda hacerlo alguien que ya sabe programar.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/fb4M4UePtNw" frameborder="0" allowfullscreen="true"></iframe><br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
Os presento el vídeo de introducción del curso para aprender a programar con Lazarus.<br />
Lógicamente está hecho para personas que no saben programar, aunque eso no quiere<br />
decir que no pueda hacerlo alguien que ya sabe programar.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/fb4M4UePtNw" frameborder="0" allowfullscreen="true"></iframe><br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Macro de dibujo de viñetas en plantilla de guion de cómic LibreOffice]]></title>
			<link>https://gambas-es.org/thread-712.html</link>
			<pubDate>Sun, 31 Oct 2021 11:39:10 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=62">Grandamakulo</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-712.html</guid>
			<description><![CDATA[<div style="text-align: justify;" class="mycode_align">A raíz de hacer una plantilla para redactar guiones de historietas que se adaptase a mi forma de trabajar, pensé que debía añadirle una herramienta que permitiese hacer un diagrama de viñetas sin necesidad de gastar la, más o menos, hora por cada 15-18 páginas.<br />
La cuestión planteada en  <a href="https://gambas-es.org/showthread.php?tid=645" target="_blank" rel="noopener" class="mycode_url">https://gambas-es.org/showthread.php?tid=645</a>  venía al caso para poder hacer un diagrama de viñetas que ayudase al dibujante «víctima» del guionista de turno. Esto es, el «escribidor» realiza un guion con la plantilla y ésta, de manera automática, fabrica un esquema de viñetas. Para tal propósito son necesaria dos cosas:</div>
<ol type="1" class="mycode_list"><li>Que las páginas y las viñetas estén formateadas con los párrafos correspondientes.<br />
</li>
<li>Que el texto de las viñetas indique el tamaño y posición según el método sugerido por Peio Soria.<br />
</li>
</ol>
<div style="text-align: justify;" class="mycode_align">Este método es muy simple. Como explico en <a href="https://www.faneo.es/forum/forum/guion-y-narrativa-43/topic/el-m%C3%A9todo-de-peio-soria-para-caracterizar-vi%C3%B1etas-894/?post=11068#11068" target="_blank" rel="noopener" class="mycode_url">https://www.faneo.es/forum/forum/guion-y...1068#11068</a>, En su manual <a href="https://www.dropbox.com/s/69nbax16an75g55/miguiondecomic_PeioSoria_pdf.pdf?dl=0" target="_blank" rel="noopener" class="mycode_url">«Mi guion de cómic»</a>, que está para bajar libremente en pdf desde su página, Peio Soria describe el que, para mí, es el método más lógico y sencillo. Se trata de emplear unas fracciones en vertical y en horizontal, de la manera 2/3Vx2/4H, por ejemplo. ¿Cómo se interpretaría? Fácil, 2/3V significa que se toma el segundo de los tres tercios posibles de la división vertical de la página, esto es, columnas. Además se toma el segundo de las cuatro posibles partes de división horizontal, filas, de la página. Superponiendo ambos, resulta la viñeta que queremos indicar.</div>
<a href="https://ibb.co/QHB1PY4" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/FYvj58F/Vi-etas-de-Peio.png" loading="lazy"  alt="[Imagen: Vi-etas-de-Peio.png]" class="mycode_img" /></a><br />
Para abarcar varias partes en el caso de alguna viñeta más irregular o una que ocupe toda unidad, se pueden emplear nomenclaturas especiales.<br />
Véase un ejemplo de cómo queda escrito:<br />
<a href="https://ibb.co/NxxzFbb" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/sjjrgzz/2021-10-31-12-15.png" loading="lazy"  alt="[Imagen: 2021-10-31-12-15.png]" class="mycode_img" /></a><br />
<br />
De esta manera, al ejecutar la macro, se obtiene:<br />
<a href="https://ibb.co/r5MF3yH" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/5svGkcL/Esquema-Vinetas.png" loading="lazy"  alt="[Imagen: Esquema-Vinetas.png]" class="mycode_img" /></a><br />
Documento que ya se puede enviar para que el dibujante pueda interpretar más fácilmente lo que dice el guionista y, después,... hacer lo que le venga en gana  <img src="https://gambas-es.org/images/smilies/tongue.png" alt="Tongue" title="Tongue" class="smilie smilie_5" /> .<br />
Además, la macro permite:<br />
<ol type="1" class="mycode_list"><li>Solapamiento de viñetas —como en la página 37 del ejemplo—.<br />
</li>
<li>Cambio INMEDIATO de formato de página —apaisado, vertical, A5, B5, cuadrado, <span style="font-style: italic;" class="mycode_i">fanzine</span>...— con sólo introducir un número.<br />
</li>
<li>Detecta errores en la nomenclatura e indica el lugar en el que se produce.<br />
</li>
<li>Se le ha añadido un apéndice de estadísticas que permite ver, aparte de las palabras y caracteres que ya indica el programa con «contar palabras», el número de páginas del cómic, el número bruto de viñetas y el número de bocadillos.<br />
</li>
</ol>
A esta macro, después de pelearme mucho, muchísimo, más todavía, con los mal documentados y dispersas especificaciones del UNO de Star BASIC —al menos así le pareció a éste, su humilde servidor—, logré terminarla en una versión más o menos útil:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>REM  *****  BASIC  *****<br />
<br />
' DIBUJAR ESQUEMAS PARA GUION DE HISTORIETAS Y ESTADÍSITCAS.<br />
'    SOFTWARE LIBRE<br />
'    --------------<br />
'    <br />
'    Grandamakulo, 2021<br />
'    grandamakulo@gmail.com<br />
'    <br />
'    * Puedes:<br />
'    Distribuirlo<br />
'    Modificarlo<br />
'    Regalarlo<br />
'    Si te place, acredítame<br />
'    <br />
'    * No puedes:<br />
'    Cobrar por él o por sus variaciones directas<br />
'    Si quieres hacerlo, ponte en contacto conmigo<br />
'    —Hay muchas fundaciones a las que ayudar—<br />
'    <br />
'    * Garantías:<br />
'    Estás de guasa, ¿no?<br />
'    Si se te funde la lavadora o se te hace un <br />
'    desconchón en la pared, soluciónalo tú.<br />
'    <br />
'    ESTE PROGRAMA CONSIDERA LAS TRES --O CUATRO--<br />
'    LEYES DE LA ROBÓTICA. Más o menos.<br />
<br />
<br />
Option Explicit<br />
Const Si As Boolean = True<br />
Const No As Boolean = False<br />
Const sC As String = """"<br />
Const sA As String = "'" <br />
<br />
Sub DibujaEsquema()<br />
    ' A partir de los datos del formato de página que introduce el usuario,<br />
    ' del número de páginas y de la información que el usuario ha establecido<br />
    ' en el tipo de párrafo viñeta, se dibuja en SVG —y se guarda en el mismo<br />
    ' directorio que el Documento— un ESQUEMA DE VIÑETAS.<br />
    <br />
    Dim oDoc As Object            'Documento actual<br />
    Dim oEnu As Object            'Partes del documento actual<br />
    Dim oTex As Object            'Un elemento texto de oEnu<br />
    Dim iPag As Integer            'Número de página<br />
    Dim iVin As Integer            'Número de viñeta en cada página<br />
    <br />
    Dim oSitio As Object<br />
    <br />
    Dim _iRel As Double            'Relación entre alto y ancho<br />
    Dim _iAnM As Double            'Ancho de marco = 210,0224103814 mm eq A4<br />
    Dim _iAlM As Double            'Alto del marco = _iAnt * _iRel<br />
    Dim _iCaM As Double            'Ancho de calle marco  = 5 mm<br />
    Dim _iCaP As Double            'Ancho de calle página = 5 mm<br />
    Dim _iCaV As Double            'Ancho de calle viñeta = 2 mm<br />
    Dim _iAnP As Double            'Ancho de página<br />
    Dim _iAlP As Double            'Alto de página<br />
    Dim _sCoM As String            'Color marco<br />
    Dim _sCoP As String            'Color página<br />
    Dim _sCoB As String            'Color borde viñeta<br />
    Dim _sCoV As String            'Color viñeta<br />
    Dim _iAnB As Double            'Ancho borde viñeta<br />
    Dim _sFuP As String            'Fuente página<br />
    Dim _iFTP As Integer        'Tamaño fuente página<br />
    Dim _sFuV As String            'Fuente viñeta<br />
    Dim _iFTV As Integer        'Tamaño fuente viñeta<br />
    <br />
    Dim iXM  As Double            'Coordenada X origen del marco actual<br />
    Dim iYM  As Double            'Coordenada Y origen del marco actual<br />
    Dim iXP  As Double            'Coordenada X origen de la página actual<br />
    Dim iYP  As Double            'Coordenada Y origen de la página actual<br />
    Dim iXV  As Double            'Coordenada X origen de la viñeta actual<br />
    Dim iYV  As Double            'Coordenada Y origen de la viñeta actual<br />
    Dim iAnV As Double            'Ancho de la viñeta actual<br />
    Dim iAlV As Double            'Alto de la viñeta actual<br />
    <br />
    Dim iKK  As Byte<br />
    Dim iFil As Byte<br />
    Dim iCol As Byte<br />
    Dim iVis As Variant<br />
    <br />
    Dim Paso As String            'Variable comodín<br />
    <br />
    Dim tSVG As String            'Cadena SVG resultado<br />
    <br />
    On ERROR GOTO Errr<br />
    <br />
    'Tamaño y orientación de la página<br />
    Paso="A4 vertical: " &amp; sqr(2) &amp; Chr(13)<br />
    Paso=Paso &amp; "A4 Horizontal: " &amp; 1/sqr(2) &amp; Chr(13)<br />
    Paso=Paso &amp; "Cuadrado:      " &amp; 1 &amp; Chr(13)<br />
    Paso=Paso &amp; "O un número cualquiera como proporción entre alto y ancho."<br />
    _iRel=InputBox(Paso, "Formato", sqr(2))<br />
    if _iRel&lt;=0 then end<br />
    Paso=""<br />
    <br />
    'Iniciar variables de color, forma y fuentes<br />
    _sCoM="#000080"'"#000000FF"<br />
    _sCoP="#FFFFFF"<br />
    _sCoB="#008080"<br />
    _sCoV="#00FFFF80"<br />
    _iAnB=2<br />
    _sFuP="Liberation Mono"<br />
    _sFuV="Liberation Mono"<br />
    _iFTV=16<br />
    _iFTP=72<br />
    <br />
    _iAnM= 210.0224103814*3.779527559055<br />
    _iAlM=_iAnM*_iRel<br />
    _iCaM=5<br />
    _iCaP=5<br />
    _iCaV=1<br />
    _iAnP=(_iAnM-3*_iCaP)/4<br />
    _iAlP=(_iAlM-5*_iCap)/4<br />
    <br />
    tSVG="&lt;svg version=" &amp; sC &amp; "1.1" &amp; sC &amp; " xmlns=" &amp; sC &amp; "http://www.w3.org/2000/svg" &amp; sC <br />
    tSVG=tSVG &amp; " xmlns:xlink=" &amp; sC &amp; "http://www.w3.org/1999/xlink" &amp; sC &amp; "&gt;"<br />
    <br />
    'Primer marco<br />
    iXM=0<br />
    iYM=0<br />
    tSVG=tSVG &amp; RectSVG(iXM, iYM, _iAnM, _iAlM, _sCoM) &amp; Chr(13)<br />
    <br />
    oDoc=ThisComponent<br />
    oEnu=oDoc.Text.createEnumeration<br />
    <br />
    While oEnu.hasMoreElements<br />
        oTex=oEnu.nextElement<br />
        If oTex.supportsService("com.sun.star.text.Paragraph") Then<br />
            <br />
            If oTex.ParaStyleName=("CC_Página") Then<br />
                iPag=iPag+1<br />
                iVin=0<br />
                '¿Marco nuevo? A dibujarlo<br />
                iKK=iPag MOD &amp;H10<br />
                If iKK=0 Then<br />
                    iYM=0<br />
                    iXM=(iPag &#92; &amp;H10)*(_iAnM+_iCaM)<br />
                    tSVG=tSVG &amp; RectSVG(iXM, iYM, _iAnM, _iAlM, _sCoM) &amp; Chr(13)<br />
                End If<br />
                'Dibuja la página<br />
                Paso = iPag<br />
                iCol=iKK MOD 4<br />
                iFil=iKK &#92; 4<br />
                iYP=iYM+_iCaP+(_iCaP+_iAlP)*iFil<br />
                iXP=iXM+_iCaP+_iAnP*iCol+((iCol+1) MOD 2)*_iCap<br />
                tSVG=tSVG &amp; RectSVG(iXP, iYP, _iAnP, _iAlP, _sCoP,"1","#000000",_sFuP, _iFTP, "gray",Paso) &amp; Chr(13)<br />
            End If<br />
            If oTex.ParaStyleName=("CC_Viñeta") Then<br />
                iVin=iVin+1<br />
                'Dibuja la viñeta<br />
                'Interpreta posición y tamaño<br />
                iVis=SoriaVin(oTex.String, Str(iPag &amp; "." &amp; iVin))<br />
                iYV=iVis(0,0)*_iAlP+iYP<br />
                iXV=iVis(1,0)*_iAnP+iXP<br />
                iAnV=iVis(1,1)*_iAnP<br />
                iAlV=iVis(0,1)*_iAlP<br />
                Paso=iPag &amp; "." &amp; iVin<br />
                tSVG=tSVG &amp; RectSVG(iXV, iYV, iAnV, iAlV, _sCoV, "1", _sCoB, _sFuV, _iFTV,"gray",Paso) &amp; Chr(13)<br />
            End If<br />
                    <br />
        End If<br />
    Wend<br />
    tSVG=tSVG &amp; "&lt;/svg&gt;"<br />
    GlobalScope.BasicLibraries.loadLibrary("Tools")<br />
    GuardaArchivo(tSVG, Tools.Strings.DirectoryNameoutofPath(oDoc.URL, "/") &amp; "/EsquemaVinetas.svg")<br />
    'Print tSVG<br />
    MsgBox("¡Terminado!")<br />
    Exit Sub<br />
Errr:<br />
    Reset<br />
    MsgBox("Numeración incorrecta en la viñeta: " &amp; iPag &amp; "." &amp; iVin &amp; Chr(13) &amp; oTex.String)<br />
<br />
End Sub<br />
<br />
Sub CuentaVinetas()<br />
    'Cuenta páginas, bocadillos y viñetas por tipo de párrafo y lo muestra en un mensaje <br />
    Dim oDoc As Object<br />
    Dim oEnu As Object<br />
    Dim oTex As Object<br />
    Dim iPag As Integer<br />
    Dim iVin As Integer<br />
    Dim iBoc As Integer<br />
    <br />
    Dim Paso As String<br />
   <br />
    oDoc=ThisComponent<br />
    oEnu=oDoc.Text.createEnumeration<br />
    <br />
    While oEnu.hasMoreElements<br />
        oTex=oEnu.nextElement<br />
        If oTex.supportsService("com.sun.star.text.Paragraph") Then<br />
            If oTex.ParaStyleName=("CC_Viñeta")    Then iVin = iVin+1<br />
            If oTex.ParaStyleName=("CC_Página")    Then iPag = iPag+1<br />
            If oTex.ParaStyleName=("CC_Bocadillo") Then iBoc = iBoc+1<br />
        End If<br />
    Wend<br />
     Paso = "Páginas:    " &amp; iPag &amp; Chr(13)<br />
     Paso = Paso &amp; "Viñetas:    " &amp; iVin &amp; Chr(13)<br />
     Paso = Paso &amp; "Bocadillos: " &amp; iBoc<br />
 <br />
    MSGBOX (Paso, 64, "Estadísitcas")<br />
 <br />
End Sub<br />
<br />
Private Function RectSVG (iX As Double, iY As Double, iAnc As Double, iAlt As Double, sFondo As String, Optional iBorde As Double, Optional sBorde As String, Optional sFuente As String, Optional iTam As Integer, Optional sColor As String, Optional tTexto As String) As String<br />
    'Genera un texto SVG con un rectángulo y un texto dentro.<br />
    Dim Paso as String<br />
    'Posición<br />
    Paso=Paso &amp; "&lt;rect x=" &amp; sC &amp; Int(iX) &amp; sC &amp; " y=" &amp; sC &amp; Int(iY) &amp; sC <br />
    'Tamaño<br />
    Paso=Paso &amp; " width=" &amp; sC &amp; Int(iAnc) &amp; sC &amp; " height=" &amp; sC &amp; Int(iAlt) &amp; sC<br />
    'Color<br />
    Paso=Paso &amp; " style=" &amp; sC &amp; "fill:" &amp; sFondo<br />
    'Borde, si se le añade<br />
    If Not IsMissing(sBorde) Then<br />
        Paso=Paso &amp; ";stroke:" &amp; sBorde &amp; ";stroke-width:" &amp; iBorde &amp; "px"<br />
    End If<br />
    Paso=Paso &amp; sC &amp; "/&gt;" &amp; Chr(13)<br />
    <br />
    If Not IsMissing(tTexto) Then<br />
        'Texto, si se le añade<br />
        'Fuente<br />
        Paso=Paso &amp; "&lt;text font-family=" &amp; sC &amp; sFuente &amp; sC &amp; " font-size=" &amp; sC &amp; iTam &amp; sC &amp; " fill=" &amp; sC &amp; sColor &amp; sC<br />
        'Posición<br />
        Paso=Paso &amp; " x=" &amp; sC &amp; Int(iX+iAnc/2) &amp; sC &amp; " y=" &amp; sC &amp; Int(iY+iAlt/2) &amp; sC<br />
        'Centrar<br />
        Paso=Paso &amp; " text-anchor=" &amp; sC &amp; "middle" &amp; sC &amp; " alignment-baseline=" &amp; sC &amp; "center" &amp; sC<br />
        'Texto<br />
        Paso=Paso &amp; "&gt;" &amp; tTexto &amp; "&lt;/text&gt;"<br />
    End If<br />
    <br />
    RectSVG=Paso<br />
End Function<br />
<br />
Private Sub GuardaArchivo(tTexto as String, sRuta as String)<br />
    Dim iLibre as Integer<br />
    sRuta = ConvertToUrl(sRuta)<br />
    iLibre = FreeFile<br />
    Open sRuta For Output As #iLibre<br />
    Print #iLibre,tTexto<br />
    Close #iLibre<br />
End Sub<br />
<br />
Private Function SoriaVin(sTex As String, Donde As String) As Variant<br />
    <br />
    Dim sGGG As String        'Texto Soria en mayuúsculas y sin espacios<br />
    Dim sMMM() As String    'Matriz para tratar el texto<br />
    Dim sTTT() As String    'Submatriz<br />
    Dim iPX (0 To 1, 0 To 1) As Double '0 Hor ;1 Ver | 0 Origen; 1 Ancho<br />
    Dim iPA (0 To 1, 0 To 2) As Double '0 Hor ;1 Ver | 0 Desde; 1 Hasta ; 2 De<br />
    Dim i   As Byte            'Contador<br />
    Dim k     As Byte            'Contador<br />
    <br />
    sGGG = Ucase(Trim(sTex))<br />
    if Not IsNumeric(Left(sGGG,1)) Then<br />
    'Si no comienza por número, viñeta a toda página<br />
        sGGG="1/1VX1/1H"<br />
    End If<br />
    sMMM=Split(sGGG," ")<br />
    sGGG=sMMM(0)<br />
    sMMM=Split(sGGG,"X")<br />
    If Ubound(sMMM)=0 Then<br />
        Redim Preserve sMMM(0 To 1)<br />
        if Instr(sMMM(0),"V") Then sMMM(1)="1/1H" Else sMMM(1)="1/1V"<br />
    End If<br />
    For i=0 To 1<br />
        sGGG=sMMM(i)<br />
        If InStr(sGGG,"H") Then k=0 Else k=1<br />
        sGGG=Left(sGGG,Len(sGGG)-1)<br />
        sTTT=Split(sGGG, "/")<br />
        iPA(k,2)=sTTT(Ubound(sTTT))<br />
        sTTT=Split(sTTT(0),"-")<br />
        If Ubound(sTTT)=1 Then<br />
                iPA(k,0)=sTTT(0)<br />
                iPA(k,1)=sTTT(1)<br />
            Else<br />
                iPA(k,0)=sTTT(0)<br />
                iPA(k,1)=sTTT(0)<br />
        End If<br />
        iPX(k,0)=(iPA(k,0)-1)/iPA(k,2)<br />
        iPX(k,1)=(iPA(k,1)-iPA(k,0)+1)/iPA(k,2)<br />
    Next i<br />
    <br />
    SoriaVin=iPX<br />
End Function</code></div></div><br /><!-- start: postbit_attachments_attachment -->
<div class="row mt-2 g-1 text-muted">
	<div class="col-auto align-self-center">

<!-- start: attachment_icon -->
<img src="https://gambas-es.org/images/attachtypes/zip.png" title="ZIP File" style="height: 16px; width: 16px" border="0" alt=".zip" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=181" target="_blank" title="">Plantilla_KK_macro.ott.zip</a> (Tamaño: <span class="text-dark">18.05 KB</span> Descargas: <span class="text-dark">1)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[<div style="text-align: justify;" class="mycode_align">A raíz de hacer una plantilla para redactar guiones de historietas que se adaptase a mi forma de trabajar, pensé que debía añadirle una herramienta que permitiese hacer un diagrama de viñetas sin necesidad de gastar la, más o menos, hora por cada 15-18 páginas.<br />
La cuestión planteada en  <a href="https://gambas-es.org/showthread.php?tid=645" target="_blank" rel="noopener" class="mycode_url">https://gambas-es.org/showthread.php?tid=645</a>  venía al caso para poder hacer un diagrama de viñetas que ayudase al dibujante «víctima» del guionista de turno. Esto es, el «escribidor» realiza un guion con la plantilla y ésta, de manera automática, fabrica un esquema de viñetas. Para tal propósito son necesaria dos cosas:</div>
<ol type="1" class="mycode_list"><li>Que las páginas y las viñetas estén formateadas con los párrafos correspondientes.<br />
</li>
<li>Que el texto de las viñetas indique el tamaño y posición según el método sugerido por Peio Soria.<br />
</li>
</ol>
<div style="text-align: justify;" class="mycode_align">Este método es muy simple. Como explico en <a href="https://www.faneo.es/forum/forum/guion-y-narrativa-43/topic/el-m%C3%A9todo-de-peio-soria-para-caracterizar-vi%C3%B1etas-894/?post=11068#11068" target="_blank" rel="noopener" class="mycode_url">https://www.faneo.es/forum/forum/guion-y...1068#11068</a>, En su manual <a href="https://www.dropbox.com/s/69nbax16an75g55/miguiondecomic_PeioSoria_pdf.pdf?dl=0" target="_blank" rel="noopener" class="mycode_url">«Mi guion de cómic»</a>, que está para bajar libremente en pdf desde su página, Peio Soria describe el que, para mí, es el método más lógico y sencillo. Se trata de emplear unas fracciones en vertical y en horizontal, de la manera 2/3Vx2/4H, por ejemplo. ¿Cómo se interpretaría? Fácil, 2/3V significa que se toma el segundo de los tres tercios posibles de la división vertical de la página, esto es, columnas. Además se toma el segundo de las cuatro posibles partes de división horizontal, filas, de la página. Superponiendo ambos, resulta la viñeta que queremos indicar.</div>
<a href="https://ibb.co/QHB1PY4" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/FYvj58F/Vi-etas-de-Peio.png" loading="lazy"  alt="[Imagen: Vi-etas-de-Peio.png]" class="mycode_img" /></a><br />
Para abarcar varias partes en el caso de alguna viñeta más irregular o una que ocupe toda unidad, se pueden emplear nomenclaturas especiales.<br />
Véase un ejemplo de cómo queda escrito:<br />
<a href="https://ibb.co/NxxzFbb" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/sjjrgzz/2021-10-31-12-15.png" loading="lazy"  alt="[Imagen: 2021-10-31-12-15.png]" class="mycode_img" /></a><br />
<br />
De esta manera, al ejecutar la macro, se obtiene:<br />
<a href="https://ibb.co/r5MF3yH" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.ibb.co/5svGkcL/Esquema-Vinetas.png" loading="lazy"  alt="[Imagen: Esquema-Vinetas.png]" class="mycode_img" /></a><br />
Documento que ya se puede enviar para que el dibujante pueda interpretar más fácilmente lo que dice el guionista y, después,... hacer lo que le venga en gana  <img src="https://gambas-es.org/images/smilies/tongue.png" alt="Tongue" title="Tongue" class="smilie smilie_5" /> .<br />
Además, la macro permite:<br />
<ol type="1" class="mycode_list"><li>Solapamiento de viñetas —como en la página 37 del ejemplo—.<br />
</li>
<li>Cambio INMEDIATO de formato de página —apaisado, vertical, A5, B5, cuadrado, <span style="font-style: italic;" class="mycode_i">fanzine</span>...— con sólo introducir un número.<br />
</li>
<li>Detecta errores en la nomenclatura e indica el lugar en el que se produce.<br />
</li>
<li>Se le ha añadido un apéndice de estadísticas que permite ver, aparte de las palabras y caracteres que ya indica el programa con «contar palabras», el número de páginas del cómic, el número bruto de viñetas y el número de bocadillos.<br />
</li>
</ol>
A esta macro, después de pelearme mucho, muchísimo, más todavía, con los mal documentados y dispersas especificaciones del UNO de Star BASIC —al menos así le pareció a éste, su humilde servidor—, logré terminarla en una versión más o menos útil:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>REM  *****  BASIC  *****<br />
<br />
' DIBUJAR ESQUEMAS PARA GUION DE HISTORIETAS Y ESTADÍSITCAS.<br />
'    SOFTWARE LIBRE<br />
'    --------------<br />
'    <br />
'    Grandamakulo, 2021<br />
'    grandamakulo@gmail.com<br />
'    <br />
'    * Puedes:<br />
'    Distribuirlo<br />
'    Modificarlo<br />
'    Regalarlo<br />
'    Si te place, acredítame<br />
'    <br />
'    * No puedes:<br />
'    Cobrar por él o por sus variaciones directas<br />
'    Si quieres hacerlo, ponte en contacto conmigo<br />
'    —Hay muchas fundaciones a las que ayudar—<br />
'    <br />
'    * Garantías:<br />
'    Estás de guasa, ¿no?<br />
'    Si se te funde la lavadora o se te hace un <br />
'    desconchón en la pared, soluciónalo tú.<br />
'    <br />
'    ESTE PROGRAMA CONSIDERA LAS TRES --O CUATRO--<br />
'    LEYES DE LA ROBÓTICA. Más o menos.<br />
<br />
<br />
Option Explicit<br />
Const Si As Boolean = True<br />
Const No As Boolean = False<br />
Const sC As String = """"<br />
Const sA As String = "'" <br />
<br />
Sub DibujaEsquema()<br />
    ' A partir de los datos del formato de página que introduce el usuario,<br />
    ' del número de páginas y de la información que el usuario ha establecido<br />
    ' en el tipo de párrafo viñeta, se dibuja en SVG —y se guarda en el mismo<br />
    ' directorio que el Documento— un ESQUEMA DE VIÑETAS.<br />
    <br />
    Dim oDoc As Object            'Documento actual<br />
    Dim oEnu As Object            'Partes del documento actual<br />
    Dim oTex As Object            'Un elemento texto de oEnu<br />
    Dim iPag As Integer            'Número de página<br />
    Dim iVin As Integer            'Número de viñeta en cada página<br />
    <br />
    Dim oSitio As Object<br />
    <br />
    Dim _iRel As Double            'Relación entre alto y ancho<br />
    Dim _iAnM As Double            'Ancho de marco = 210,0224103814 mm eq A4<br />
    Dim _iAlM As Double            'Alto del marco = _iAnt * _iRel<br />
    Dim _iCaM As Double            'Ancho de calle marco  = 5 mm<br />
    Dim _iCaP As Double            'Ancho de calle página = 5 mm<br />
    Dim _iCaV As Double            'Ancho de calle viñeta = 2 mm<br />
    Dim _iAnP As Double            'Ancho de página<br />
    Dim _iAlP As Double            'Alto de página<br />
    Dim _sCoM As String            'Color marco<br />
    Dim _sCoP As String            'Color página<br />
    Dim _sCoB As String            'Color borde viñeta<br />
    Dim _sCoV As String            'Color viñeta<br />
    Dim _iAnB As Double            'Ancho borde viñeta<br />
    Dim _sFuP As String            'Fuente página<br />
    Dim _iFTP As Integer        'Tamaño fuente página<br />
    Dim _sFuV As String            'Fuente viñeta<br />
    Dim _iFTV As Integer        'Tamaño fuente viñeta<br />
    <br />
    Dim iXM  As Double            'Coordenada X origen del marco actual<br />
    Dim iYM  As Double            'Coordenada Y origen del marco actual<br />
    Dim iXP  As Double            'Coordenada X origen de la página actual<br />
    Dim iYP  As Double            'Coordenada Y origen de la página actual<br />
    Dim iXV  As Double            'Coordenada X origen de la viñeta actual<br />
    Dim iYV  As Double            'Coordenada Y origen de la viñeta actual<br />
    Dim iAnV As Double            'Ancho de la viñeta actual<br />
    Dim iAlV As Double            'Alto de la viñeta actual<br />
    <br />
    Dim iKK  As Byte<br />
    Dim iFil As Byte<br />
    Dim iCol As Byte<br />
    Dim iVis As Variant<br />
    <br />
    Dim Paso As String            'Variable comodín<br />
    <br />
    Dim tSVG As String            'Cadena SVG resultado<br />
    <br />
    On ERROR GOTO Errr<br />
    <br />
    'Tamaño y orientación de la página<br />
    Paso="A4 vertical: " &amp; sqr(2) &amp; Chr(13)<br />
    Paso=Paso &amp; "A4 Horizontal: " &amp; 1/sqr(2) &amp; Chr(13)<br />
    Paso=Paso &amp; "Cuadrado:      " &amp; 1 &amp; Chr(13)<br />
    Paso=Paso &amp; "O un número cualquiera como proporción entre alto y ancho."<br />
    _iRel=InputBox(Paso, "Formato", sqr(2))<br />
    if _iRel&lt;=0 then end<br />
    Paso=""<br />
    <br />
    'Iniciar variables de color, forma y fuentes<br />
    _sCoM="#000080"'"#000000FF"<br />
    _sCoP="#FFFFFF"<br />
    _sCoB="#008080"<br />
    _sCoV="#00FFFF80"<br />
    _iAnB=2<br />
    _sFuP="Liberation Mono"<br />
    _sFuV="Liberation Mono"<br />
    _iFTV=16<br />
    _iFTP=72<br />
    <br />
    _iAnM= 210.0224103814*3.779527559055<br />
    _iAlM=_iAnM*_iRel<br />
    _iCaM=5<br />
    _iCaP=5<br />
    _iCaV=1<br />
    _iAnP=(_iAnM-3*_iCaP)/4<br />
    _iAlP=(_iAlM-5*_iCap)/4<br />
    <br />
    tSVG="&lt;svg version=" &amp; sC &amp; "1.1" &amp; sC &amp; " xmlns=" &amp; sC &amp; "http://www.w3.org/2000/svg" &amp; sC <br />
    tSVG=tSVG &amp; " xmlns:xlink=" &amp; sC &amp; "http://www.w3.org/1999/xlink" &amp; sC &amp; "&gt;"<br />
    <br />
    'Primer marco<br />
    iXM=0<br />
    iYM=0<br />
    tSVG=tSVG &amp; RectSVG(iXM, iYM, _iAnM, _iAlM, _sCoM) &amp; Chr(13)<br />
    <br />
    oDoc=ThisComponent<br />
    oEnu=oDoc.Text.createEnumeration<br />
    <br />
    While oEnu.hasMoreElements<br />
        oTex=oEnu.nextElement<br />
        If oTex.supportsService("com.sun.star.text.Paragraph") Then<br />
            <br />
            If oTex.ParaStyleName=("CC_Página") Then<br />
                iPag=iPag+1<br />
                iVin=0<br />
                '¿Marco nuevo? A dibujarlo<br />
                iKK=iPag MOD &amp;H10<br />
                If iKK=0 Then<br />
                    iYM=0<br />
                    iXM=(iPag &#92; &amp;H10)*(_iAnM+_iCaM)<br />
                    tSVG=tSVG &amp; RectSVG(iXM, iYM, _iAnM, _iAlM, _sCoM) &amp; Chr(13)<br />
                End If<br />
                'Dibuja la página<br />
                Paso = iPag<br />
                iCol=iKK MOD 4<br />
                iFil=iKK &#92; 4<br />
                iYP=iYM+_iCaP+(_iCaP+_iAlP)*iFil<br />
                iXP=iXM+_iCaP+_iAnP*iCol+((iCol+1) MOD 2)*_iCap<br />
                tSVG=tSVG &amp; RectSVG(iXP, iYP, _iAnP, _iAlP, _sCoP,"1","#000000",_sFuP, _iFTP, "gray",Paso) &amp; Chr(13)<br />
            End If<br />
            If oTex.ParaStyleName=("CC_Viñeta") Then<br />
                iVin=iVin+1<br />
                'Dibuja la viñeta<br />
                'Interpreta posición y tamaño<br />
                iVis=SoriaVin(oTex.String, Str(iPag &amp; "." &amp; iVin))<br />
                iYV=iVis(0,0)*_iAlP+iYP<br />
                iXV=iVis(1,0)*_iAnP+iXP<br />
                iAnV=iVis(1,1)*_iAnP<br />
                iAlV=iVis(0,1)*_iAlP<br />
                Paso=iPag &amp; "." &amp; iVin<br />
                tSVG=tSVG &amp; RectSVG(iXV, iYV, iAnV, iAlV, _sCoV, "1", _sCoB, _sFuV, _iFTV,"gray",Paso) &amp; Chr(13)<br />
            End If<br />
                    <br />
        End If<br />
    Wend<br />
    tSVG=tSVG &amp; "&lt;/svg&gt;"<br />
    GlobalScope.BasicLibraries.loadLibrary("Tools")<br />
    GuardaArchivo(tSVG, Tools.Strings.DirectoryNameoutofPath(oDoc.URL, "/") &amp; "/EsquemaVinetas.svg")<br />
    'Print tSVG<br />
    MsgBox("¡Terminado!")<br />
    Exit Sub<br />
Errr:<br />
    Reset<br />
    MsgBox("Numeración incorrecta en la viñeta: " &amp; iPag &amp; "." &amp; iVin &amp; Chr(13) &amp; oTex.String)<br />
<br />
End Sub<br />
<br />
Sub CuentaVinetas()<br />
    'Cuenta páginas, bocadillos y viñetas por tipo de párrafo y lo muestra en un mensaje <br />
    Dim oDoc As Object<br />
    Dim oEnu As Object<br />
    Dim oTex As Object<br />
    Dim iPag As Integer<br />
    Dim iVin As Integer<br />
    Dim iBoc As Integer<br />
    <br />
    Dim Paso As String<br />
   <br />
    oDoc=ThisComponent<br />
    oEnu=oDoc.Text.createEnumeration<br />
    <br />
    While oEnu.hasMoreElements<br />
        oTex=oEnu.nextElement<br />
        If oTex.supportsService("com.sun.star.text.Paragraph") Then<br />
            If oTex.ParaStyleName=("CC_Viñeta")    Then iVin = iVin+1<br />
            If oTex.ParaStyleName=("CC_Página")    Then iPag = iPag+1<br />
            If oTex.ParaStyleName=("CC_Bocadillo") Then iBoc = iBoc+1<br />
        End If<br />
    Wend<br />
     Paso = "Páginas:    " &amp; iPag &amp; Chr(13)<br />
     Paso = Paso &amp; "Viñetas:    " &amp; iVin &amp; Chr(13)<br />
     Paso = Paso &amp; "Bocadillos: " &amp; iBoc<br />
 <br />
    MSGBOX (Paso, 64, "Estadísitcas")<br />
 <br />
End Sub<br />
<br />
Private Function RectSVG (iX As Double, iY As Double, iAnc As Double, iAlt As Double, sFondo As String, Optional iBorde As Double, Optional sBorde As String, Optional sFuente As String, Optional iTam As Integer, Optional sColor As String, Optional tTexto As String) As String<br />
    'Genera un texto SVG con un rectángulo y un texto dentro.<br />
    Dim Paso as String<br />
    'Posición<br />
    Paso=Paso &amp; "&lt;rect x=" &amp; sC &amp; Int(iX) &amp; sC &amp; " y=" &amp; sC &amp; Int(iY) &amp; sC <br />
    'Tamaño<br />
    Paso=Paso &amp; " width=" &amp; sC &amp; Int(iAnc) &amp; sC &amp; " height=" &amp; sC &amp; Int(iAlt) &amp; sC<br />
    'Color<br />
    Paso=Paso &amp; " style=" &amp; sC &amp; "fill:" &amp; sFondo<br />
    'Borde, si se le añade<br />
    If Not IsMissing(sBorde) Then<br />
        Paso=Paso &amp; ";stroke:" &amp; sBorde &amp; ";stroke-width:" &amp; iBorde &amp; "px"<br />
    End If<br />
    Paso=Paso &amp; sC &amp; "/&gt;" &amp; Chr(13)<br />
    <br />
    If Not IsMissing(tTexto) Then<br />
        'Texto, si se le añade<br />
        'Fuente<br />
        Paso=Paso &amp; "&lt;text font-family=" &amp; sC &amp; sFuente &amp; sC &amp; " font-size=" &amp; sC &amp; iTam &amp; sC &amp; " fill=" &amp; sC &amp; sColor &amp; sC<br />
        'Posición<br />
        Paso=Paso &amp; " x=" &amp; sC &amp; Int(iX+iAnc/2) &amp; sC &amp; " y=" &amp; sC &amp; Int(iY+iAlt/2) &amp; sC<br />
        'Centrar<br />
        Paso=Paso &amp; " text-anchor=" &amp; sC &amp; "middle" &amp; sC &amp; " alignment-baseline=" &amp; sC &amp; "center" &amp; sC<br />
        'Texto<br />
        Paso=Paso &amp; "&gt;" &amp; tTexto &amp; "&lt;/text&gt;"<br />
    End If<br />
    <br />
    RectSVG=Paso<br />
End Function<br />
<br />
Private Sub GuardaArchivo(tTexto as String, sRuta as String)<br />
    Dim iLibre as Integer<br />
    sRuta = ConvertToUrl(sRuta)<br />
    iLibre = FreeFile<br />
    Open sRuta For Output As #iLibre<br />
    Print #iLibre,tTexto<br />
    Close #iLibre<br />
End Sub<br />
<br />
Private Function SoriaVin(sTex As String, Donde As String) As Variant<br />
    <br />
    Dim sGGG As String        'Texto Soria en mayuúsculas y sin espacios<br />
    Dim sMMM() As String    'Matriz para tratar el texto<br />
    Dim sTTT() As String    'Submatriz<br />
    Dim iPX (0 To 1, 0 To 1) As Double '0 Hor ;1 Ver | 0 Origen; 1 Ancho<br />
    Dim iPA (0 To 1, 0 To 2) As Double '0 Hor ;1 Ver | 0 Desde; 1 Hasta ; 2 De<br />
    Dim i   As Byte            'Contador<br />
    Dim k     As Byte            'Contador<br />
    <br />
    sGGG = Ucase(Trim(sTex))<br />
    if Not IsNumeric(Left(sGGG,1)) Then<br />
    'Si no comienza por número, viñeta a toda página<br />
        sGGG="1/1VX1/1H"<br />
    End If<br />
    sMMM=Split(sGGG," ")<br />
    sGGG=sMMM(0)<br />
    sMMM=Split(sGGG,"X")<br />
    If Ubound(sMMM)=0 Then<br />
        Redim Preserve sMMM(0 To 1)<br />
        if Instr(sMMM(0),"V") Then sMMM(1)="1/1H" Else sMMM(1)="1/1V"<br />
    End If<br />
    For i=0 To 1<br />
        sGGG=sMMM(i)<br />
        If InStr(sGGG,"H") Then k=0 Else k=1<br />
        sGGG=Left(sGGG,Len(sGGG)-1)<br />
        sTTT=Split(sGGG, "/")<br />
        iPA(k,2)=sTTT(Ubound(sTTT))<br />
        sTTT=Split(sTTT(0),"-")<br />
        If Ubound(sTTT)=1 Then<br />
                iPA(k,0)=sTTT(0)<br />
                iPA(k,1)=sTTT(1)<br />
            Else<br />
                iPA(k,0)=sTTT(0)<br />
                iPA(k,1)=sTTT(0)<br />
        End If<br />
        iPX(k,0)=(iPA(k,0)-1)/iPA(k,2)<br />
        iPX(k,1)=(iPA(k,1)-iPA(k,0)+1)/iPA(k,2)<br />
    Next i<br />
    <br />
    SoriaVin=iPX<br />
End Function</code></div></div><br /><!-- start: postbit_attachments_attachment -->
<div class="row mt-2 g-1 text-muted">
	<div class="col-auto align-self-center">

<!-- start: attachment_icon -->
<img src="https://gambas-es.org/images/attachtypes/zip.png" title="ZIP File" style="height: 16px; width: 16px" border="0" alt=".zip" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=181" target="_blank" title="">Plantilla_KK_macro.ott.zip</a> (Tamaño: <span class="text-dark">18.05 KB</span> Descargas: <span class="text-dark">1)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[La evolución de los Lenguajes de Programación]]></title>
			<link>https://gambas-es.org/thread-699.html</link>
			<pubDate>Mon, 25 Oct 2021 12:15:15 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=65">AlfredoSC</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-699.html</guid>
			<description><![CDATA[Existen varios vídeos muy interesantes sobre la evolución de Lenguajes de Programación a través de los años. He aquí uno de ellos:<br />
<br />
<a href="https://www.youtube.com/watch?v=M0vBoBqqjr0" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=M0vBoBqqjr0</a>]]></description>
			<content:encoded><![CDATA[Existen varios vídeos muy interesantes sobre la evolución de Lenguajes de Programación a través de los años. He aquí uno de ellos:<br />
<br />
<a href="https://www.youtube.com/watch?v=M0vBoBqqjr0" target="_blank" rel="noopener" class="mycode_url">https://www.youtube.com/watch?v=M0vBoBqqjr0</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Tutoriales "Programación Ya"]]></title>
			<link>https://gambas-es.org/thread-695.html</link>
			<pubDate>Sun, 24 Oct 2021 09:14:28 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-695.html</guid>
			<description><![CDATA[Buenos días!.<br />
<br />
Creo que esta página merece bastante la pena de visitar y aprovechar los recursos que nos enseña.<br />
<br />
<a href="https://www.tutorialesprogramacionya.com/" target="_blank" rel="noopener" class="mycode_url">Tutoriales Programación Ya</a><br />
<br />
De casualidad estaba buscando una clase en Java de un tipo de datos estructurado, que no sé por que tiene tantos, cada uno<br />
con unas propiedades. Supongo que habrán ido creándose según necesidades y se extendieron.<br />
<br />
De tipos de listas hay unos cuantos. ArrayList y LinkedList, que por más que quiera en Gambas con sus<br />
listas voy sobrado. Teniendo en cuenta que Java de los array que podemos conocer tiene varios tipos.<br />
<br />
Primero encontré la web y luego mediante esta me llevó a los vídeo en Youtube que son más explicativos cuando solo te muestra<br />
un código y una breve explicación. Incluso algunos , espero que la mayoría los crea de cero.<br />
<br />
Estoy liado con un ejemplo de clases que implemento desde Java a Gambas y cuesta entender algunas cosas.<br />
Intentaré mostraros en otro mensaje el motivo.<br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenos días!.<br />
<br />
Creo que esta página merece bastante la pena de visitar y aprovechar los recursos que nos enseña.<br />
<br />
<a href="https://www.tutorialesprogramacionya.com/" target="_blank" rel="noopener" class="mycode_url">Tutoriales Programación Ya</a><br />
<br />
De casualidad estaba buscando una clase en Java de un tipo de datos estructurado, que no sé por que tiene tantos, cada uno<br />
con unas propiedades. Supongo que habrán ido creándose según necesidades y se extendieron.<br />
<br />
De tipos de listas hay unos cuantos. ArrayList y LinkedList, que por más que quiera en Gambas con sus<br />
listas voy sobrado. Teniendo en cuenta que Java de los array que podemos conocer tiene varios tipos.<br />
<br />
Primero encontré la web y luego mediante esta me llevó a los vídeo en Youtube que son más explicativos cuando solo te muestra<br />
un código y una breve explicación. Incluso algunos , espero que la mayoría los crea de cero.<br />
<br />
Estoy liado con un ejemplo de clases que implemento desde Java a Gambas y cuesta entender algunas cosas.<br />
Intentaré mostraros en otro mensaje el motivo.<br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Programando para todo el mundo, lenguaje?]]></title>
			<link>https://gambas-es.org/thread-656.html</link>
			<pubDate>Sun, 03 Oct 2021 14:05:44 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=19">tercoide</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-656.html</guid>
			<description><![CDATA[Esto viene a colación de conclusiones que estoy sacando luego de un buen tiempo con Gambas (10 años?) y, si bien me ha dado muchísimas satisfacciones personales, a la hora de conectarse con el mundo, pues nos quedamos cortos...<br />
<br />
Estoy comparando motores de juegos para un proyecto personal con mi hija: ella pondría el arte, desarrollo del juego y yo la programación. Llevo varias semanas investigando con las siguientes conclusiones.<br />
Los top AAA:<br />
Unity, comunidad de 400k usuarios, muy completo , se programa en C#<br />
Unreal Engine, 200k usuarios, muy completo, usa C++<br />
<br />
Los AA:<br />
GameMaker , Godot, Defold y otros<br />
<br />
pero casi todos los motores tienen su propio scripting o incluso puede hacerse un juego entero sin ningún código usando bloques y conexiones:<br />
<br />
Bolt para Unity<br />
Blueprints para Unreal<br />
GML para GameMaker<br />
GDScript para Godot<br />
y asi...<br />
<br />
Teniendo en cuenta que el juego debería ser corrido en diversas plataformas es obvio que Gambas no es una opción<br />
, pero tampoco quiero aprender chino (menos a mi avanzada edad y con neuronas desgastadas) por lo que la estructura del código debería ser similar: objetos, controles, componentes<br />
<br />
Ideas?]]></description>
			<content:encoded><![CDATA[Esto viene a colación de conclusiones que estoy sacando luego de un buen tiempo con Gambas (10 años?) y, si bien me ha dado muchísimas satisfacciones personales, a la hora de conectarse con el mundo, pues nos quedamos cortos...<br />
<br />
Estoy comparando motores de juegos para un proyecto personal con mi hija: ella pondría el arte, desarrollo del juego y yo la programación. Llevo varias semanas investigando con las siguientes conclusiones.<br />
Los top AAA:<br />
Unity, comunidad de 400k usuarios, muy completo , se programa en C#<br />
Unreal Engine, 200k usuarios, muy completo, usa C++<br />
<br />
Los AA:<br />
GameMaker , Godot, Defold y otros<br />
<br />
pero casi todos los motores tienen su propio scripting o incluso puede hacerse un juego entero sin ningún código usando bloques y conexiones:<br />
<br />
Bolt para Unity<br />
Blueprints para Unreal<br />
GML para GameMaker<br />
GDScript para Godot<br />
y asi...<br />
<br />
Teniendo en cuenta que el juego debería ser corrido en diversas plataformas es obvio que Gambas no es una opción<br />
, pero tampoco quiero aprender chino (menos a mi avanzada edad y con neuronas desgastadas) por lo que la estructura del código debería ser similar: objetos, controles, componentes<br />
<br />
Ideas?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[BASIC Libre Office: ¿Cómo recorrer los párrafos por tipo?]]></title>
			<link>https://gambas-es.org/thread-645.html</link>
			<pubDate>Tue, 28 Sep 2021 12:11:08 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=62">Grandamakulo</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-645.html</guid>
			<description><![CDATA[Hola a todos:<br />
Creo que esta pregunta debería ir en «Programación en otros lenguajes», pero, como no he encontrado dónde, pues la dejo aquí, a merced de lo que diga el administrador.<br />
La cuestión es que tengo que hacer una macro en LibreOffice BASIC que recorra los párrafos de determinados tipos —«Estilos» mejor que tipos— de todo un documento LO Writer y vea el contenido, el texto, de cada uno. Pero resulta que la cosa ha cambiado mucho desde la última vez que hice cosas de éstas tanto con el LOB como con el VBA y soy incapaz de manejarme en condiciones con el UNO. ¿Alguien podría echarme una mano?<br />
Gracias.<br />
 <br />
<hr class="mycode_hr" />
Bueno, tras arduas horas persiguiendo StarBASIC y UNO, creo que lo he logrado. Los estilos CC_Página y CC_Viñeta se pueden cambiar, obviamente, por otros:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Sub DibujaEsquema<br />
<br />
    Dim Doc As Object<br />
    Dim Enu As Object<br />
    Dim Tex As Object<br />
    Dim Pag as Integer<br />
    Dim Vin as Integer<br />
    <br />
    Dim Paso As String<br />
    <br />
    ' Aquí tamaño y orientación de la página. Dibuja los marcos<br />
    <br />
    Doc=ThisComponent<br />
    Enu=Doc.Text.createEnumeration<br />
    <br />
    While Enu.hasMoreElements<br />
        Tex=Enu.nextElement<br />
        If Tex.supportsService("com.sun.star.text.Paragraph") Then<br />
            <br />
            If Tex.ParaStyleName=("CC_Página") Then<br />
                Pag=Pag+1<br />
                Vin=0<br />
                'Dibuja la página: Aquí hará «cosas» con la página<br />
                Paso=Paso &amp; "Página: " &amp; Pag &amp; CHr(13)<br />
            End If<br />
            If Tex.ParaStyleName=("CC_Viñeta") Then<br />
                Vin=Vin+1<br />
                'Dibuja la viñeta: Aquí hará «cosas» con la viñeta<br />
                Paso=Paso &amp; "   Viñeta: " &amp; Pag &amp; "." &amp; Vin &amp; " " &amp; Tex.String &amp; Chr(13)<br />
            End If<br />
                    <br />
        End If<br />
    Wend<br />
<br />
    MSGBOX (Paso)<br />
<br />
End Sub</code></div></div>]]></description>
			<content:encoded><![CDATA[Hola a todos:<br />
Creo que esta pregunta debería ir en «Programación en otros lenguajes», pero, como no he encontrado dónde, pues la dejo aquí, a merced de lo que diga el administrador.<br />
La cuestión es que tengo que hacer una macro en LibreOffice BASIC que recorra los párrafos de determinados tipos —«Estilos» mejor que tipos— de todo un documento LO Writer y vea el contenido, el texto, de cada uno. Pero resulta que la cosa ha cambiado mucho desde la última vez que hice cosas de éstas tanto con el LOB como con el VBA y soy incapaz de manejarme en condiciones con el UNO. ¿Alguien podría echarme una mano?<br />
Gracias.<br />
 <br />
<hr class="mycode_hr" />
Bueno, tras arduas horas persiguiendo StarBASIC y UNO, creo que lo he logrado. Los estilos CC_Página y CC_Viñeta se pueden cambiar, obviamente, por otros:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Sub DibujaEsquema<br />
<br />
    Dim Doc As Object<br />
    Dim Enu As Object<br />
    Dim Tex As Object<br />
    Dim Pag as Integer<br />
    Dim Vin as Integer<br />
    <br />
    Dim Paso As String<br />
    <br />
    ' Aquí tamaño y orientación de la página. Dibuja los marcos<br />
    <br />
    Doc=ThisComponent<br />
    Enu=Doc.Text.createEnumeration<br />
    <br />
    While Enu.hasMoreElements<br />
        Tex=Enu.nextElement<br />
        If Tex.supportsService("com.sun.star.text.Paragraph") Then<br />
            <br />
            If Tex.ParaStyleName=("CC_Página") Then<br />
                Pag=Pag+1<br />
                Vin=0<br />
                'Dibuja la página: Aquí hará «cosas» con la página<br />
                Paso=Paso &amp; "Página: " &amp; Pag &amp; CHr(13)<br />
            End If<br />
            If Tex.ParaStyleName=("CC_Viñeta") Then<br />
                Vin=Vin+1<br />
                'Dibuja la viñeta: Aquí hará «cosas» con la viñeta<br />
                Paso=Paso &amp; "   Viñeta: " &amp; Pag &amp; "." &amp; Vin &amp; " " &amp; Tex.String &amp; Chr(13)<br />
            End If<br />
                    <br />
        End If<br />
    Wend<br />
<br />
    MSGBOX (Paso)<br />
<br />
End Sub</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[¿ Qué es TensorFlow ?]]></title>
			<link>https://gambas-es.org/thread-611.html</link>
			<pubDate>Thu, 16 Sep 2021 11:16:51 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=3">Shell</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-611.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
Aunque este año me regalaron un libro sobre Machine Learning para Python lo descambié por un curso práctico de Python.<br />
No veía estudiando inteligencia artificial.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/szNPBn_RBfA" frameborder="0" allowfullscreen="true"></iframe><br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
Aunque este año me regalaron un libro sobre Machine Learning para Python lo descambié por un curso práctico de Python.<br />
No veía estudiando inteligencia artificial.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/szNPBn_RBfA" frameborder="0" allowfullscreen="true"></iframe><br />
<br />
Saludos]]></content:encoded>
		</item>
	</channel>
</rss>