<?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 - Portal]]></title>
		<link>https://gambas-es.org/</link>
		<description><![CDATA[Comunidad Gambas-es - https://gambas-es.org]]></description>
		<pubDate>Tue, 01 Sep 2026 15:25:43 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Extern: Uso de la libreria C TagLib, id3.module, libtag_c, TagLib]]></title>
			<link>https://gambas-es.org/thread-2024.html</link>
			<pubDate>Tue, 18 Aug 2026 20:28:16 +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-2024.html</guid>
			<description><![CDATA[Hola a todos,<br />
<br />
Hice una adaptacion de un ejemplo del wiki italiano de gambas [1] que muestra como usar <span style="font-weight: bold;" class="mycode_b">libtag_c</span> [2] para usarlo como una funcion que devuelve una <span style="font-style: italic;" class="mycode_i">Collection.</span><br />
Al modulo lo llame <span style="font-weight: bold;" class="mycode_b">id3.module</span><br />
<br />
[1] <a href="https://www.gambas-it.org/wiki/index.php/Estrarre_informazioni_e_TAG_da_file_audio_con_le_funzioni_esterne_del_API_di_Libtag_c" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...i_Libtag_c</a><br />
[2] <a href="https://taglib.org/" target="_blank" rel="noopener" class="mycode_url">https://taglib.org/</a><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>' Gambas module file<br />
<br />
Export<br />
Library "libtag_c"<br />
<br />
Public Struct TagLib_File<br />
  dummy As Integer<br />
End Struct<br />
<br />
Public Struct TagLib_Tag<br />
  dummy As Integer<br />
End Struct<br />
<br />
Public Struct TagLib_AudioProperties<br />
  dummy As Integer<br />
End Struct<br />
<br />
' void taglib_set_strings_unicode(BOOL unicode)<br />
' By default all strings coming into or out of TagLib's C API are in UTF8.<br />
' However, it may be desirable For TagLib To operate On Latin1(ISO - 8859 - 1) strings In which Case this should be set To FALSE.<br />
Private Extern taglib_set_strings_unicode(unicode As Boolean)<br />
<br />
' TagLib_File *taglib_file_new_type(const char *filename)<br />
' Creates a TagLib file based on &#92;a filename.<br />
Private Extern taglib_file_new(filename As String) As TagLib_File<br />
<br />
' TagLib_Tag *taglib_file_tag(const TagLib_File *file)<br />
' Returns a pointer to the tag associated with this file.<br />
Private Extern taglib_file_tag(_file As TagLib_File) As TagLib_Tag<br />
<br />
' char *taglib_tag_title(const TagLib_Tag *tag)<br />
' Returns a string with this tag's title.<br />
Private Extern taglib_tag_title(tag As TagLib_Tag) As String<br />
<br />
' char *taglib_tag_artist(const TagLib_Tag *tag)<br />
' Returns a string with this tag's artist.<br />
Private Extern taglib_tag_artist(tag As TagLib_Tag) As String<br />
<br />
' char *taglib_tag_album(const TagLib_Tag *tag)<br />
' Returns a string with this tag's album name.<br />
Private Extern taglib_tag_album(tag As TagLib_Tag) As String<br />
<br />
' unsigned int taglib_tag_year(const TagLib_Tag *tag)<br />
' Returns the tag's year or 0 if year is not set.<br />
Private Extern taglib_tag_year(tag As TagLib_Tag) As Integer<br />
<br />
' char *taglib_tag_comment(const TagLib_Tag *tag)<br />
' Returns a string with this tag's comment.<br />
Private Extern taglib_tag_comment(tag As TagLib_Tag) As String<br />
<br />
' unsigned int taglib_tag_track(const TagLib_Tag *tag)<br />
' Returns the tag's track number or 0 if track number is not set.<br />
Private Extern taglib_tag_track(tag As TagLib_Tag) As Integer<br />
<br />
'Private Extern taglib_tag_encoder(tag As TagLib_Tag) As String<br />
'Private Extern taglib_tag_volume_number(tag As TagLib_Tag) As Integer<br />
<br />
' char *taglib_tag_genre(const TagLib_Tag *tag)<br />
' Returns a string with this tag's genre.<br />
Private Extern taglib_tag_genre(tag As TagLib_Tag) As String<br />
<br />
' const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file)<br />
' Returns a pointer to the the audio properties associated with this file.<br />
Private Extern taglib_file_audioproperties(_file As TagLib_File) As TagLib_AudioProperties<br />
<br />
' int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties)<br />
' Returns the length of the file in seconds.<br />
Private Extern taglib_audioproperties_length(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties)<br />
' Returns the bitrate of the file in kb/s.<br />
Private Extern taglib_audioproperties_bitrate(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties)<br />
' Returns the sample rate of the file in Hz.<br />
Private Extern taglib_audioproperties_samplerate(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties)<br />
' Returns the number of channels in the audio stream.<br />
Private Extern taglib_audioproperties_channels(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' void taglib_tag_free_strings(void)<br />
' Frees all of the strings that have been created by the tag.<br />
Private Extern taglib_tag_free_strings()<br />
<br />
' void taglib_file_free(TagLib_File *file)<br />
' Frees and closes the file.<br />
Private Extern taglib_file_free(_file As TagLib_File)<br />
<br />
Public Function Info(fileaudio As String) As Collection<br />
<br />
  Dim fl As TagLib_File<br />
  Dim autag As TagLib_Tag<br />
  Dim auprop As TagLib_AudioProperties<br />
  '  Dim secondi, minuti As Integer<br />
  '<br />
  Dim inf As New Collection<br />
<br />
  taglib_set_strings_unicode(False)<br />
  taglib_set_strings_unicode(True)<br />
<br />
  fl = taglib_file_new(fileaudio)<br />
  If IsNull(fl) Then Error.Raise("Impossibile caricare il file audio: " &amp; fileaudio)<br />
<br />
  autag = taglib_file_tag(fl)<br />
  If IsNull(autag) Then Error.Raise("Impossibile ottenere i tag dal file audio: " &amp; fileaudio)<br />
<br />
  inf.Add(taglib_tag_album(autag), "album")<br />
  inf.Add(taglib_tag_artist(autag), "artist")<br />
  inf.Add(taglib_tag_track(autag), "track")<br />
  inf.Add(taglib_tag_title(autag), "title")<br />
  inf.Add(taglib_tag_year(autag), "year")<br />
  inf.Add(taglib_tag_genre(autag), "genre")<br />
  inf.Add(taglib_tag_comment(autag), "comment")<br />
<br />
  inf.Add(File.Ext(fileaudio), "format")<br />
<br />
  ' Mostra le proprietà del file audio:<br />
  auprop = taglib_file_audioproperties(fl)<br />
<br />
  If IsNull(auprop) Then<br />
    inf.Add(True, "audioerror")<br />
  Else<br />
    inf.Add(taglib_audioproperties_length(auprop), "length")<br />
    inf.Add(taglib_audioproperties_bitrate(auprop), "bitrate")<br />
    inf.Add(taglib_audioproperties_samplerate(auprop), "frequency")<br />
    inf.Add(taglib_audioproperties_channels(auprop), "channels")<br />
  Endif<br />
  inf.Add(taglib_tag_comment(autag), "comment")<br />
  ' Va in chiusura:<br />
  taglib_tag_free_strings()<br />
  taglib_file_free(fl)<br />
<br />
  Return inf<br />
<br />
End</code></div></div>Luego se usa de esta manera para obtener los metadatos de un archivo de audio:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>  Dim sFile As String ' Ruta dle archivo<br />
  Dim oID3 As Collection<br />
<br />
  oID3 = id3.Info(sFile)</code></div></div>]]></description>
			<content:encoded><![CDATA[Hola a todos,<br />
<br />
Hice una adaptacion de un ejemplo del wiki italiano de gambas [1] que muestra como usar <span style="font-weight: bold;" class="mycode_b">libtag_c</span> [2] para usarlo como una funcion que devuelve una <span style="font-style: italic;" class="mycode_i">Collection.</span><br />
Al modulo lo llame <span style="font-weight: bold;" class="mycode_b">id3.module</span><br />
<br />
[1] <a href="https://www.gambas-it.org/wiki/index.php/Estrarre_informazioni_e_TAG_da_file_audio_con_le_funzioni_esterne_del_API_di_Libtag_c" target="_blank" rel="noopener" class="mycode_url">https://www.gambas-it.org/wiki/index.php...i_Libtag_c</a><br />
[2] <a href="https://taglib.org/" target="_blank" rel="noopener" class="mycode_url">https://taglib.org/</a><br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>' Gambas module file<br />
<br />
Export<br />
Library "libtag_c"<br />
<br />
Public Struct TagLib_File<br />
  dummy As Integer<br />
End Struct<br />
<br />
Public Struct TagLib_Tag<br />
  dummy As Integer<br />
End Struct<br />
<br />
Public Struct TagLib_AudioProperties<br />
  dummy As Integer<br />
End Struct<br />
<br />
' void taglib_set_strings_unicode(BOOL unicode)<br />
' By default all strings coming into or out of TagLib's C API are in UTF8.<br />
' However, it may be desirable For TagLib To operate On Latin1(ISO - 8859 - 1) strings In which Case this should be set To FALSE.<br />
Private Extern taglib_set_strings_unicode(unicode As Boolean)<br />
<br />
' TagLib_File *taglib_file_new_type(const char *filename)<br />
' Creates a TagLib file based on &#92;a filename.<br />
Private Extern taglib_file_new(filename As String) As TagLib_File<br />
<br />
' TagLib_Tag *taglib_file_tag(const TagLib_File *file)<br />
' Returns a pointer to the tag associated with this file.<br />
Private Extern taglib_file_tag(_file As TagLib_File) As TagLib_Tag<br />
<br />
' char *taglib_tag_title(const TagLib_Tag *tag)<br />
' Returns a string with this tag's title.<br />
Private Extern taglib_tag_title(tag As TagLib_Tag) As String<br />
<br />
' char *taglib_tag_artist(const TagLib_Tag *tag)<br />
' Returns a string with this tag's artist.<br />
Private Extern taglib_tag_artist(tag As TagLib_Tag) As String<br />
<br />
' char *taglib_tag_album(const TagLib_Tag *tag)<br />
' Returns a string with this tag's album name.<br />
Private Extern taglib_tag_album(tag As TagLib_Tag) As String<br />
<br />
' unsigned int taglib_tag_year(const TagLib_Tag *tag)<br />
' Returns the tag's year or 0 if year is not set.<br />
Private Extern taglib_tag_year(tag As TagLib_Tag) As Integer<br />
<br />
' char *taglib_tag_comment(const TagLib_Tag *tag)<br />
' Returns a string with this tag's comment.<br />
Private Extern taglib_tag_comment(tag As TagLib_Tag) As String<br />
<br />
' unsigned int taglib_tag_track(const TagLib_Tag *tag)<br />
' Returns the tag's track number or 0 if track number is not set.<br />
Private Extern taglib_tag_track(tag As TagLib_Tag) As Integer<br />
<br />
'Private Extern taglib_tag_encoder(tag As TagLib_Tag) As String<br />
'Private Extern taglib_tag_volume_number(tag As TagLib_Tag) As Integer<br />
<br />
' char *taglib_tag_genre(const TagLib_Tag *tag)<br />
' Returns a string with this tag's genre.<br />
Private Extern taglib_tag_genre(tag As TagLib_Tag) As String<br />
<br />
' const TagLib_AudioProperties *taglib_file_audioproperties(const TagLib_File *file)<br />
' Returns a pointer to the the audio properties associated with this file.<br />
Private Extern taglib_file_audioproperties(_file As TagLib_File) As TagLib_AudioProperties<br />
<br />
' int taglib_audioproperties_length(const TagLib_AudioProperties *audioProperties)<br />
' Returns the length of the file in seconds.<br />
Private Extern taglib_audioproperties_length(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_bitrate(const TagLib_AudioProperties *audioProperties)<br />
' Returns the bitrate of the file in kb/s.<br />
Private Extern taglib_audioproperties_bitrate(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_samplerate(const TagLib_AudioProperties *audioProperties)<br />
' Returns the sample rate of the file in Hz.<br />
Private Extern taglib_audioproperties_samplerate(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' int taglib_audioproperties_channels(const TagLib_AudioProperties *audioProperties)<br />
' Returns the number of channels in the audio stream.<br />
Private Extern taglib_audioproperties_channels(audioProperties As TagLib_AudioProperties) As Integer<br />
<br />
' void taglib_tag_free_strings(void)<br />
' Frees all of the strings that have been created by the tag.<br />
Private Extern taglib_tag_free_strings()<br />
<br />
' void taglib_file_free(TagLib_File *file)<br />
' Frees and closes the file.<br />
Private Extern taglib_file_free(_file As TagLib_File)<br />
<br />
Public Function Info(fileaudio As String) As Collection<br />
<br />
  Dim fl As TagLib_File<br />
  Dim autag As TagLib_Tag<br />
  Dim auprop As TagLib_AudioProperties<br />
  '  Dim secondi, minuti As Integer<br />
  '<br />
  Dim inf As New Collection<br />
<br />
  taglib_set_strings_unicode(False)<br />
  taglib_set_strings_unicode(True)<br />
<br />
  fl = taglib_file_new(fileaudio)<br />
  If IsNull(fl) Then Error.Raise("Impossibile caricare il file audio: " &amp; fileaudio)<br />
<br />
  autag = taglib_file_tag(fl)<br />
  If IsNull(autag) Then Error.Raise("Impossibile ottenere i tag dal file audio: " &amp; fileaudio)<br />
<br />
  inf.Add(taglib_tag_album(autag), "album")<br />
  inf.Add(taglib_tag_artist(autag), "artist")<br />
  inf.Add(taglib_tag_track(autag), "track")<br />
  inf.Add(taglib_tag_title(autag), "title")<br />
  inf.Add(taglib_tag_year(autag), "year")<br />
  inf.Add(taglib_tag_genre(autag), "genre")<br />
  inf.Add(taglib_tag_comment(autag), "comment")<br />
<br />
  inf.Add(File.Ext(fileaudio), "format")<br />
<br />
  ' Mostra le proprietà del file audio:<br />
  auprop = taglib_file_audioproperties(fl)<br />
<br />
  If IsNull(auprop) Then<br />
    inf.Add(True, "audioerror")<br />
  Else<br />
    inf.Add(taglib_audioproperties_length(auprop), "length")<br />
    inf.Add(taglib_audioproperties_bitrate(auprop), "bitrate")<br />
    inf.Add(taglib_audioproperties_samplerate(auprop), "frequency")<br />
    inf.Add(taglib_audioproperties_channels(auprop), "channels")<br />
  Endif<br />
  inf.Add(taglib_tag_comment(autag), "comment")<br />
  ' Va in chiusura:<br />
  taglib_tag_free_strings()<br />
  taglib_file_free(fl)<br />
<br />
  Return inf<br />
<br />
End</code></div></div>Luego se usa de esta manera para obtener los metadatos de un archivo de audio:<br />
<br />
<div class="codeblock"><div class="title">Código:</div><div class="body" dir="ltr"><code>  Dim sFile As String ' Ruta dle archivo<br />
  Dim oID3 As Collection<br />
<br />
  oID3 = id3.Info(sFile)</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Lanzador de máquinas virtuales]]></title>
			<link>https://gambas-es.org/thread-2023.html</link>
			<pubDate>Tue, 04 Aug 2026 08:41:45 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://gambas-es.org/member.php?action=profile&uid=250">paskola</a>]]></dc:creator>
			<guid isPermaLink="false">https://gambas-es.org/thread-2023.html</guid>
			<description><![CDATA[Hola a todos, hoy en aplicaciones que nadie pidió y, que probablemente me ahorrará en promedio 3 minutos al mes, les presento una aplicación que me mantuvo ocupado un par de semanas. El propósito es sencillo: ejecutar las máquinas virtuales sin tener que entrar a VirtualBox. Sólo eso. El administrador default de VirtualBox es de por sí ya completo y buscaba tener una opción de simplemente permitiera elegir la máquina virtual y poder iniciarla o detenerla. Estoy utilizando SQLite para mantener la información de cada máquina virtual y los módulos que construí se encargan de ello. Estas son las cosas que hace:<br />
<br />
- Recabar información de las máquinas virtuales usando VBoxManage en una Shell.<br />
- Permite iniciar o detener máquinas virtuales.<br />
- Cambia el estatus de cada máquina al iniciarla o detenerla.<br />
- Permite cambiar el ícono o logo del sistema operativo de la máquina virtual.<br />
- Permite cambiar la orientación del listado de máquinas.<br />
– Sincroniza las máquinas para eliminar o agregar a la base de datos según sea el caso.<br />
<br />
Por el momento solo busca máquinas virtuales de VirtualBox porque es el hipervisor que uso normalmente uso para probar cosas en mi laptop y que después pondré en producción usando Proxmox o Hyper-V.<br />
<br />
Hay cosas que aún necesito refinar, por ejemplo la interfaz de usuario porque soy de ese selecto grupo que no puede crear una GUI decente ni aunque la vida vaya en ello.<br />
<br />
Otro bug que no he podido resolver es que cuando se ejecuta VBoxManage en una instrucción Shell toma cerca de 1 minuto para completarse pero si VirtualBox está ejecutándose la misma tarea toma solo un par de segundos.<br />
<br />
Y esa es mi historia, anexo una captura de como luce, una disculpa para los que tiene más idea de como hacer interfases bonitas. Cuando termine de resolver los bugs comparto el código si es de interés para el respetable público.<br />
<br />
Un abrazo.<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/image.png" title="PNG Image" style="height: 16px; width: 16px" border="0" alt=".png" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=594" target="_blank" title="">vboxr.png</a> (Tamaño: <span class="text-dark">30.38 KB</span> Descargas: <span class="text-dark">15)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Hola a todos, hoy en aplicaciones que nadie pidió y, que probablemente me ahorrará en promedio 3 minutos al mes, les presento una aplicación que me mantuvo ocupado un par de semanas. El propósito es sencillo: ejecutar las máquinas virtuales sin tener que entrar a VirtualBox. Sólo eso. El administrador default de VirtualBox es de por sí ya completo y buscaba tener una opción de simplemente permitiera elegir la máquina virtual y poder iniciarla o detenerla. Estoy utilizando SQLite para mantener la información de cada máquina virtual y los módulos que construí se encargan de ello. Estas son las cosas que hace:<br />
<br />
- Recabar información de las máquinas virtuales usando VBoxManage en una Shell.<br />
- Permite iniciar o detener máquinas virtuales.<br />
- Cambia el estatus de cada máquina al iniciarla o detenerla.<br />
- Permite cambiar el ícono o logo del sistema operativo de la máquina virtual.<br />
- Permite cambiar la orientación del listado de máquinas.<br />
– Sincroniza las máquinas para eliminar o agregar a la base de datos según sea el caso.<br />
<br />
Por el momento solo busca máquinas virtuales de VirtualBox porque es el hipervisor que uso normalmente uso para probar cosas en mi laptop y que después pondré en producción usando Proxmox o Hyper-V.<br />
<br />
Hay cosas que aún necesito refinar, por ejemplo la interfaz de usuario porque soy de ese selecto grupo que no puede crear una GUI decente ni aunque la vida vaya en ello.<br />
<br />
Otro bug que no he podido resolver es que cuando se ejecuta VBoxManage en una instrucción Shell toma cerca de 1 minuto para completarse pero si VirtualBox está ejecutándose la misma tarea toma solo un par de segundos.<br />
<br />
Y esa es mi historia, anexo una captura de como luce, una disculpa para los que tiene más idea de como hacer interfases bonitas. Cuando termine de resolver los bugs comparto el código si es de interés para el respetable público.<br />
<br />
Un abrazo.<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/image.png" title="PNG Image" style="height: 16px; width: 16px" border="0" alt=".png" />
<!-- end: attachment_icon -->
		
	</div>
	<div class="col align-self-center">
		<a href="attachment.php?aid=594" target="_blank" title="">vboxr.png</a> (Tamaño: <span class="text-dark">30.38 KB</span> Descargas: <span class="text-dark">15)</span>
	</div>
</div>
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[¿Cual es la mejor IA para crear codigo gambas?]]></title>
			<link>https://gambas-es.org/thread-2022.html</link>
			<pubDate>Tue, 28 Jul 2026 06:59:06 +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-2022.html</guid>
			<description><![CDATA[Hola a todos,<br />
<br />
Ayer me vi en la necesidad de crear un método para convertir datos de una colección en un archivo DXF, intente usar "chatgpt nano" pero no obtuve grandes resultados así que probé otra llamada <span style="font-weight: bold;" class="mycode_b">Claude haiku</span> [1] y el código generado funciono casi a la primera.<br />
Solo tuve que corregir algunos errores.<br />
<br />
[1] <a href="https://www.anthropic.com/news/claude-haiku-4-5" target="_blank" rel="noopener" class="mycode_url">https://www.anthropic.com/news/claude-haiku-4-5</a><br />
<br />
Saludos.]]></description>
			<content:encoded><![CDATA[Hola a todos,<br />
<br />
Ayer me vi en la necesidad de crear un método para convertir datos de una colección en un archivo DXF, intente usar "chatgpt nano" pero no obtuve grandes resultados así que probé otra llamada <span style="font-weight: bold;" class="mycode_b">Claude haiku</span> [1] y el código generado funciono casi a la primera.<br />
Solo tuve que corregir algunos errores.<br />
<br />
[1] <a href="https://www.anthropic.com/news/claude-haiku-4-5" target="_blank" rel="noopener" class="mycode_url">https://www.anthropic.com/news/claude-haiku-4-5</a><br />
<br />
Saludos.]]></content:encoded>
		</item>
	</channel>
</rss>