<?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 - Aplicaciones/Fragmentos de Código]]></title>
		<link>https://gambas-es.org/</link>
		<description><![CDATA[Comunidad Gambas-es - https://gambas-es.org]]></description>
		<pubDate>Tue, 14 Apr 2026 04:34:19 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[FACTURA POR REPORT GAMBAS3]]></title>
			<link>https://gambas-es.org/thread-1994.html</link>
			<pubDate>Mon, 27 Oct 2025 13:03:24 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=190">Alberto59</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1994.html</guid>
			<description><![CDATA[<!-- 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/pdf.png" title="Adobe Acrobat PDF" style="height: 16px; width: 16px" border="0" alt=".pdf" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=574" target="_blank" title="">factura 16.pdf</a> (Tamaño: <span class="text-dark">422.04 KB</span> Descargas: <span class="text-dark">10)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment --><br />
Hola Shell<br />
<br />
MIra hace tiempo  que no estoy conectado y bueno ya estoy aqui.<br />
<br />
Te digo,ya sé como usar el dichoso report para hacer una dichosa factura,desde el mismo formulario.<br />
Te mando una copia de la factura hecha con reporte y si lo crees conveniente te mando el programa.<br />
<br />
Para aquellos que lo necesiten.ok<br />
<br />
Nota:<br />
<br />
Tengo hecho en dos formatos uno en HTML ,como sabes y  el otro en REPORTE de gambas3]]></description>
			<content:encoded><![CDATA[<!-- 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/pdf.png" title="Adobe Acrobat PDF" style="height: 16px; width: 16px" border="0" alt=".pdf" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=574" target="_blank" title="">factura 16.pdf</a> (Tamaño: <span class="text-dark">422.04 KB</span> Descargas: <span class="text-dark">10)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment --><br />
Hola Shell<br />
<br />
MIra hace tiempo  que no estoy conectado y bueno ya estoy aqui.<br />
<br />
Te digo,ya sé como usar el dichoso report para hacer una dichosa factura,desde el mismo formulario.<br />
Te mando una copia de la factura hecha con reporte y si lo crees conveniente te mando el programa.<br />
<br />
Para aquellos que lo necesiten.ok<br />
<br />
Nota:<br />
<br />
Tengo hecho en dos formatos uno en HTML ,como sabes y  el otro en REPORTE de gambas3]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ejecutar un archivo de audio o Midi al hacer clic en MapView]]></title>
			<link>https://gambas-es.org/thread-1985.html</link>
			<pubDate>Thu, 25 Sep 2025 05:36:21 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=7">vuott</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1985.html</guid>
			<description><![CDATA[Os dejo esta pagina.<br />
Se necesita activar los Componentes "gb.map" y "gb.media" de Gambas.<br />
<br />
<a href="https://www.gambas-it.org/wiki/index.php/Eseguire_un_file_audio_o_Midi_quando_si_clicca_sulla_MapView" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...la_MapView</a>]]></description>
			<content:encoded><![CDATA[Os dejo esta pagina.<br />
Se necesita activar los Componentes "gb.map" y "gb.media" de Gambas.<br />
<br />
<a href="https://www.gambas-it.org/wiki/index.php/Eseguire_un_file_audio_o_Midi_quando_si_clicca_sulla_MapView" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...la_MapView</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Leer en el área de memoria ocupada por un Objeto]]></title>
			<link>https://gambas-es.org/thread-1984.html</link>
			<pubDate>Mon, 22 Sep 2025 11:56:38 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=7">vuott</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1984.html</guid>
			<description><![CDATA[Os dejo esta pagina:<br />
<br />
   <a href="https://www.gambas-it.org/wiki/index.php/Leggere_nell%27area_di_memoria_occupata_da_un_oggetto" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...un_oggetto</a>]]></description>
			<content:encoded><![CDATA[Os dejo esta pagina:<br />
<br />
   <a href="https://www.gambas-it.org/wiki/index.php/Leggere_nell%27area_di_memoria_occupata_da_un_oggetto" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...un_oggetto</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Mostrar una imagen con Drag&Drop de su archivo en un PictureBox o en un ImageView]]></title>
			<link>https://gambas-es.org/thread-1982.html</link>
			<pubDate>Tue, 16 Sep 2025 23:28:20 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=7">vuott</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1982.html</guid>
			<description><![CDATA[Queridos hermanos, os dejo esta pagina:<br />
<br />
<a href="https://www.gambas-it.org/wiki/index.php/Mostrare_un%27immagine_con_il_Drop_del_suo_file_in_una_PictureBox_o_in_una_ImageView" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php..._ImageView</a>]]></description>
			<content:encoded><![CDATA[Queridos hermanos, os dejo esta pagina:<br />
<br />
<a href="https://www.gambas-it.org/wiki/index.php/Mostrare_un%27immagine_con_il_Drop_del_suo_file_in_una_PictureBox_o_in_una_ImageView" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php..._ImageView</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Convertir formatos de audio mediante el Componente gb.media]]></title>
			<link>https://gambas-es.org/thread-1981.html</link>
			<pubDate>Sat, 13 Sep 2025 22:36:01 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=7">vuott</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1981.html</guid>
			<description><![CDATA[Os dejo esta pagina:<br />
<br />
   <a href="https://www.gambas-it.org/wiki/index.php/Convertire_i_formati_audio_mediante_il_Componente_gb.media" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...e_gb.media</a>]]></description>
			<content:encoded><![CDATA[Os dejo esta pagina:<br />
<br />
   <a href="https://www.gambas-it.org/wiki/index.php/Convertire_i_formati_audio_mediante_il_Componente_gb.media" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...e_gb.media</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Paren...WAIT !!!]]></title>
			<link>https://gambas-es.org/thread-1980.html</link>
			<pubDate>Fri, 22 Aug 2025 11:58:43 +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-1980.html</guid>
			<description><![CDATA[Buscando la manera de que un fragmento de codigo de larga ejecucion no se congele, recurri a la instruccion WAIT pero no funcionaba bien. Revisando la ayuda "descubri America" :<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>WAIT       'revisa el bucle de eventos, pero NO del teclado y mouse, y regresa inmediatamente<br />
WAIT 0    ' idem pero lee eventos del teclado y mouse<br />
WAIT 0.1 ' idem pero regresa a los 0.1 segundos</code></div></div>]]></description>
			<content:encoded><![CDATA[Buscando la manera de que un fragmento de codigo de larga ejecucion no se congele, recurri a la instruccion WAIT pero no funcionaba bien. Revisando la ayuda "descubri America" :<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>WAIT       'revisa el bucle de eventos, pero NO del teclado y mouse, y regresa inmediatamente<br />
WAIT 0    ' idem pero lee eventos del teclado y mouse<br />
WAIT 0.1 ' idem pero regresa a los 0.1 segundos</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Fases lunares]]></title>
			<link>https://gambas-es.org/thread-1975.html</link>
			<pubDate>Fri, 25 Jul 2025 21:34:09 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=7">vuott</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1975.html</guid>
			<description><![CDATA[Hace varios años, descargué un programa, relacionado con las fases de la luna, del foro anterior de la comunidad española de programadores Gambas.<br />
No recuerdo quién lo escribió. En las fuentes del programa solo estaba presente la probable referencia a tal "aztk".<br />
Cuando volví a probar el código, había problemas de funcionamiento debido a las modificaciones introducidas en los gráficos de Gambas.<br />
He actualizado el código y ahora está funcionando de nuevo.<br />
Se lo devuelvo a esta comunidad de programadores.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=568" target="_blank" title="">faseslunares-0.0.3.tar.gz</a> (Tamaño: <span class="text-dark">13.97 KB</span> Descargas: <span class="text-dark">2)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hace varios años, descargué un programa, relacionado con las fases de la luna, del foro anterior de la comunidad española de programadores Gambas.<br />
No recuerdo quién lo escribió. En las fuentes del programa solo estaba presente la probable referencia a tal "aztk".<br />
Cuando volví a probar el código, había problemas de funcionamiento debido a las modificaciones introducidas en los gráficos de Gambas.<br />
He actualizado el código y ahora está funcionando de nuevo.<br />
Se lo devuelvo a esta comunidad de programadores.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=568" target="_blank" title="">faseslunares-0.0.3.tar.gz</a> (Tamaño: <span class="text-dark">13.97 KB</span> Descargas: <span class="text-dark">2)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ejemplo de chat]]></title>
			<link>https://gambas-es.org/thread-1942.html</link>
			<pubDate>Mon, 21 Apr 2025 19:35:15 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=41">alberto-moyano</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1942.html</guid>
			<description><![CDATA[Hola gente, alguien a tenido experiencia con la implementación de un chat interno en una aplicación multiusuario, utilizando una base de datos?<br />
<br />
Analizo la posibilidad de llevarlo a cabo, pero antes de ponerme a estudiar el tema quería saber si va a ser posible en Gambas.<br />
<br />
Saludos]]></description>
			<content:encoded><![CDATA[Hola gente, alguien a tenido experiencia con la implementación de un chat interno en una aplicación multiusuario, utilizando una base de datos?<br />
<br />
Analizo la posibilidad de llevarlo a cabo, pero antes de ponerme a estudiar el tema quería saber si va a ser posible en Gambas.<br />
<br />
Saludos]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Instalar aplicación en máquinas de clientes (alumnos)]]></title>
			<link>https://gambas-es.org/thread-1935.html</link>
			<pubDate>Fri, 18 Apr 2025 03:05:26 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=41">alberto-moyano</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1935.html</guid>
			<description><![CDATA[Este posteo es para compartir un modelo de trabajo instalando aplicaciones hechas con Gambas.<br />
<br />
Estoy dando un curso de edición ramificada basada en lenguaje de marcas con LaTeX en la UBA y los alumnos (39) tienen que instalar diferentes aplicaciones, esto incluye mi desarrollo en gambas, se instalaron sin problemas todas menos mi desarrollo, lo que fue un fiasco, se supone que al instalarse las aplicaciones, el instalador «lee» todos los componentes necesarios y los instala, pero por algún motivo solo instala algunos (el runtime y algunos más), desconozco que hace para decidir que instala y que no, la cuestión es que encontré una salida, que no es común, pero funciona 100% efectiva.<br />
<br />
Hice un script (se corre con sudo su) en bash que lee que distro esta corriendo e instala todos los componentes que están listados, luego se puede instalar la app de gambas con 0 error, les comparto el script<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/bin/bash<br />
<br />
# Lista de componentes que necesita el programa<br />
COMPONENTES=(<br />
    gambas3-runtime<br />
    gambas3-gb-db<br />
    gambas3-gb-db-sqlite3<br />
    gambas3-gb-dbus<br />
    gambas3-gb-desktop<br />
    gambas3-gb-form<br />
    gambas3-gb-form-dialog<br />
    gambas3-gb-form-terminal<br />
    gambas3-gb-image<br />
    gambas3-gb-inotify<br />
    gambas3-gb-net<br />
   gambas3-gb-net-curl<br />
   gambas3-gb-qt5<br />
   gambas3-gb-qt5-ext<br />
   gambas3-gb-qt5-webview<br />
   gambas3-gb-settings<br />
   gambas3-gb-term<br />
   gambas3-gb-util<br />
   gambas3-gb-util-web<br />
)<br />
<br />
echo "Detectando distribución..."<br />
<br />
# Detectar distribución<br />
if [ -f /etc/os-release ]; then<br />
    . /etc/os-release<br />
    DISTRO=&#36;ID<br />
else<br />
    echo "No se pudo detectar la distribución. Instalación cancelada."<br />
    exit 1<br />
fi<br />
<br />
# Función para instalar componentes si no están instalados<br />
instalar_si_faltan() {<br />
    local comando_check=&#36;1<br />
    local comando_instalar=&#36;2<br />
<br />
    for comp in "&#36;{COMPONENTES[@]}"; do<br />
        if ! eval "&#36;comando_check &#36;comp" &amp;&gt;/dev/null; then<br />
            echo "Instalando &#36;comp..."<br />
            eval "&#36;comando_instalar &#36;comp"<br />
        else<br />
            echo "&#36;comp ya está instalado. Omitiendo."<br />
        fi<br />
    done<br />
}<br />
<br />
# Instalar según distribución<br />
case "&#36;DISTRO" in<br />
    ubuntu|debian|linuxmint)<br />
        echo "Distribución Debian/Ubuntu/Mint detectada."<br />
        apt update<br />
        instalar_si_faltan "dpkg -s" "sudo apt install -y"<br />
        ;;<br />
<br />
    opensuse*|suse)<br />
        echo "Distribución openSUSE detectada."<br />
        instalar_si_faltan "rpm -q" "sudo zypper install -y"<br />
        ;;<br />
<br />
    fedora)<br />
        echo "Distribución Fedora detectada."<br />
        instalar_si_faltan "rpm -q" "sudo dnf install -y"<br />
        ;;<br />
<br />
    arch|manjaro)<br />
        echo "Distribución Arch/Manjaro detectada."<br />
        instalar_si_faltan "pacman -Q" "sudo pacman -S --noconfirm"<br />
        ;;<br />
<br />
    *)<br />
        echo "Distribución &#36;DISTRO no soportada automáticamente."<br />
        echo "Por favor instala manualmente los siguientes componentes:"<br />
        printf '%s&#92;n' "&#36;{COMPONENTES[@]}"<br />
        exit 1<br />
        ;;<br />
esac<br />
<br />
echo "Todos los componentes de Gambas han sido verificados e instalados según necesidad."</code></div></div>]]></description>
			<content:encoded><![CDATA[Este posteo es para compartir un modelo de trabajo instalando aplicaciones hechas con Gambas.<br />
<br />
Estoy dando un curso de edición ramificada basada en lenguaje de marcas con LaTeX en la UBA y los alumnos (39) tienen que instalar diferentes aplicaciones, esto incluye mi desarrollo en gambas, se instalaron sin problemas todas menos mi desarrollo, lo que fue un fiasco, se supone que al instalarse las aplicaciones, el instalador «lee» todos los componentes necesarios y los instala, pero por algún motivo solo instala algunos (el runtime y algunos más), desconozco que hace para decidir que instala y que no, la cuestión es que encontré una salida, que no es común, pero funciona 100% efectiva.<br />
<br />
Hice un script (se corre con sudo su) en bash que lee que distro esta corriendo e instala todos los componentes que están listados, luego se puede instalar la app de gambas con 0 error, les comparto el script<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>#!/bin/bash<br />
<br />
# Lista de componentes que necesita el programa<br />
COMPONENTES=(<br />
    gambas3-runtime<br />
    gambas3-gb-db<br />
    gambas3-gb-db-sqlite3<br />
    gambas3-gb-dbus<br />
    gambas3-gb-desktop<br />
    gambas3-gb-form<br />
    gambas3-gb-form-dialog<br />
    gambas3-gb-form-terminal<br />
    gambas3-gb-image<br />
    gambas3-gb-inotify<br />
    gambas3-gb-net<br />
   gambas3-gb-net-curl<br />
   gambas3-gb-qt5<br />
   gambas3-gb-qt5-ext<br />
   gambas3-gb-qt5-webview<br />
   gambas3-gb-settings<br />
   gambas3-gb-term<br />
   gambas3-gb-util<br />
   gambas3-gb-util-web<br />
)<br />
<br />
echo "Detectando distribución..."<br />
<br />
# Detectar distribución<br />
if [ -f /etc/os-release ]; then<br />
    . /etc/os-release<br />
    DISTRO=&#36;ID<br />
else<br />
    echo "No se pudo detectar la distribución. Instalación cancelada."<br />
    exit 1<br />
fi<br />
<br />
# Función para instalar componentes si no están instalados<br />
instalar_si_faltan() {<br />
    local comando_check=&#36;1<br />
    local comando_instalar=&#36;2<br />
<br />
    for comp in "&#36;{COMPONENTES[@]}"; do<br />
        if ! eval "&#36;comando_check &#36;comp" &amp;&gt;/dev/null; then<br />
            echo "Instalando &#36;comp..."<br />
            eval "&#36;comando_instalar &#36;comp"<br />
        else<br />
            echo "&#36;comp ya está instalado. Omitiendo."<br />
        fi<br />
    done<br />
}<br />
<br />
# Instalar según distribución<br />
case "&#36;DISTRO" in<br />
    ubuntu|debian|linuxmint)<br />
        echo "Distribución Debian/Ubuntu/Mint detectada."<br />
        apt update<br />
        instalar_si_faltan "dpkg -s" "sudo apt install -y"<br />
        ;;<br />
<br />
    opensuse*|suse)<br />
        echo "Distribución openSUSE detectada."<br />
        instalar_si_faltan "rpm -q" "sudo zypper install -y"<br />
        ;;<br />
<br />
    fedora)<br />
        echo "Distribución Fedora detectada."<br />
        instalar_si_faltan "rpm -q" "sudo dnf install -y"<br />
        ;;<br />
<br />
    arch|manjaro)<br />
        echo "Distribución Arch/Manjaro detectada."<br />
        instalar_si_faltan "pacman -Q" "sudo pacman -S --noconfirm"<br />
        ;;<br />
<br />
    *)<br />
        echo "Distribución &#36;DISTRO no soportada automáticamente."<br />
        echo "Por favor instala manualmente los siguientes componentes:"<br />
        printf '%s&#92;n' "&#36;{COMPONENTES[@]}"<br />
        exit 1<br />
        ;;<br />
esac<br />
<br />
echo "Todos los componentes de Gambas han sido verificados e instalados según necesidad."</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Mostrar Tablas y sus registros]]></title>
			<link>https://gambas-es.org/thread-1894.html</link>
			<pubDate>Sun, 16 Mar 2025 12:01: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-1894.html</guid>
			<description><![CDATA[Buenas!.<br />
<br />
Quizás deba mejor mostrar esto en el foro de bases de datos. <img src="https://gambas-es.org/images/smilies/huh.png" alt="Huh" title="Huh" class="smilie smilie_17" /> <br />
<br />
He creado un ejemplo para mostrar las tablas de una base de datos y sus registros.<br />
Se puede seleccionar el archivo en concreto y ver en un GridView como es la tabla en cuestión.<br />
<br />
<a href="https://i.imgur.com/6lmePEH.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/6lmePEHl.png" loading="lazy"  alt="[Imagen: 6lmePEHl.png]" class="mycode_img" /></a><br />
<br />
He probado con distintos archivos de distintos tamaños.<br />
<br />
¿ Qué hacéis cuando la base de datos es enorme ?.<br />
<br />
En este ejemplo observo dos cosas. Imaginar una base de datos que contiene muchos registros.<br />
A la hora de seleccionar en el combobox la tabla en concreto,si esta tiene muchos registros<span style="font-weight: bold;" class="mycode_b"> hay una demora</span>,<br />
en mostrar el nombre de la tabla tanto en el combobox como en el gridview.<br />
<br />
El efecto es, ves la lista de tablas en el combobox, seleccionas y hasta que no se muestra la tabla en el gridview<br />
no se muestra el nuevo cambio de item en el combobox.<br />
<br />
He probado con un base de 40K registros y se nota. Siempre se nota esto si la base contiene muchos registros.<br />
He probado con la base de los libros que se ha compartido por febrero. Esta tiene tres tablas, hay una que<br />
se llama "fondo" que en este ejemplo le cuesta muuuuucho mostrar, <span style="font-weight: bold;" class="mycode_b">se muestra el reloj varias veces </span>y desistí.<br />
<br />
 ¿ Cómo solucionáis esas situaciones ?<br />
<br />
Estamos hablando de que la tabla fondos de la base libro tiene alrededor de 300K registros... <img src="https://gambas-es.org/images/smilies/rolleyes.png" alt="Rolleyes" title="Rolleyes" class="smilie smilie_6" /> <br />
<br />
<hr class="mycode_hr" />
Ah, no he añadido ordenar las columnas. Estoy usando el evento Data para mostrar los registros en el gridview. <br />
Sobre todo si son muchos.<br />
<br />
<hr class="mycode_hr" />
Para el retardo del cambio de item a mostrar en el combobox he usado esto:<br />
<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Sub cmbTablas_Click()<br />
<br />
  Wait 0.1<br />
  MostrarTablaEnGridView(cmbTablas.Current.Text)<br />
<br />
End</code></div></div><br />
Eso parece funcionar, otra es muy distinta el tiempo que se tarde en mostrar los registros en el GridView<br />
<br />
Saludos<br />
<hr class="mycode_hr" />
1:50'' para mostrar la tabla Fondos.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=531" target="_blank" title="">EjemploBrowserBaseSqlite-0.0.1.tar.gz</a> (Tamaño: <span class="text-dark">10.56 KB</span> Descargas: <span class="text-dark">2)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Buenas!.<br />
<br />
Quizás deba mejor mostrar esto en el foro de bases de datos. <img src="https://gambas-es.org/images/smilies/huh.png" alt="Huh" title="Huh" class="smilie smilie_17" /> <br />
<br />
He creado un ejemplo para mostrar las tablas de una base de datos y sus registros.<br />
Se puede seleccionar el archivo en concreto y ver en un GridView como es la tabla en cuestión.<br />
<br />
<a href="https://i.imgur.com/6lmePEH.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/6lmePEHl.png" loading="lazy"  alt="[Imagen: 6lmePEHl.png]" class="mycode_img" /></a><br />
<br />
He probado con distintos archivos de distintos tamaños.<br />
<br />
¿ Qué hacéis cuando la base de datos es enorme ?.<br />
<br />
En este ejemplo observo dos cosas. Imaginar una base de datos que contiene muchos registros.<br />
A la hora de seleccionar en el combobox la tabla en concreto,si esta tiene muchos registros<span style="font-weight: bold;" class="mycode_b"> hay una demora</span>,<br />
en mostrar el nombre de la tabla tanto en el combobox como en el gridview.<br />
<br />
El efecto es, ves la lista de tablas en el combobox, seleccionas y hasta que no se muestra la tabla en el gridview<br />
no se muestra el nuevo cambio de item en el combobox.<br />
<br />
He probado con un base de 40K registros y se nota. Siempre se nota esto si la base contiene muchos registros.<br />
He probado con la base de los libros que se ha compartido por febrero. Esta tiene tres tablas, hay una que<br />
se llama "fondo" que en este ejemplo le cuesta muuuuucho mostrar, <span style="font-weight: bold;" class="mycode_b">se muestra el reloj varias veces </span>y desistí.<br />
<br />
 ¿ Cómo solucionáis esas situaciones ?<br />
<br />
Estamos hablando de que la tabla fondos de la base libro tiene alrededor de 300K registros... <img src="https://gambas-es.org/images/smilies/rolleyes.png" alt="Rolleyes" title="Rolleyes" class="smilie smilie_6" /> <br />
<br />
<hr class="mycode_hr" />
Ah, no he añadido ordenar las columnas. Estoy usando el evento Data para mostrar los registros en el gridview. <br />
Sobre todo si son muchos.<br />
<br />
<hr class="mycode_hr" />
Para el retardo del cambio de item a mostrar en el combobox he usado esto:<br />
<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>Public Sub cmbTablas_Click()<br />
<br />
  Wait 0.1<br />
  MostrarTablaEnGridView(cmbTablas.Current.Text)<br />
<br />
End</code></div></div><br />
Eso parece funcionar, otra es muy distinta el tiempo que se tarde en mostrar los registros en el GridView<br />
<br />
Saludos<br />
<hr class="mycode_hr" />
1:50'' para mostrar la tabla Fondos.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=531" target="_blank" title="">EjemploBrowserBaseSqlite-0.0.1.tar.gz</a> (Tamaño: <span class="text-dark">10.56 KB</span> Descargas: <span class="text-dark">2)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Un editor de Risa para editar RichText]]></title>
			<link>https://gambas-es.org/thread-1880.html</link>
			<pubDate>Mon, 03 Mar 2025 17:16:25 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=4">Shordi</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1880.html</guid>
			<description><![CDATA[Aquí tenéis el enlace a un editor de Richtext que he hecho para mi uso personal. La única novedad es que tiene un interfaz clásico.<br />
Lo he llamado Risa (Richtext Intuitivo Sencillo y Asequible)<br />
<br />
Este es el enlace donde lo presento. En la descripción del vídeo tenéis el enlace al código.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/glm_Gm4spf8" frameborder="0" allowfullscreen="true"></iframe>]]></description>
			<content:encoded><![CDATA[Aquí tenéis el enlace a un editor de Richtext que he hecho para mi uso personal. La única novedad es que tiene un interfaz clásico.<br />
Lo he llamado Risa (Richtext Intuitivo Sencillo y Asequible)<br />
<br />
Este es el enlace donde lo presento. En la descripción del vídeo tenéis el enlace al código.<br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/glm_Gm4spf8" frameborder="0" allowfullscreen="true"></iframe>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Gambas + ERP = GamERP.]]></title>
			<link>https://gambas-es.org/thread-1856.html</link>
			<pubDate>Mon, 10 Feb 2025 19:47:50 +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-1856.html</guid>
			<description><![CDATA[Hola,<br />
<br />
Nuevamente voy a intentar hacer algo con gambas webforms, también con sockets, para evitar los bloqueos de la base de datos, pero también para separar los proyectos y poder colaborar con mas programadores.<br />
Comunicar dos o mas programas cliente con uno servidor que sera el que gestione la lógica con la base de datos.<br />
Los clientes pueden ser GUI, Web, terminal?.<br />
Ya tengo una base de datos mas o menos decente y funcionando en SQLite.<br />
Si alguien esta interesado en participar de un proyecto, que estará desde el comienzo dividido en partes, es bienvenido.<br />
Me gustaría poder disponer de un ERP hecho en gambas y un cliente web también hecho en Gambas, en su momento Jesús se mostró interesado en hacer el cliente con Flutter, pero yo no seguí con el tema por falta de tiempo y tengo el curso de Flutter a medias.<br />
Hara falta:<br />
<ul class="mycode_list"><li>Hacer un ejemplo funcional de comunicaciones con socket que se pueda pasar luego al "GAMERP" y ya esta me salio un nombre sobre la marcha. <img src="https://gambas-es.org/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
</li>
<li>Crear una formulario web (en gambas o en otra tecnología) para Login, Registrarse, enviar datos de contacto, etc.<br />
</li>
<li>Mas cosas seguramente.<br />
</li>
</ul>
<br />
Saludos.]]></description>
			<content:encoded><![CDATA[Hola,<br />
<br />
Nuevamente voy a intentar hacer algo con gambas webforms, también con sockets, para evitar los bloqueos de la base de datos, pero también para separar los proyectos y poder colaborar con mas programadores.<br />
Comunicar dos o mas programas cliente con uno servidor que sera el que gestione la lógica con la base de datos.<br />
Los clientes pueden ser GUI, Web, terminal?.<br />
Ya tengo una base de datos mas o menos decente y funcionando en SQLite.<br />
Si alguien esta interesado en participar de un proyecto, que estará desde el comienzo dividido en partes, es bienvenido.<br />
Me gustaría poder disponer de un ERP hecho en gambas y un cliente web también hecho en Gambas, en su momento Jesús se mostró interesado en hacer el cliente con Flutter, pero yo no seguí con el tema por falta de tiempo y tengo el curso de Flutter a medias.<br />
Hara falta:<br />
<ul class="mycode_list"><li>Hacer un ejemplo funcional de comunicaciones con socket que se pueda pasar luego al "GAMERP" y ya esta me salio un nombre sobre la marcha. <img src="https://gambas-es.org/images/smilies/biggrin.png" alt="Big Grin" title="Big Grin" class="smilie smilie_4" /><br />
</li>
<li>Crear una formulario web (en gambas o en otra tecnología) para Login, Registrarse, enviar datos de contacto, etc.<br />
</li>
<li>Mas cosas seguramente.<br />
</li>
</ul>
<br />
Saludos.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[SQLite - Programa en Gambas par crear y manipular, automáticamente.]]></title>
			<link>https://gambas-es.org/thread-1851.html</link>
			<pubDate>Mon, 03 Feb 2025 19:19:16 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=40">seta43</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1851.html</guid>
			<description><![CDATA[Quería crear una base de datos en Gambas, y me di cuenta que era algo tedioso crear el archivo SQLite, para mas tarde crear el programa para manejar la base de datos.<br />
Se me vino la idea de crear un programa generador de una base de datos y a la vez el programa gráfico en gambas para interactuar con la base de datos.<br />
<br />
<a href="https://i.imgur.com/KGZJyPb.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/KGZJyPbl.png" loading="lazy"  alt="[Imagen: KGZJyPbl.png]" class="mycode_img" /></a><br />
<br />
<a href="https://i.imgur.com/wJ5Fmq9.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/wJ5Fmq9l.png" loading="lazy"  alt="[Imagen: wJ5Fmq9l.png]" class="mycode_img" /></a><br />
<br />
<a href="http://seta43.duckdns.org/makedb/makedb.html" target="_blank" rel="noopener" class="mycode_url">http://seta43.duckdns.org/makedb/makedb.html</a><br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/nae76ozYuoU" frameborder="0" allowfullscreen="true"></iframe>]]></description>
			<content:encoded><![CDATA[Quería crear una base de datos en Gambas, y me di cuenta que era algo tedioso crear el archivo SQLite, para mas tarde crear el programa para manejar la base de datos.<br />
Se me vino la idea de crear un programa generador de una base de datos y a la vez el programa gráfico en gambas para interactuar con la base de datos.<br />
<br />
<a href="https://i.imgur.com/KGZJyPb.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/KGZJyPbl.png" loading="lazy"  alt="[Imagen: KGZJyPbl.png]" class="mycode_img" /></a><br />
<br />
<a href="https://i.imgur.com/wJ5Fmq9.png" target="_blank" rel="noopener" class="mycode_url"><img src="https://i.imgur.com/wJ5Fmq9l.png" loading="lazy"  alt="[Imagen: wJ5Fmq9l.png]" class="mycode_img" /></a><br />
<br />
<a href="http://seta43.duckdns.org/makedb/makedb.html" target="_blank" rel="noopener" class="mycode_url">http://seta43.duckdns.org/makedb/makedb.html</a><br />
<br />
<iframe width="560" height="315" src="//www.youtube-nocookie.com/embed/nae76ozYuoU" frameborder="0" allowfullscreen="true"></iframe>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Obtener los eventos de controles creados en otra parte pero colocados en el formular.]]></title>
			<link>https://gambas-es.org/thread-1832.html</link>
			<pubDate>Fri, 03 Jan 2025 10:48:31 +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-1832.html</guid>
			<description><![CDATA[Hola,<br />
<br />
Cuando los controles se crean en un módulo, no en el formulario principal, pero luego estos son colocados en un panel en el formulario principal ¿Cuál es la forma de obtener los eventos en estos controles en el formulario?<br />
<br />
Gracias.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=521" target="_blank" title="">sample-controls-by-code-0.0.1.tar.gz</a> (Tamaño: <span class="text-dark">7.86 KB</span> Descargas: <span class="text-dark">1)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hola,<br />
<br />
Cuando los controles se crean en un módulo, no en el formulario principal, pero luego estos son colocados en un panel en el formulario principal ¿Cuál es la forma de obtener los eventos en estos controles en el formulario?<br />
<br />
Gracias.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=521" target="_blank" title="">sample-controls-by-code-0.0.1.tar.gz</a> (Tamaño: <span class="text-dark">7.86 KB</span> Descargas: <span class="text-dark">1)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Editor de Temas y colores]]></title>
			<link>https://gambas-es.org/thread-1803.html</link>
			<pubDate>Thu, 03 Oct 2024 18:44:26 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=105">Harpo</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-1803.html</guid>
			<description><![CDATA[Saludos,<br />
<br />
Les traigo una pequeña aplicación que he desarrollado para editar temas de Gambas, por si a alguien le es de utilidad. Estaba con un editor de ficheros SVG y el editor de Gambas no tiene definido ese formato, lo más parecido es HTML. Y en Gnome en modo oscuro se visualiza muy mal. Así que me puse a investigar como cambiarlo.<br />
<br />
Para quien el interese, el editor de Gambas (gb.form.editor) tiene dos propiedades:<ul class="mycode_list"><li>Mode: cómo identifica el código.<br />
</li>
<li>Highlight: como formatea el código, colores, tipo de letra.<br />
</li>
</ul>
En ambos casos hay una lista predefinida: Gambas - HTML - CCS - SQL - ....<br />
<br />
Todo lo relativo al formateo de código está en el componente gb.Highlight. Dentro tenemos 3 clases:<ul class="mycode_list"><li>TextHighlighter: la clase padre de todos los formateadores de código, es estática. Y contiene las palabras claves (States) y su formato.<br />
</li>
</ul>
Por ejemplo el siguiente código lista todos los estados de todos los TextHighlighters:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>   Dim sHighLighter, sState As String<br />
<br />
   For Each sHighLighter In TextHighlighter.List<br />
      For Each sState In TextHighlighter[sHighLighter].States<br />
         Debug sHighLighter &amp; "." &amp; sState<br />
      Next<br />
   Next<br />
<br />
' Salida HTML<br />
' html.Attribute<br />
' html.Comment<br />
' html.Doctype<br />
' html.Entity<br />
' html.Markup<br />
' html.Normal<br />
' html.Value</code></div></div><ul class="mycode_list"><li>TextHighlighterStyle: Es la clase que define el estilo usado para pintar los States,<br />
</li>
<li>TextHighlighterTheme: Unifica los anteriores, un tema básicamente es un conjunto de estilos:<br />
</li>
</ul>
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>[Gambas Highlighting Theme 1.0]<br />
Attribute="#FFFFFF,Bold"<br />
Comment="#33D17A"<br />
Doctype="#929291,Bold"<br />
Entity="#E67E22,Bold"<br />
Markup="#99C1F1,Bold"<br />
Normal="#FFFFFF"<br />
Value="#F5C211"<br />
Background="#494949"</code></div></div><br />
Y aclarado lo anterior, la aplicación. Es un 3 en 1.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Editor de Temas</span>, tiene dos áreas:<ul class="mycode_list"><li>En la parte superior<ul class="mycode_list"><li>Un ComboBox para seleccionar el Highlighter y un CheckBox para incluir todos los estados definidos, no solo los del Highlighter seleccionado.<br />
</li>
<li>Un ColumnView con los estilos de base, en negrita y subrayado los estilos propios del Highlighter seleccionado.<br />
</li>
<li>Un segundo ColumnView con los estilos que queremos en el nuevo tema.<br />
</li>
<li>Una columna de botones para mover estilos entre los dos ColumnView<br />
</li>
<li>Unos controles a la derecha para cambiar los estilos del nuevo tema: color y tipos de letra.<br />
</li>
<li>3 botones: para probar el nuevo tema en el editor de abajo, para guardar el tema y para cargar un fichero con la definición de un tema.<br />
</li>
</ul>
</li>
<li>En la parte inferior un editor y un FileBox para cargar ficheros en el editor.<br />
</li>
</ul>
<img src="https://i.imgur.com/p6S8QTY.png" loading="lazy"  alt="[Imagen: p6S8QTY.png]" class="mycode_img" /><img src="https://i.imgur.com/bHsoDT8.png" loading="lazy"  alt="[Imagen: bHsoDT8.png]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Colores</span>, básicamente es un selector de colores y dos utilidades: <span style="font-style: italic;" class="mycode_i">Color Merge</span> y <span style="font-style: italic;" class="mycode_i">SetAlpha</span>. El código de Gambas usa esas dos funciones muy habitualmente y siempre estaba probando números. Una observación, el selector de colores de este formulario se actualiza cuando seleccionamos un elemento en cualquiera de los dos ColumnView del formulario anterior. Para ello usa una clase <span style="font-style: italic;" class="mycode_i">Dictionary</span>, un <span style="font-style: italic;" class="mycode_i">Collection</span> con eventos y algunas cosas más.<br />
<br />
<img src="https://i.imgur.com/APfPYCC.png" loading="lazy"  alt="[Imagen: APfPYCC.png]" class="mycode_img" /><br />
<br />
Palette. Un generador de paletas de colores usando <a href="https://gambaswiki.org/wiki/comp/gb.image/color/hsv" target="_blank" rel="noopener" class="mycode_url">Color.HSV</a>. Se selecciona el valor del Spinbox de arriba a la izquierda y pulsando el botón de debajo genera la paleta en un GridView. Abajo a la derecha es lo mismo pero pudiendo modificar tres parametros: HUE - Saturación - Valor.<br />
<img src="https://i.imgur.com/HQ6UV0s.png" loading="lazy"  alt="[Imagen: HQ6UV0s.png]" class="mycode_img" /><br />
<br />
Clase <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">Dictionary</span></span>. En ocasiones hecho de menos poder añadir información a una clase Collection, además de el par Key-Value y de ahí que haya desarrollado esta clase.<br />
Deriva de Collection pero no usa herencia, reimplementa la clase. En vez de usar un Variant para Value usa una clase _Dictionary_Item, un Variant[2].<br />
Las diferencias son las siguientes:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>   Dim hCol As Collection<br />
   Dim hDict As Dictionary<br />
   Dim hItem As _Dictionary_Item<br />
   <br />
   Dim sKey As String<br />
   Dim vValue, vAttrib As Variant<br />
   <br />
   ''Asignar valor: _put<br />
   hCol[sKey] = vValue      'Collection<br />
   hCol.Add(vValue, sKey)<br />
   <br />
   hDict[sKey] = vValue         'Dictionary<br />
   hDict[sKey].Attrib = vAttrib<br />
   hDict.Add(vValue, sKey, vAttrib)<br />
   <br />
   'Esto no funciona!!<br />
   With hDict[sKey]<br />
      .Value = vValue<br />
      .Attrib = vAttrib<br />
   End With<br />
   <br />
   ''Leer valor: _get<br />
   vValue = hCol[sKey]        'Collection<br />
   <br />
   hItem = hDict[sKey]    'Dictionary devuelve un objeto _Dictionary_Item<br />
   vValue = hDict[sKey].Value<br />
   vAttrib = hDict[sKey].Attrib<br />
   <br />
'<br />
   With hDict[sKey]<br />
      vValue = .Value<br />
      vAttrib = .Attrib<br />
   End With<br />
<br />
   ''Bucle lectura<br />
   For Each vValue In hCol<br />
      '.....<br />
   Next    <br />
   For Each hCol<br />
      '.....<br />
   Next<br />
   <br />
   For Each hItem In hDict<br />
      '.....<br />
   Next<br />
   For Each hDict<br />
      '.....<br />
   Next<br />
   For Each sKey In hDict.Keys<br />
      '.....<br />
   Next</code></div></div><hr class="mycode_hr" />
Y el proyecto con el programa. Espero que les sea de utilidad.<br />
Un saludo, Harpo.<br />
<hr class="mycode_hr" />
Una última observación sobre la clase Dictionary, tiene dos eventos:<ul class="mycode_list"><li><span style="font-style: italic;" class="mycode_i">Event Change(Key As String, Modify As Boolean)</span><br />
</li>
<li><span style="font-style: italic;" class="mycode_i">Event Remove(Key As String)</span><br />
</li>
</ul>
Y funciona como cualquier evento:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>cThemeColors = New Dictionary As "ThemeColors"<br />
<br />
Public Sub ThemeColors_Change(Key As String, Modify As Boolean)      ''Dictionary event<br />
<br />
   ' Se dispara al añadir un elemento al Dictionary o modificarlo.<br />
<br />
End</code></div></div><hr class="mycode_hr" />
Y una última observación, la clase Dictionary también emula a una JSONCollection, admite nulos. Por otro lado importa y exporta JSON:<ul class="mycode_list"><li>Public Sub FromString(JSONString As String)     ''Load Dictionary from JSON string<br />
</li>
<li>Public Sub JSONLoad(JSONFile As String)      ''Load Dictionary from JSON file<br />
</li>
<li>Public Function ToString(Optional Indent As Boolean) As String             ''Export Dictionary to JSON string,<br />
</li>
<li>Public Function JSONSave(JSONFile As String, Optional Indent As Boolean) As Boolean   ''Save Dictionary to JSON file.<br />
</li>
</ul>
El Indent de las funciones no tiene relevancia, siempre indenta las cadenas o ficheros.<br />
<br />
Y agradecimientos, parte importante del código no es mio. La función para formatear JSON es autoria de Tincho sino recuerdo mal. Las funciones para convertir colores de Shordi. Gracias a los maestros.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=517" target="_blank" title="">Colors-1.0.6.tar.gz</a> (Tamaño: <span class="text-dark">39.56 KB</span> Descargas: <span class="text-dark">3)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Saludos,<br />
<br />
Les traigo una pequeña aplicación que he desarrollado para editar temas de Gambas, por si a alguien le es de utilidad. Estaba con un editor de ficheros SVG y el editor de Gambas no tiene definido ese formato, lo más parecido es HTML. Y en Gnome en modo oscuro se visualiza muy mal. Así que me puse a investigar como cambiarlo.<br />
<br />
Para quien el interese, el editor de Gambas (gb.form.editor) tiene dos propiedades:<ul class="mycode_list"><li>Mode: cómo identifica el código.<br />
</li>
<li>Highlight: como formatea el código, colores, tipo de letra.<br />
</li>
</ul>
En ambos casos hay una lista predefinida: Gambas - HTML - CCS - SQL - ....<br />
<br />
Todo lo relativo al formateo de código está en el componente gb.Highlight. Dentro tenemos 3 clases:<ul class="mycode_list"><li>TextHighlighter: la clase padre de todos los formateadores de código, es estática. Y contiene las palabras claves (States) y su formato.<br />
</li>
</ul>
Por ejemplo el siguiente código lista todos los estados de todos los TextHighlighters:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>   Dim sHighLighter, sState As String<br />
<br />
   For Each sHighLighter In TextHighlighter.List<br />
      For Each sState In TextHighlighter[sHighLighter].States<br />
         Debug sHighLighter &amp; "." &amp; sState<br />
      Next<br />
   Next<br />
<br />
' Salida HTML<br />
' html.Attribute<br />
' html.Comment<br />
' html.Doctype<br />
' html.Entity<br />
' html.Markup<br />
' html.Normal<br />
' html.Value</code></div></div><ul class="mycode_list"><li>TextHighlighterStyle: Es la clase que define el estilo usado para pintar los States,<br />
</li>
<li>TextHighlighterTheme: Unifica los anteriores, un tema básicamente es un conjunto de estilos:<br />
</li>
</ul>
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>[Gambas Highlighting Theme 1.0]<br />
Attribute="#FFFFFF,Bold"<br />
Comment="#33D17A"<br />
Doctype="#929291,Bold"<br />
Entity="#E67E22,Bold"<br />
Markup="#99C1F1,Bold"<br />
Normal="#FFFFFF"<br />
Value="#F5C211"<br />
Background="#494949"</code></div></div><br />
Y aclarado lo anterior, la aplicación. Es un 3 en 1.<br />
<br />
<span style="font-weight: bold;" class="mycode_b">Editor de Temas</span>, tiene dos áreas:<ul class="mycode_list"><li>En la parte superior<ul class="mycode_list"><li>Un ComboBox para seleccionar el Highlighter y un CheckBox para incluir todos los estados definidos, no solo los del Highlighter seleccionado.<br />
</li>
<li>Un ColumnView con los estilos de base, en negrita y subrayado los estilos propios del Highlighter seleccionado.<br />
</li>
<li>Un segundo ColumnView con los estilos que queremos en el nuevo tema.<br />
</li>
<li>Una columna de botones para mover estilos entre los dos ColumnView<br />
</li>
<li>Unos controles a la derecha para cambiar los estilos del nuevo tema: color y tipos de letra.<br />
</li>
<li>3 botones: para probar el nuevo tema en el editor de abajo, para guardar el tema y para cargar un fichero con la definición de un tema.<br />
</li>
</ul>
</li>
<li>En la parte inferior un editor y un FileBox para cargar ficheros en el editor.<br />
</li>
</ul>
<img src="https://i.imgur.com/p6S8QTY.png" loading="lazy"  alt="[Imagen: p6S8QTY.png]" class="mycode_img" /><img src="https://i.imgur.com/bHsoDT8.png" loading="lazy"  alt="[Imagen: bHsoDT8.png]" class="mycode_img" /><br />
<br />
<span style="font-weight: bold;" class="mycode_b">Colores</span>, básicamente es un selector de colores y dos utilidades: <span style="font-style: italic;" class="mycode_i">Color Merge</span> y <span style="font-style: italic;" class="mycode_i">SetAlpha</span>. El código de Gambas usa esas dos funciones muy habitualmente y siempre estaba probando números. Una observación, el selector de colores de este formulario se actualiza cuando seleccionamos un elemento en cualquiera de los dos ColumnView del formulario anterior. Para ello usa una clase <span style="font-style: italic;" class="mycode_i">Dictionary</span>, un <span style="font-style: italic;" class="mycode_i">Collection</span> con eventos y algunas cosas más.<br />
<br />
<img src="https://i.imgur.com/APfPYCC.png" loading="lazy"  alt="[Imagen: APfPYCC.png]" class="mycode_img" /><br />
<br />
Palette. Un generador de paletas de colores usando <a href="https://gambaswiki.org/wiki/comp/gb.image/color/hsv" target="_blank" rel="noopener" class="mycode_url">Color.HSV</a>. Se selecciona el valor del Spinbox de arriba a la izquierda y pulsando el botón de debajo genera la paleta en un GridView. Abajo a la derecha es lo mismo pero pudiendo modificar tres parametros: HUE - Saturación - Valor.<br />
<img src="https://i.imgur.com/HQ6UV0s.png" loading="lazy"  alt="[Imagen: HQ6UV0s.png]" class="mycode_img" /><br />
<br />
Clase <span style="font-style: italic;" class="mycode_i"><span style="font-weight: bold;" class="mycode_b">Dictionary</span></span>. En ocasiones hecho de menos poder añadir información a una clase Collection, además de el par Key-Value y de ahí que haya desarrollado esta clase.<br />
Deriva de Collection pero no usa herencia, reimplementa la clase. En vez de usar un Variant para Value usa una clase _Dictionary_Item, un Variant[2].<br />
Las diferencias son las siguientes:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>   Dim hCol As Collection<br />
   Dim hDict As Dictionary<br />
   Dim hItem As _Dictionary_Item<br />
   <br />
   Dim sKey As String<br />
   Dim vValue, vAttrib As Variant<br />
   <br />
   ''Asignar valor: _put<br />
   hCol[sKey] = vValue      'Collection<br />
   hCol.Add(vValue, sKey)<br />
   <br />
   hDict[sKey] = vValue         'Dictionary<br />
   hDict[sKey].Attrib = vAttrib<br />
   hDict.Add(vValue, sKey, vAttrib)<br />
   <br />
   'Esto no funciona!!<br />
   With hDict[sKey]<br />
      .Value = vValue<br />
      .Attrib = vAttrib<br />
   End With<br />
   <br />
   ''Leer valor: _get<br />
   vValue = hCol[sKey]        'Collection<br />
   <br />
   hItem = hDict[sKey]    'Dictionary devuelve un objeto _Dictionary_Item<br />
   vValue = hDict[sKey].Value<br />
   vAttrib = hDict[sKey].Attrib<br />
   <br />
'<br />
   With hDict[sKey]<br />
      vValue = .Value<br />
      vAttrib = .Attrib<br />
   End With<br />
<br />
   ''Bucle lectura<br />
   For Each vValue In hCol<br />
      '.....<br />
   Next    <br />
   For Each hCol<br />
      '.....<br />
   Next<br />
   <br />
   For Each hItem In hDict<br />
      '.....<br />
   Next<br />
   For Each hDict<br />
      '.....<br />
   Next<br />
   For Each sKey In hDict.Keys<br />
      '.....<br />
   Next</code></div></div><hr class="mycode_hr" />
Y el proyecto con el programa. Espero que les sea de utilidad.<br />
Un saludo, Harpo.<br />
<hr class="mycode_hr" />
Una última observación sobre la clase Dictionary, tiene dos eventos:<ul class="mycode_list"><li><span style="font-style: italic;" class="mycode_i">Event Change(Key As String, Modify As Boolean)</span><br />
</li>
<li><span style="font-style: italic;" class="mycode_i">Event Remove(Key As String)</span><br />
</li>
</ul>
Y funciona como cualquier evento:<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>cThemeColors = New Dictionary As "ThemeColors"<br />
<br />
Public Sub ThemeColors_Change(Key As String, Modify As Boolean)      ''Dictionary event<br />
<br />
   ' Se dispara al añadir un elemento al Dictionary o modificarlo.<br />
<br />
End</code></div></div><hr class="mycode_hr" />
Y una última observación, la clase Dictionary también emula a una JSONCollection, admite nulos. Por otro lado importa y exporta JSON:<ul class="mycode_list"><li>Public Sub FromString(JSONString As String)     ''Load Dictionary from JSON string<br />
</li>
<li>Public Sub JSONLoad(JSONFile As String)      ''Load Dictionary from JSON file<br />
</li>
<li>Public Function ToString(Optional Indent As Boolean) As String             ''Export Dictionary to JSON string,<br />
</li>
<li>Public Function JSONSave(JSONFile As String, Optional Indent As Boolean) As Boolean   ''Save Dictionary to JSON file.<br />
</li>
</ul>
El Indent de las funciones no tiene relevancia, siempre indenta las cadenas o ficheros.<br />
<br />
Y agradecimientos, parte importante del código no es mio. La función para formatear JSON es autoria de Tincho sino recuerdo mal. Las funciones para convertir colores de Shordi. Gracias a los maestros.<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/tar.png" title="GZIP Compressed File" style="height: 16px; width: 16px" border="0" alt=".gz" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=517" target="_blank" title="">Colors-1.0.6.tar.gz</a> (Tamaño: <span class="text-dark">39.56 KB</span> Descargas: <span class="text-dark">3)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
	</channel>
</rss>