<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Console on while true do;</title>
    <link>https://www.danieleteti.it/categories/console/</link>
    <description>Recent content in Console on while true do;</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-US</language>
    <lastBuildDate>Mon, 04 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.danieleteti.it/categories/console/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building TUI Applications with Delphi and DMVCFramework</title>
      <link>https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/</guid>
      <description>&lt;div style=&#34;font-size: 90%; margin: 1.5rem 0; padding: 1rem; background: #e8f4f8; border-radius: 6px; display: flex; align-items: center; gap: 1rem;&#34;&gt;
&lt;span style=&#34;font-size: 1.5em;&#34;&gt;🌐&lt;/span&gt;
&lt;div&gt;
&lt;strong&gt;This article is also available in other languages:&lt;/strong&gt;&lt;br&gt;
&lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/&#34;&gt;🇮🇹 Italiano&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/&#34;&gt;🇪🇸 Español&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/&#34;&gt;🇩🇪 Deutsch&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;toc&#34;&gt;&lt;/div&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;BlogPosting&#34;,
  &#34;headline&#34;: &#34;Building TUI Applications with Delphi and DMVCFramework&#34;,
  &#34;description&#34;: &#34;How to build TUI applications in Delphi using MVCFramework.Console: colored text, interactive menus, spinners, progress bars, tables, boxes, cursor control, and keyboard input. Cross-platform, zero dependencies.&#34;,
  &#34;image&#34;: &#34;https://www.danieleteti.it/images/2026/tui-delphi/tui_hero.png&#34;,
  &#34;author&#34;: {
    &#34;@type&#34;: &#34;Person&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;,
    &#34;sameAs&#34;: [&#34;https://github.com/danieleteti&#34;, &#34;https://twitter.com/danieleteti&#34;]
  },
  &#34;publisher&#34;: {
    &#34;@type&#34;: &#34;Organization&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;logo&#34;: {
      &#34;@type&#34;: &#34;ImageObject&#34;,
      &#34;url&#34;: &#34;https://www.danieleteti.it/images/danieletetiavatar_square.png&#34;
    }
  },
  &#34;datePublished&#34;: &#34;2026-05-04&#34;,
  &#34;dateModified&#34;: &#34;2026-05-04&#34;,
  &#34;mainEntityOfPage&#34;: {
    &#34;@type&#34;: &#34;WebPage&#34;,
    &#34;@id&#34;: &#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/&#34;
  },
  &#34;keywords&#34;: &#34;Delphi, DMVCFramework, TUI, console, terminal, interactive menu, spinner, progress bar, ANSI colors, cross-platform&#34;,
  &#34;articleSection&#34;: &#34;Console&#34;,
  &#34;inLanguage&#34;: &#34;en&#34;,
  &#34;isPartOf&#34;: {
    &#34;@type&#34;: &#34;Blog&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;
  },
  &#34;about&#34;: {
    &#34;@type&#34;: &#34;SoftwareApplication&#34;,
    &#34;name&#34;: &#34;DelphiMVCFramework&#34;,
    &#34;url&#34;: &#34;https://github.com/danieleteti/delphimvcframework&#34;,
    &#34;applicationCategory&#34;: &#34;DeveloperApplication&#34;,
    &#34;operatingSystem&#34;: &#34;Windows, Linux&#34;,
    &#34;softwareVersion&#34;: &#34;3.5.0&#34;
  },
  &#34;teaches&#34;: [
    &#34;How to add colors to Delphi console applications&#34;,
    &#34;How to create interactive menus with arrow key navigation in Delphi&#34;,
    &#34;How to display progress bars and spinners in Delphi console apps&#34;,
    &#34;How to build cross-platform TUI applications with Object Pascal&#34;
  ]
}
&lt;/script&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;FAQPage&#34;,
  &#34;mainEntity&#34;: [
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Does MVCFramework.Console require the full DMVCFramework to be installed?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;No. MVCFramework.Console is self-contained with zero dependencies on the rest of the framework. You can copy MVCFramework.Console.pas into any Delphi console project and use it immediately without installing DMVCFramework packages.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Is MVCFramework.Console cross-platform?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Yes. MVCFramework.Console compiles and runs on Windows 10+ and Linux with the same API. ANSI color support is native on Linux; on Windows it is enabled automatically via EnableANSIColorConsole. UTF-8 support for box-drawing characters and emoji requires a call to EnableUTF8Console at startup.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;What Delphi version is required to use MVCFramework.Console?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;MVCFramework.Console requires Delphi 10 Seattle (D100) or later. It is included in DMVCFramework 3.5.0 Silicon and later releases.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;How do I create a non-blocking animated spinner in a Delphi console application?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Use the Spinner() function: S := Spinner(&#39;Loading data&#39;, ssDots, Cyan). The spinner runs on a background thread, so your main code continues executing. Call S.Hide (or set S := nil) to stop it. Ten animation styles are available: ssLine, ssDots, ssBounce, ssGrow, ssArrow, ssCircle, ssClock, ssEarth, ssMoon, ssWeather.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;How do I show a determinate progress bar in a Delphi console application?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Call Progress(label, maxValue): IProgress to create a progress bar. Update it in a loop with P.Update(currentValue) or P.Increment. Setting P := nil or calling P.Complete marks it as done and prints a green completion message. The bar renders as [====      ] 45% with a default width of 50 characters.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;How do I read arrow keys in a Delphi console application?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Use GetKey: Integer. Arrow keys return values above 255 (KEY_UP = 256+38, KEY_DOWN = 256+40, KEY_LEFT = 256+37, KEY_RIGHT = 256+39). Use IsSpecialKey(key) to test whether a value represents a special key. Regular printable characters return their ASCII code.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Can I change the colors and box styles of all TUI widgets at once in Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Yes. Modify the global ConsoleTheme record (type TConsoleColorStyle) before calling any widget function. Fields include TextColor, DrawColor, BackgroundHighlightColor, TextHighlightColor, and BoxStyle. All subsequent calls to Box, Menu, Table, WriteHeader, and WriteFormattedList use the updated theme.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;How do I create an interactive keyboard-navigable menu in Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Call Menu(title, items): Integer. The user navigates with arrow keys (up/down, wraps around), confirms with Enter, or cancels with Escape. The function returns the 0-based index of the selected item, or -1 on Escape. For interactive table selection, use TableMenu(title, headers, data): Integer instead.&#34;
      }
    }
  ]
}
&lt;/script&gt;
&lt;h2 id=&#34;tui-not-a-step-backwards&#34;&gt;TUI: not a step backwards&lt;/h2&gt;
&lt;p&gt;If you have been following DMVCFramework&amp;rsquo;s recent development, you already know that console applications are living a second life. In &lt;a href=&#34;https://www.danieleteti.it/post/console-colors-dmvcframework-en/&#34;&gt;the previous post on console colors&lt;/a&gt;, I introduced the low-level ANSI API — the &lt;code&gt;Fore&lt;/code&gt;, &lt;code&gt;Back&lt;/code&gt;, and &lt;code&gt;Style&lt;/code&gt; records — and the Gin-style HTTP log renderer. That was the foundation.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Construyendo aplicaciones TUI con Delphi y DMVCFramework</title>
      <link>https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/</guid>
      <description>&lt;div style=&#34;font-size: 90%; margin: 1.5rem 0; padding: 1rem; background: #e8f4f8; border-radius: 6px; display: flex; align-items: center; gap: 1rem;&#34;&gt;
&lt;span style=&#34;font-size: 1.5em;&#34;&gt;🌐&lt;/span&gt;
&lt;div&gt;
&lt;strong&gt;Este artículo también está disponible en otros idiomas:&lt;/strong&gt;&lt;br&gt;
&lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/&#34;&gt;🇮🇹 Italiano&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/&#34;&gt;🇬🇧 English&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/&#34;&gt;🇩🇪 Deutsch&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;toc&#34;&gt;&lt;/div&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;BlogPosting&#34;,
  &#34;headline&#34;: &#34;Construyendo aplicaciones TUI con Delphi y DMVCFramework&#34;,
  &#34;description&#34;: &#34;Cómo construir aplicaciones TUI en Delphi usando MVCFramework.Console: texto coloreado, menús interactivos, spinners, barras de progreso, tablas, cajas, control del cursor e input de teclado. Multiplataforma, cero dependencias.&#34;,
  &#34;image&#34;: &#34;https://www.danieleteti.it/images/2026/tui-delphi/tui_hero.png&#34;,
  &#34;author&#34;: {
    &#34;@type&#34;: &#34;Person&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;,
    &#34;sameAs&#34;: [&#34;https://github.com/danieleteti&#34;, &#34;https://twitter.com/danieleteti&#34;]
  },
  &#34;publisher&#34;: {
    &#34;@type&#34;: &#34;Organization&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;logo&#34;: {
      &#34;@type&#34;: &#34;ImageObject&#34;,
      &#34;url&#34;: &#34;https://www.danieleteti.it/images/danieletetiavatar_square.png&#34;
    }
  },
  &#34;datePublished&#34;: &#34;2026-05-04&#34;,
  &#34;dateModified&#34;: &#34;2026-05-04&#34;,
  &#34;mainEntityOfPage&#34;: {
    &#34;@type&#34;: &#34;WebPage&#34;,
    &#34;@id&#34;: &#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/&#34;
  },
  &#34;keywords&#34;: &#34;Delphi, DMVCFramework, TUI, consola, terminal, menú interactivo, spinner, barra de progreso, colores ANSI, multiplataforma&#34;,
  &#34;articleSection&#34;: &#34;Console&#34;,
  &#34;inLanguage&#34;: &#34;es&#34;,
  &#34;isPartOf&#34;: {
    &#34;@type&#34;: &#34;Blog&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;
  },
  &#34;about&#34;: {
    &#34;@type&#34;: &#34;SoftwareApplication&#34;,
    &#34;name&#34;: &#34;DelphiMVCFramework&#34;,
    &#34;url&#34;: &#34;https://github.com/danieleteti/delphimvcframework&#34;,
    &#34;applicationCategory&#34;: &#34;DeveloperApplication&#34;,
    &#34;operatingSystem&#34;: &#34;Windows, Linux&#34;,
    &#34;softwareVersion&#34;: &#34;3.5.0&#34;
  },
  &#34;teaches&#34;: [
    &#34;Cómo añadir colores a las aplicaciones de consola Delphi&#34;,
    &#34;Cómo crear menús interactivos con navegación por teclas de flecha en Delphi&#34;,
    &#34;Cómo mostrar barras de progreso y spinners en aplicaciones de consola Delphi&#34;,
    &#34;Cómo construir aplicaciones TUI multiplataforma con Object Pascal&#34;
  ]
}
&lt;/script&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;FAQPage&#34;,
  &#34;mainEntity&#34;: [
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿MVCFramework.Console requiere la instalación completa de DMVCFramework?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;No. MVCFramework.Console es autónomo y no tiene dependencias del resto del framework. Puedes copiar MVCFramework.Console.pas en cualquier proyecto de consola Delphi y usarlo inmediatamente sin instalar los paquetes de DMVCFramework.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Es MVCFramework.Console multiplataforma?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Sí. MVCFramework.Console compila y se ejecuta en Windows 10+ y Linux con la misma API. El soporte de colores ANSI es nativo en Linux; en Windows se habilita automáticamente mediante EnableANSIColorConsole. El soporte UTF-8 para caracteres de dibujo de cajas y emojis requiere una llamada a EnableUTF8Console al inicio.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Qué versión de Delphi se necesita para usar MVCFramework.Console?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;MVCFramework.Console requiere Delphi 10 Seattle (D100) o posterior. Está incluido en DMVCFramework 3.5.0 Silicon y versiones posteriores.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Cómo creo un spinner animado no bloqueante en una aplicación de consola Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Usa la función Spinner(): S := Spinner(&#39;Cargando datos&#39;, ssDots, Cyan). El spinner se ejecuta en un hilo en segundo plano, por lo que tu código principal continúa ejecutándose. Llama a S.Hide (o establece S := nil) para detenerlo. Hay diez estilos de animación disponibles: ssLine, ssDots, ssBounce, ssGrow, ssArrow, ssCircle, ssClock, ssEarth, ssMoon, ssWeather.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Cómo muestro una barra de progreso determinada en una aplicación de consola Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Llama a Progress(etiqueta, valorMax): IProgress para crear una barra de progreso. Actualízala en un bucle con P.Update(valorActual) o P.Increment. Establecer P := nil o llamar a P.Complete la marca como terminada e imprime un mensaje de finalización en verde. La barra se muestra como [====      ] 45% con un ancho predeterminado de 50 caracteres.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Cómo leo las teclas de flecha en una aplicación de consola Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Usa GetKey: Integer. Las teclas de flecha devuelven valores superiores a 255 (KEY_UP = 256+38, KEY_DOWN = 256+40, KEY_LEFT = 256+37, KEY_RIGHT = 256+39). Usa IsSpecialKey(key) para verificar si un valor representa una tecla especial. Los caracteres imprimibles normales devuelven su código ASCII.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Puedo cambiar los colores y estilos de caja de todos los widgets TUI de una vez en Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Sí. Modifica el registro global ConsoleTheme (tipo TConsoleColorStyle) antes de llamar a cualquier función widget. Los campos incluyen TextColor, DrawColor, BackgroundHighlightColor, TextHighlightColor y BoxStyle. Todas las llamadas posteriores a Box, Menu, Table, WriteHeader y WriteFormattedList usarán el tema actualizado.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;¿Cómo creo un menú interactivo navegable por teclado en Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Llama a Menu(título, elementos): Integer. El usuario navega con las teclas de flecha (arriba/abajo, con wrap-around), confirma con Enter o cancela con Escape. La función devuelve el índice 0-based del elemento seleccionado, o -1 al pulsar Escape. Para la selección interactiva de tablas, usa TableMenu(título, encabezados, datos): Integer.&#34;
      }
    }
  ]
}
&lt;/script&gt;
&lt;h2 id=&#34;tui-no-es-un-paso-atrás&#34;&gt;TUI: no es un paso atrás&lt;/h2&gt;
&lt;p&gt;Si has seguido el reciente desarrollo de DMVCFramework, ya sabes que las aplicaciones de consola están viviendo una segunda vida. En &lt;a href=&#34;https://www.danieleteti.it/post/console-colors-dmvcframework-en/&#34;&gt;el post anterior sobre colores de consola&lt;/a&gt;, introduje la API ANSI de bajo nivel — los registros &lt;code&gt;Fore&lt;/code&gt;, &lt;code&gt;Back&lt;/code&gt; y &lt;code&gt;Style&lt;/code&gt; — y el renderizador de logs HTTP estilo Gin. Esa era la base.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>Costruire applicazioni TUI con Delphi e DMVCFramework</title>
      <link>https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/</guid>
      <description>&lt;div style=&#34;font-size: 90%; margin: 1.5rem 0; padding: 1rem; background: #e8f4f8; border-radius: 6px; display: flex; align-items: center; gap: 1rem;&#34;&gt;
&lt;span style=&#34;font-size: 1.5em;&#34;&gt;🌐&lt;/span&gt;
&lt;div&gt;
&lt;strong&gt;Questo articolo è disponibile anche in altre lingue:&lt;/strong&gt;&lt;br&gt;
&lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/&#34;&gt;🇬🇧 English&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/&#34;&gt;🇪🇸 Español&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/&#34;&gt;🇩🇪 Deutsch&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;toc&#34;&gt;&lt;/div&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;BlogPosting&#34;,
  &#34;headline&#34;: &#34;Costruire applicazioni TUI con Delphi e DMVCFramework&#34;,
  &#34;description&#34;: &#34;Come costruire applicazioni TUI in Delphi usando MVCFramework.Console: testo colorato, menu interattivi, spinner, barre di avanzamento, tabelle, box, controllo del cursore e input da tastiera. Cross-platform, zero dipendenze.&#34;,
  &#34;image&#34;: &#34;https://www.danieleteti.it/images/2026/tui-delphi/tui_hero.png&#34;,
  &#34;author&#34;: {
    &#34;@type&#34;: &#34;Person&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;,
    &#34;sameAs&#34;: [&#34;https://github.com/danieleteti&#34;, &#34;https://twitter.com/danieleteti&#34;]
  },
  &#34;publisher&#34;: {
    &#34;@type&#34;: &#34;Organization&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;logo&#34;: {
      &#34;@type&#34;: &#34;ImageObject&#34;,
      &#34;url&#34;: &#34;https://www.danieleteti.it/images/danieletetiavatar_square.png&#34;
    }
  },
  &#34;datePublished&#34;: &#34;2026-05-04&#34;,
  &#34;dateModified&#34;: &#34;2026-05-04&#34;,
  &#34;mainEntityOfPage&#34;: {
    &#34;@type&#34;: &#34;WebPage&#34;,
    &#34;@id&#34;: &#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/&#34;
  },
  &#34;keywords&#34;: &#34;Delphi, DMVCFramework, TUI, console, terminale, menu interattivo, spinner, barra di avanzamento, colori ANSI, cross-platform&#34;,
  &#34;articleSection&#34;: &#34;Console&#34;,
  &#34;inLanguage&#34;: &#34;it&#34;,
  &#34;isPartOf&#34;: {
    &#34;@type&#34;: &#34;Blog&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;
  },
  &#34;about&#34;: {
    &#34;@type&#34;: &#34;SoftwareApplication&#34;,
    &#34;name&#34;: &#34;DelphiMVCFramework&#34;,
    &#34;url&#34;: &#34;https://github.com/danieleteti/delphimvcframework&#34;,
    &#34;applicationCategory&#34;: &#34;DeveloperApplication&#34;,
    &#34;operatingSystem&#34;: &#34;Windows, Linux&#34;,
    &#34;softwareVersion&#34;: &#34;3.5.0&#34;
  },
  &#34;teaches&#34;: [
    &#34;Come aggiungere colori alle applicazioni console Delphi&#34;,
    &#34;Come creare menu interattivi con navigazione a frecce in Delphi&#34;,
    &#34;Come visualizzare barre di avanzamento e spinner in applicazioni console Delphi&#34;,
    &#34;Come costruire applicazioni TUI cross-platform con Object Pascal&#34;
  ]
}
&lt;/script&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;FAQPage&#34;,
  &#34;mainEntity&#34;: [
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;MVCFramework.Console richiede l&#39;installazione completa di DMVCFramework?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;No. MVCFramework.Console è autonomo e non ha dipendenze dal resto del framework. Puoi copiare MVCFramework.Console.pas in qualsiasi progetto console Delphi e usarlo immediatamente senza installare i pacchetti DMVCFramework.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;MVCFramework.Console è cross-platform?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Sì. MVCFramework.Console compila ed esegue su Windows 10+ e Linux con la stessa API. Il supporto ai colori ANSI è nativo su Linux; su Windows viene abilitato automaticamente via EnableANSIColorConsole. Il supporto UTF-8 per i caratteri box-drawing e le emoji richiede una chiamata a EnableUTF8Console all&#39;avvio.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Quale versione di Delphi è necessaria per usare MVCFramework.Console?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;MVCFramework.Console richiede Delphi 10 Seattle (D100) o successivo. È incluso in DMVCFramework 3.5.0 Silicon e versioni successive.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Come creo uno spinner animato non bloccante in un&#39;applicazione console Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Usa la funzione Spinner(): S := Spinner(&#39;Caricamento dati&#39;, ssDots, Cyan). Lo spinner gira su un thread in background, quindi il tuo codice principale continua ad eseguire. Chiama S.Hide (o imposta S := nil) per fermarlo. Sono disponibili dieci stili di animazione: ssLine, ssDots, ssBounce, ssGrow, ssArrow, ssCircle, ssClock, ssEarth, ssMoon, ssWeather.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Come mostro una barra di avanzamento determinata in un&#39;applicazione console Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Chiama Progress(etichetta, valoreMax): IProgress per creare una barra di avanzamento. Aggiornala in un ciclo con P.Update(valoreCorrente) o P.Increment. Impostare P := nil o chiamare P.Complete la segna come completata e stampa un messaggio di completamento verde. La barra viene resa come [====      ] 45% con una larghezza predefinita di 50 caratteri.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Come leggo i tasti freccia in un&#39;applicazione console Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Usa GetKey: Integer. I tasti freccia restituiscono valori superiori a 255 (KEY_UP = 256+38, KEY_DOWN = 256+40, KEY_LEFT = 256+37, KEY_RIGHT = 256+39). Usa IsSpecialKey(key) per verificare se un valore rappresenta un tasto speciale. I caratteri stampabili normali restituiscono il loro codice ASCII.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Posso cambiare i colori e gli stili box di tutti i widget TUI in una volta sola in Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Sì. Modifica il record globale ConsoleTheme (tipo TConsoleColorStyle) prima di chiamare qualsiasi funzione widget. I campi includono TextColor, DrawColor, BackgroundHighlightColor, TextHighlightColor e BoxStyle. Tutte le chiamate successive a Box, Menu, Table, WriteHeader e WriteFormattedList useranno il tema aggiornato.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Come creo un menu interattivo navigabile da tastiera in Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Chiama Menu(titolo, voci): Integer. L&#39;utente naviga con i tasti freccia (su/giù, con wrap-around), conferma con Invio o annulla con Escape. La funzione restituisce l&#39;indice 0-based della voce selezionata, oppure -1 su Escape. Per la selezione interattiva di tabelle, usa TableMenu(titolo, intestazioni, dati): Integer.&#34;
      }
    }
  ]
}
&lt;/script&gt;
&lt;h2 id=&#34;tui-non-un-passo-indietro&#34;&gt;TUI: non un passo indietro&lt;/h2&gt;
&lt;p&gt;Se hai seguito il recente sviluppo di DMVCFramework, sai già che le applicazioni console stanno vivendo una seconda vita. Nel &lt;a href=&#34;https://www.danieleteti.it/post/console-colors-dmvcframework-en/&#34;&gt;post precedente sui colori console&lt;/a&gt;, ho introdotto le API ANSI di basso livello — i record &lt;code&gt;Fore&lt;/code&gt;, &lt;code&gt;Back&lt;/code&gt; e &lt;code&gt;Style&lt;/code&gt; — e il renderer di log HTTP in stile Gin. Quella era la fondazione.&lt;/p&gt;</description>
    </item>
    
    <item>
      <title>TUI-Anwendungen mit Delphi und DMVCFramework entwickeln</title>
      <link>https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/</link>
      <pubDate>Mon, 04 May 2026 00:00:00 +0000</pubDate>
      
      <guid>https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/</guid>
      <description>&lt;div style=&#34;font-size: 90%; margin: 1.5rem 0; padding: 1rem; background: #e8f4f8; border-radius: 6px; display: flex; align-items: center; gap: 1rem;&#34;&gt;
&lt;span style=&#34;font-size: 1.5em;&#34;&gt;🌐&lt;/span&gt;
&lt;div&gt;
&lt;strong&gt;Dieser Artikel ist auch in anderen Sprachen verfügbar:&lt;/strong&gt;&lt;br&gt;
&lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-it/&#34;&gt;🇮🇹 Italiano&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-en/&#34;&gt;🇬🇧 English&lt;/a&gt; &amp;nbsp;•&amp;nbsp; &lt;a href=&#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-es/&#34;&gt;🇪🇸 Español&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&#34;toc&#34;&gt;&lt;/div&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;BlogPosting&#34;,
  &#34;headline&#34;: &#34;TUI-Anwendungen mit Delphi und DMVCFramework entwickeln&#34;,
  &#34;description&#34;: &#34;Wie man TUI-Anwendungen in Delphi mit MVCFramework.Console erstellt: farbiger Text, interaktive Menüs, Spinner, Fortschrittsbalken, Tabellen, Boxen, Cursor-Steuerung und Tastatureingabe. Plattformübergreifend, keine Abhängigkeiten.&#34;,
  &#34;image&#34;: &#34;https://www.danieleteti.it/images/2026/tui-delphi/tui_hero.png&#34;,
  &#34;author&#34;: {
    &#34;@type&#34;: &#34;Person&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;,
    &#34;sameAs&#34;: [&#34;https://github.com/danieleteti&#34;, &#34;https://twitter.com/danieleteti&#34;]
  },
  &#34;publisher&#34;: {
    &#34;@type&#34;: &#34;Organization&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;logo&#34;: {
      &#34;@type&#34;: &#34;ImageObject&#34;,
      &#34;url&#34;: &#34;https://www.danieleteti.it/images/danieletetiavatar_square.png&#34;
    }
  },
  &#34;datePublished&#34;: &#34;2026-05-04&#34;,
  &#34;dateModified&#34;: &#34;2026-05-04&#34;,
  &#34;mainEntityOfPage&#34;: {
    &#34;@type&#34;: &#34;WebPage&#34;,
    &#34;@id&#34;: &#34;https://www.danieleteti.it/post/tui-delphi-dmvcframework-de/&#34;
  },
  &#34;keywords&#34;: &#34;Delphi, DMVCFramework, TUI, Konsole, Terminal, interaktives Menü, Spinner, Fortschrittsbalken, ANSI-Farben, plattformübergreifend&#34;,
  &#34;articleSection&#34;: &#34;Console&#34;,
  &#34;inLanguage&#34;: &#34;de&#34;,
  &#34;isPartOf&#34;: {
    &#34;@type&#34;: &#34;Blog&#34;,
    &#34;name&#34;: &#34;Daniele Teti&#39;s Blog&#34;,
    &#34;url&#34;: &#34;https://www.danieleteti.it&#34;
  },
  &#34;about&#34;: {
    &#34;@type&#34;: &#34;SoftwareApplication&#34;,
    &#34;name&#34;: &#34;DelphiMVCFramework&#34;,
    &#34;url&#34;: &#34;https://github.com/danieleteti/delphimvcframework&#34;,
    &#34;applicationCategory&#34;: &#34;DeveloperApplication&#34;,
    &#34;operatingSystem&#34;: &#34;Windows, Linux&#34;,
    &#34;softwareVersion&#34;: &#34;3.5.0&#34;
  },
  &#34;teaches&#34;: [
    &#34;Wie man Delphi-Konsolenanwendungen Farben hinzufügt&#34;,
    &#34;Wie man interaktive Menüs mit Pfeiltasten-Navigation in Delphi erstellt&#34;,
    &#34;Wie man Fortschrittsbalken und Spinner in Delphi-Konsolenanwendungen anzeigt&#34;,
    &#34;Wie man plattformübergreifende TUI-Anwendungen mit Object Pascal entwickelt&#34;
  ]
}
&lt;/script&gt;
&lt;script type=&#34;application/ld+json&#34;&gt;
{
  &#34;@context&#34;: &#34;https://schema.org&#34;,
  &#34;@type&#34;: &#34;FAQPage&#34;,
  &#34;mainEntity&#34;: [
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Erfordert MVCFramework.Console eine vollständige DMVCFramework-Installation?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Nein. MVCFramework.Console ist eigenständig und hat keine Abhängigkeiten vom Rest des Frameworks. Sie können MVCFramework.Console.pas in jedes Delphi-Konsolenprojekt kopieren und sofort verwenden, ohne DMVCFramework-Pakete zu installieren.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Ist MVCFramework.Console plattformübergreifend?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Ja. MVCFramework.Console kompiliert und läuft auf Windows 10+ und Linux mit derselben API. ANSI-Farbunterstützung ist unter Linux nativ; unter Windows wird sie automatisch über EnableANSIColorConsole aktiviert. UTF-8-Unterstützung für Box-Zeichenzeichen und Emojis erfordert einen Aufruf von EnableUTF8Console beim Start.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Welche Delphi-Version wird für MVCFramework.Console benötigt?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;MVCFramework.Console erfordert Delphi 10 Seattle (D100) oder höher. Es ist in DMVCFramework 3.5.0 Silicon und späteren Versionen enthalten.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Wie erstelle ich einen nicht-blockierenden animierten Spinner in einer Delphi-Konsolenanwendung?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Verwenden Sie die Spinner()-Funktion: S := Spinner(&#39;Daten laden&#39;, ssDots, Cyan). Der Spinner läuft auf einem Hintergrund-Thread, sodass Ihr Hauptcode weiter ausgeführt wird. Rufen Sie S.Hide auf (oder setzen Sie S := nil), um ihn zu stoppen. Zehn Animationsstile sind verfügbar: ssLine, ssDots, ssBounce, ssGrow, ssArrow, ssCircle, ssClock, ssEarth, ssMoon, ssWeather.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Wie zeige ich einen bestimmten Fortschrittsbalken in einer Delphi-Konsolenanwendung an?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Rufen Sie Progress(Beschriftung, MaxWert): IProgress auf, um einen Fortschrittsbalken zu erstellen. Aktualisieren Sie ihn in einer Schleife mit P.Update(AktuellerWert) oder P.Increment. Wenn P := nil gesetzt oder P.Complete aufgerufen wird, wird er als abgeschlossen markiert und eine grüne Abschlussmeldung ausgegeben. Der Balken wird als [====      ] 45% mit einer Standardbreite von 50 Zeichen dargestellt.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Wie lese ich Pfeiltasten in einer Delphi-Konsolenanwendung?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Verwenden Sie GetKey: Integer. Pfeiltasten geben Werte über 255 zurück (KEY_UP = 256+38, KEY_DOWN = 256+40, KEY_LEFT = 256+37, KEY_RIGHT = 256+39). Verwenden Sie IsSpecialKey(key), um zu prüfen, ob ein Wert eine Sondertaste darstellt. Reguläre druckbare Zeichen geben ihren ASCII-Code zurück.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Kann ich die Farben und Box-Stile aller TUI-Widgets auf einmal in Delphi ändern?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Ja. Ändern Sie den globalen ConsoleTheme-Record (Typ TConsoleColorStyle) bevor Sie eine Widget-Funktion aufrufen. Felder umfassen TextColor, DrawColor, BackgroundHighlightColor, TextHighlightColor und BoxStyle. Alle nachfolgenden Aufrufe von Box, Menu, Table, WriteHeader und WriteFormattedList verwenden das aktualisierte Theme.&#34;
      }
    },
    {
      &#34;@type&#34;: &#34;Question&#34;,
      &#34;name&#34;: &#34;Wie erstelle ich ein interaktives, per Tastatur navigierbares Menü in Delphi?&#34;,
      &#34;acceptedAnswer&#34;: {
        &#34;@type&#34;: &#34;Answer&#34;,
        &#34;text&#34;: &#34;Rufen Sie Menu(Titel, Einträge): Integer auf. Der Benutzer navigiert mit Pfeiltasten (hoch/runter, mit Wrap-Around), bestätigt mit Enter oder bricht mit Escape ab. Die Funktion gibt den 0-basierten Index des ausgewählten Eintrags zurück, oder -1 bei Escape. Für interaktive Tabellenauswahl verwenden Sie stattdessen TableMenu(Titel, Kopfzeilen, Daten): Integer.&#34;
      }
    }
  ]
}
&lt;/script&gt;
&lt;h2 id=&#34;tui-kein-schritt-zurück&#34;&gt;TUI: kein Schritt zurück&lt;/h2&gt;
&lt;p&gt;Wer die jüngste Entwicklung von DMVCFramework verfolgt hat, weiß bereits, dass Konsolenanwendungen eine zweite Blütezeit erleben. Im &lt;a href=&#34;https://www.danieleteti.it/post/console-colors-dmvcframework-en/&#34;&gt;vorherigen Beitrag über Konsolenfarben&lt;/a&gt; habe ich die Low-Level-ANSI-API vorgestellt — die Records &lt;code&gt;Fore&lt;/code&gt;, &lt;code&gt;Back&lt;/code&gt; und &lt;code&gt;Style&lt;/code&gt; — sowie den Gin-artigen HTTP-Log-Renderer. Das war die Grundlage.&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
