<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://hiasm.bbtalk.me/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>HiAsm - Конструктор программ</title>
		<link>https://hiasm.bbtalk.me/</link>
		<description>HiAsm - Конструктор программ</description>
		<language>ru-ru</language>
		<lastBuildDate>Sun, 15 Nov 2026 00:35:34 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>Подписываем любой файл Крипто-про sig</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=948#p948</link>
			<description>&lt;p&gt;Спасибо за подробную инструкцию, но я что-то запутался с 64-битной версией. У меня Крипто-про установлена, а HiAsm все еще 32-битный, и государство мне отказывает в подписях. Надо что-то менять в коде или просто перейти на 64-битный конструктор?&lt;/p&gt;</description>
			<author>mybb@mybb.ru (svetaina71)</author>
			<pubDate>Sun, 15 Nov 2026 00:35:34 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=948#p948</guid>
		</item>
		<item>
			<title>Несколько компонентов</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=946#p946</link>
			<description>&lt;p&gt;&lt;strong&gt;Knjaz2005&lt;/strong&gt;&lt;/p&gt;
						&lt;p&gt;1. У меня проект всех примеров пустой в среде. Не отображается ни один компонент. Даже MainForm. Вероятно проблема с кодировками. &lt;br /&gt;Эксперимент: Я взял один пример и открыл в блокноте. скопировал свойства из проекта в свой тест с компонентом - открылся.&lt;/p&gt;
						&lt;p&gt;2. Компонент FPCWebBrowser 1) выдает ошибку &amp;quot;Navigate failed: ya.ru (HRESULT $91181168)&amp;quot; после ввода сайта и нажатии кнопки Navigate. Один раз открывается указанная страница в строке url после запуска тестового примера (компилятор FPC-32/64). С версией юникод работает.&amp;#160; 2) В примере не хватает компонента &amp;quot;StyleXP&amp;quot;. С ним норм тема Dark работает.&lt;/p&gt;&lt;div class=&quot;quote-box spoiler-box&quot;&gt;&lt;div onclick=&quot;$(this).toggleClass(&#039;visible&#039;); $(this).next().toggleClass(&#039;visible&#039;);&quot;&gt;Код&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;Make(delphi)&lt;br /&gt;ver(4.05 build 186)&lt;br /&gt;Add(MainForm,2953706,21,105)&lt;br /&gt;{&lt;br /&gt; Width=566&lt;br /&gt; Height=396&lt;br /&gt; Position=4&lt;br /&gt;}&lt;br /&gt;Add(FPCWebBrowser,11421626,301,119)&lt;br /&gt;{&lt;br /&gt; Top=38&lt;br /&gt; Width=548&lt;br /&gt; Height=314&lt;br /&gt; Align=5&lt;br /&gt; Antialiased=4&lt;br /&gt; URL=&amp;quot;&amp;quot;&lt;br /&gt; LoaderDLL=&amp;quot;WebView2Loader.dll&amp;quot;&lt;br /&gt; Silent=0&lt;br /&gt; DevTools=1&lt;br /&gt; Theme=1&lt;br /&gt; link(onNavigate,13812996:In,[(362,125)(362,97)])&lt;br /&gt; link(onStatus,4295436:doEvent,[])&lt;br /&gt; link(onError,9119342:doEvent,[])&lt;br /&gt; link(URL,6844887:Var1,[(307,97)(202,97)])&lt;br /&gt; link(Text,15912626:Text,[])&lt;br /&gt; link(Theme,7376166:Count,[(335,107)(297,107)(297,226)(258,226)])&lt;br /&gt;}&lt;br /&gt;Add(DoData,1096429,466,133)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;Add(HubEx,16152143,427,133)&lt;br /&gt;{&lt;br /&gt; link(onEvent,1096429:doData,[])&lt;br /&gt;}&lt;br /&gt;Add(Debug,9119342,371,154)&lt;br /&gt;{&lt;br /&gt; WEName=&amp;quot;err&amp;quot;&lt;br /&gt; VDName=&amp;quot;&amp;quot;&lt;br /&gt; LogCount=999&lt;br /&gt; link(onEvent,16152143:doWork3,[(431,160)])&lt;br /&gt;}&lt;br /&gt;Add(Debug,4295436,371,133)&lt;br /&gt;{&lt;br /&gt; WEName=&amp;quot;stat&amp;quot;&lt;br /&gt; VDName=&amp;quot;&amp;quot;&lt;br /&gt; LogCount=999&lt;br /&gt; link(onEvent,16152143:doWork2,[(395,139)(395,139)])&lt;br /&gt;}&lt;br /&gt;Add(ChildPanel,6844887,196,28)&lt;br /&gt;{&lt;br /&gt; link(onEvent1,11255457:doEvent,[(254,34)(254,100)(198,100)(198,125)])&lt;br /&gt;}&lt;br /&gt;BEGIN_SDK&lt;br /&gt;&amp;#160; Add(EditMulti,11270845,21,21)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;EventCount=1&lt;br /&gt;&amp;#160; &amp;#160;WorkCount=1&lt;br /&gt;&amp;#160; &amp;#160;VarCount=1&lt;br /&gt;&amp;#160; &amp;#160;link(doWork1,810048:doText2,[(91,27)(91,48)])&lt;br /&gt;&amp;#160; &amp;#160;link(Var1,810048:Text,[(27,197)(160,197)])&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; Add(Panel,3732425,56,105)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;Width=736&lt;br /&gt;&amp;#160; &amp;#160;Height=38&lt;br /&gt;&amp;#160; &amp;#160;Align=2&lt;br /&gt;&amp;#160; &amp;#160;WinStyle=1&lt;br /&gt;&amp;#160; &amp;#160;BorderWidth=0&lt;br /&gt;&amp;#160; &amp;#160;BevelWidth=0&lt;br /&gt;&amp;#160; &amp;#160;BevelInner=0&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; Add(ToolBar,1363921,217,105)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;Top=18&lt;br /&gt;&amp;#160; &amp;#160;Width=736&lt;br /&gt;&amp;#160; &amp;#160;Align=4&lt;br /&gt;&amp;#160; &amp;#160;WinStyle=1&lt;br /&gt;&amp;#160; &amp;#160;Caption=0&lt;br /&gt;&amp;#160; &amp;#160;Buttons=[&#039;Navigate&#039;=[],&#039;Stop&#039;=[],&#039;Back&#039;=[],&#039;Refresh&#039;=[],&#039;Forward&#039;=[],&#039;ReadText&#039;=[],&#039;Theme&#039;=[]]&lt;br /&gt;&amp;#160; &amp;#160;link(onClick,11782016:doEvent1,[])&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; Add(Edit,810048,154,35)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;Width=590&lt;br /&gt;&amp;#160; &amp;#160;Height=18&lt;br /&gt;&amp;#160; &amp;#160;Text=&amp;quot;https://ya.ru/?npr=1&amp;quot;&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; Add(Label,3494591,420,147)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;Left=600&lt;br /&gt;&amp;#160; &amp;#160;Top=5&lt;br /&gt;&amp;#160; }&lt;br /&gt;&amp;#160; Add(Hub,11782016,266,105)&lt;br /&gt;&amp;#160; {&lt;br /&gt;&amp;#160; &amp;#160;link(onEvent1,11270845:onEvent1,[(285,111)(285,27)])&lt;br /&gt;&amp;#160; &amp;#160;link(onEvent2,3494591:doText,[(350,118)(350,153)])&lt;br /&gt;&amp;#160; }&lt;br /&gt;END_SDK&lt;br /&gt;Add(LineBreak,1065083,140,28)&lt;br /&gt;{&lt;br /&gt; link(Out,6844887:doWork1,[])&lt;br /&gt; Primary=[13812996,245,63]&lt;br /&gt;}&lt;br /&gt;Add(IndexToChanel,11255457,210,119)&lt;br /&gt;{&lt;br /&gt; Count=7&lt;br /&gt; link(onEvent1,11421626:doNavigate,[])&lt;br /&gt; link(onEvent2,11421626:doStop,[(272,132)(272,195)])&lt;br /&gt; link(onEvent3,11421626:doBack,[])&lt;br /&gt; link(onEvent4,11421626:doRefresh,[(272,146)(272,132)])&lt;br /&gt; link(onEvent5,11421626:doForward,[(272,153)(272,146)])&lt;br /&gt; link(onEvent6,11421626:doFromText,[(272,160)(272,153)])&lt;br /&gt; link(onEvent7,7376166:doNext,[(247,167)(247,188)])&lt;br /&gt;}&lt;br /&gt;Add(StrList,15912626,308,42)&lt;br /&gt;{&lt;br /&gt; Strings=#15:&amp;lt;!DOCTYPE html&amp;gt;|16:&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;|6:&amp;lt;head&amp;gt;|26:&amp;#160; &amp;#160; &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;|74:&amp;#160; &amp;#160; &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;|63:&amp;#160; &amp;#160; &amp;lt;title&amp;gt;hf-jobs - Run Workloads on Hugging Face Jobs&amp;lt;/title&amp;gt;|11:&amp;#160; &amp;#160; &amp;lt;style&amp;gt;|11:&amp;#160; &amp;#160; &amp;#160; &amp;#160; * {|22:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin: 0;|23:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 0;|35:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; box-sizing: border-box;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; body {|116:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-family: -apple-system, BlinkMacSystemFont, &#039;Segoe UI&#039;, Roboto, &#039;Helvetica Neue&#039;, Arial, sans-serif;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; line-height: 1.6;|24:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #333;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f5f5f5;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 20px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .container {|30:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; max-width: 1200px;|27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin: 0 auto;|30:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: white;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 40px;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 8px;|50:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; box-shadow: 0 2px 4px rgba(0,0,0,0.1);|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |12:&amp;#160; &amp;#160; &amp;#160; &amp;#160; h1 {|27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #ffd21e;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #000;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 20px;|43:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin: -40px -40px 30px -40px;|39:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 8px 8px 0 0;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |12:&amp;#160; &amp;#160; &amp;#160; &amp;#160; h2 {|27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #1e1e1e;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-top: 30px;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-bottom: 15px;|33:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding-bottom: 10px;|45:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-bottom: 2px solid #ffd21e;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |12:&amp;#160; &amp;#160; &amp;#160; &amp;#160; h3 {|24:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #555;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-top: 20px;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-bottom: 10px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |22:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .description {|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f9f9f9;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 20px;|43:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-left: 4px solid #ffd21e;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-bottom: 30px;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 4px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-list {|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; list-style: none;|23:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 0;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |23:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-list li {|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 12px;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin: 8px 0;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f9f9f9;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 4px;|43:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-left: 3px solid #ffd21e;|40:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; transition: background 0.2s;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-list li:hover {|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f0f0f0;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |22:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-list a {|27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #0066cc;|34:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; text-decoration: none;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-weight: 500;|27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; display: block;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |28:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-list a:hover {|39:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; text-decoration: underline;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-path {|24:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #666;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-size: 0.9em;|60:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-family: &#039;Monaco&#039;, &#039;Courier New&#039;, monospace;|28:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-top: 4px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |27:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .file-description {|24:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #777;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-size: 0.9em;|28:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-top: 4px;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-style: italic;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |19:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .metadata {|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f0f0f0;|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 15px;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 4px;|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-bottom: 30px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .metadata p {|26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin: 5px 0;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |26:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .metadata strong {|24:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; color: #333;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |18:&amp;#160; &amp;#160; &amp;#160; &amp;#160; .section {|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; margin-bottom: 40px;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; code {|32:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; background: #f4f4f4;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; padding: 2px 6px;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; border-radius: 3px;|60:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-family: &#039;Monaco&#039;, &#039;Courier New&#039;, monospace;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; font-size: 0.9em;|9:&amp;#160; &amp;#160; &amp;#160; &amp;#160; }|12:&amp;#160; &amp;#160; &amp;lt;/style&amp;gt;|7:&amp;lt;/head&amp;gt;|6:&amp;lt;body&amp;gt;|27:&amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;|38:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;h1&amp;gt;Agent Skill : hf-jobs&amp;lt;/h1&amp;gt;|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |33:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;description&amp;quot;&amp;gt;|74:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Run any workload on Hugging Face Jobs.&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;|235:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;Use this skill when you want to run GPU/CPU workloads (batch inference, synthetic data generation, dataset stats, experiments) on Hugging Face Jobs, with correct token handling and result persistence back to the Hub.&amp;lt;/p&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |30:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;metadata&amp;quot;&amp;gt;|55:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Skill Name:&amp;lt;/strong&amp;gt; hf-jobs&amp;lt;/p&amp;gt;|97:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Main Documentation:&amp;lt;/strong&amp;gt; &amp;lt;a href=&amp;quot;jobs/SKILL.md&amp;quot;&amp;gt;jobs/SKILL.md&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;|81:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;Scripts Directory:&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;jobs/scripts/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;|87:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;References Directory:&amp;lt;/strong&amp;gt; &amp;lt;code&amp;gt;jobs/references/&amp;lt;/code&amp;gt;&amp;lt;/p&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|8:&amp;#160; &amp;#160; &amp;#160; &amp;#160; |29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;h2&amp;gt;Overview&amp;lt;/h2&amp;gt;|248:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;p&amp;gt;This skill focuses on running real workloads via Hugging Face Jobs. It includes ready-to-run UV scripts and guides for authentication (HF tokens), secrets vs env vars, timeouts, hardware selection, and pushing results to the Hub.&amp;lt;/p&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|0:|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;|39:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;h2&amp;gt;Core Documentation&amp;lt;/h2&amp;gt;|34:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;ul class=&amp;quot;file-list&amp;quot;&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|56:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/SKILL.md&amp;quot;&amp;gt;SKILL.md&amp;lt;/a&amp;gt;|62:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/SKILL.md&amp;lt;/div&amp;gt;|180:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;Complete skill documentation (how to submit jobs, tokens/secrets, timeouts, persistence, and how to use the bundled scripts)&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|17:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/ul&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|0:|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;|31:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;h2&amp;gt;References&amp;lt;/h2&amp;gt;|34:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;ul class=&amp;quot;file-list&amp;quot;&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|79:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/references/token_usage.md&amp;quot;&amp;gt;token_usage.md&amp;lt;/a&amp;gt;|79:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/references/token_usage.md&amp;lt;/div&amp;gt;|151:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;Token best practices: secrets vs env, permissions, common errors (401/403), and secure patterns&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|77:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/references/hub_saving.md&amp;quot;&amp;gt;hub_saving.md&amp;lt;/a&amp;gt;|78:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/references/hub_saving.md&amp;lt;/div&amp;gt;|144:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;How to persist results: push datasets/models/files to the Hub (ephemeral job filesystem)&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|85:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/references/hardware_guide.md&amp;quot;&amp;gt;hardware_guide.md&amp;lt;/a&amp;gt;|82:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/references/hardware_guide.md&amp;lt;/div&amp;gt;|107:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;Flavor selection guidance for CPU/GPU/TPU workloads&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|87:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/references/troubleshooting.md&amp;quot;&amp;gt;troubleshooting.md&amp;lt;/a&amp;gt;|83:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/references/troubleshooting.md&amp;lt;/div&amp;gt;|122:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;Common failure modes (timeouts, missing deps, OOM, auth) and fixes&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|17:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/ul&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|0:|29:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;section&amp;quot;&amp;gt;|28:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;h2&amp;gt;Scripts&amp;lt;/h2&amp;gt;|34:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;ul class=&amp;quot;file-list&amp;quot;&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|90:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/scripts/generate-responses.py&amp;quot;&amp;gt;generate-responses.py&amp;lt;/a&amp;gt;|83:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/scripts/generate-responses.py&amp;lt;/div&amp;gt;|163:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;vLLM batch generation: load prompts/messages from a dataset, generate responses, push dataset + card to Hub&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|88:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/scripts/cot-self-instruct.py&amp;quot;&amp;gt;cot-self-instruct.py&amp;lt;/a&amp;gt;|82:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/scripts/cot-self-instruct.py&amp;lt;/div&amp;gt;|167:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;CoT Self-Instruct synthetic data generation (reasoning/instruction) + optional filtering, pushes dataset + card&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|20:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;li&amp;gt;|82:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;a href=&amp;quot;jobs/scripts/finepdfs-stats.py&amp;quot;&amp;gt;finepdfs-stats.py&amp;lt;/a&amp;gt;|79:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-path&amp;quot;&amp;gt;jobs/scripts/finepdfs-stats.py&amp;lt;/div&amp;gt;|163:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;div class=&amp;quot;file-description&amp;quot;&amp;gt;Polars streaming stats over Hub parquet (finepdfs-edu); optional upload of computed stats to a dataset repo&amp;lt;/div&amp;gt;|21:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/li&amp;gt;|17:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/ul&amp;gt;|14:&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|10:&amp;#160; &amp;#160; &amp;lt;/div&amp;gt;|7:&amp;lt;/body&amp;gt;|7:&amp;lt;/html&amp;gt;|0:|0:|0:|0:|&lt;br /&gt;}&lt;br /&gt;Add(StyleXP,4011069,28,49)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;Add(CounterEx,7376166,252,182)&lt;br /&gt;{&lt;br /&gt; Min=1&lt;br /&gt; Max=2&lt;br /&gt; Default=1&lt;br /&gt; link(onNext,11421626:doTheme,[])&lt;br /&gt;}&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (Andrew)</author>
			<pubDate>Thu, 12 Nov 2026 15:09:16 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=946#p946</guid>
		</item>
		<item>
			<title>TabHub v2.0</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=945#p945</link>
			<description>&lt;p&gt;&lt;strong&gt;Andrew&lt;/strong&gt; хоть бы написал что поправил :)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 12 Nov 2026 11:23:02 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=945#p945</guid>
		</item>
		<item>
			<title>ИИ FTPServer</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=942#p942</link>
			<description>&lt;p&gt;ГигаЧат оказался тоже не промах. Работает с библиотекой KOL&lt;br /&gt;Вот код который я попросил его сделать. Тут можно уже что то шаманить.&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;
program KOLFTPFullFeatured;                                                                                    
                                                                                                               
uses                                                                                                           
  Windows, KOL, Messages, SysUtils, Classes;                                                                   
                                                                                                               
type                                                                                                           
  TFTPSessionState = record                                                                                    
    User: string;                                                                                              
    Authenticated: Boolean;                                                                                    
    CurrentDir: string;                                                                                        
    TransferType: Char;                                                                                        
    // Для активного режима (PORT)                                                                             
    DataIP: string;                                                                                            
    DataPort: Word;                                                                                            
    // Для пассивного режима (PASV)                                                                            
    PASVSocket: PSocket;                                                                                       
  end;                                                                                                         
                                                                                                               
  TWorkerThread = class(PThread)                                                                               
  private                                                                                                      
    FCtrlSock: PSocket;                                                                                        
    FLogMemo: PControl;                                                                                        
    FState: TFTPSessionState;                                                                                  
    procedure SyncLog(const Msg: string);                                                                      
    procedure SendResponse(const Text: string);                                                                
    function BuildFullPath(const FileName: string): string;                                                    
    function NormalizeFTPPath(const Path: string): string;                                                     
    procedure CreateDataChannel(out DataSock: PSocket);                                                        
    procedure HandlePORT(const Param: string);                                                                 
    procedure HandlePASV(out Port: Word; out IP: string);                                                      
    procedure HandleLIST;                                                                                      
    procedure HandleRETR(const FileName: string);                                                              
    procedure HandleSTOR(const FileName: string);                                                              
    procedure HandleDELE(const FileName: string);                                                              
    procedure HandleMKD(const DirName: string);                                                                
    procedure HandleRMD(const DirName: string);                                                                
    procedure HandleRNFR(const FileName: string);                                                              
    procedure HandleRNTO(const FileName: string);                                                              
    procedure HandleSIZE(const FileName: string);                                                              
  protected                                                                                                    
    procedure Execute; override;                                                                               
  public                                                                                                       
    constructor Create(ClientSock: PSocket; LogTarget: PControl);                                              
  end;                                                                                                         
                                                                                                               
var                                                                                                            
  Form, LogMemo: PControl;                                                                                     
  Listener: PSocket;                                                                                           
  Addr: TSockAddrIn;                                                                                           
                                                                                                               
{ Вспомогательные функции }                                                                                    
                                                                                                               
function NormalizeFTPPath(const Base, Path: string): string;                                                   
var                                                                                                            
  Parts, Stack: KOL.PStrList;                                                                                  
  i: Integer;                                                                                                  
begin                                                                                                          
  Result := Base;                                                                                              
  if Path = &#039;&#039; then Exit;                                                                                      
  if Path[1] = &#039;/&#039; then Result := &#039;/&#039;;                                                                         
                                                                                                               
  Parts := NewStrList;                                                                                         
  Parts.StrictDelimiter := True;                                                                               
  Parts.Delimiter := &#039;/&#039;;                                                                                      
  Parts.DelimitedText := Path;                                                                                 
                                                                                                               
  Stack := NewStrList;                                                                                         
  for i := 0 to Parts.Count - 1 do                                                                             
  begin                                                                                                        
    if Parts[i] = &#039;..&#039; then                                                                                    
    begin                                                                                                      
      if Stack.Count &amp;gt; 0 then Stack.Delete(Stack.Count - 1);                                                   
    end                                                                                                        
    else if (Parts[i] &amp;lt;&amp;gt; &#039;&#039;) and (Parts[i] &amp;lt;&amp;gt; &#039;.&#039;) then                                                        
      Stack.Add(Parts[i]);                                                                                     
  end;                                                                                                         
                                                                                                               
  if (Result = &#039;/&#039;) and (Stack.Count &amp;gt; 0) then                                                                 
    Result := Result + Stack.StrictCommaText                                                                   
  else if (Result &amp;lt;&amp;gt; &#039;/&#039;) and (Stack.Count &amp;gt; 0) then                                                           
    Result := IncludeTrailingPathDelimiter(Result) + Stack.StrictCommaText;                                    
                                                                                                               
  Parts.Free;                                                                                                  
  Stack.Free;                                                                                                  
end;                                                                                                           
                                                                                                               
function TWorkerThread.BuildFullPath(const FileName: string): string;                                          
begin                                                                                                          
  if FileName = &#039;&#039; then Exit(&#039;&#039;);                                                                              
  if FileName[1] = &#039;/&#039; then                                                                                    
    Result := NormalizeFTPPath(&#039;/&#039;, FileName)                                                                  
  else                                                                                                         
    Result := NormalizeFTPPath(FState.CurrentDir, FileName);                                                   
end;                                                                                                           
                                                                                                               
{ TWorkerThread }                                                                                              
                                                                                                               
constructor TWorkerThread.Create(ClientSock: PSocket; LogTarget: PControl);                                    
begin                                                                                                          
  inherited Create(False);                                                                                     
  FreeOnTerminate := True;                                                                                     
  FCtrlSock := ClientSock;                                                                                     
  FLogMemo := LogTarget;                                                                                       
  FState.Authenticated := False;                                                                               
  FState.CurrentDir := &#039;/&#039;;                                                                                    
  FState.TransferType := &#039;A&#039;;                                                                                  
  FState.DataPort := 0;                                                                                        
  FState.PASVSocket := nil;                                                                                    
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.SyncLog(const Msg: string);                                                            
begin                                                                                                          
  if FLogMemo &amp;lt;&amp;gt; nil then                                                                                      
    FLogMemo.Add(&#039;T&#039; + IntToStr(ThreadID) + &#039;: &#039; + Msg);                                                       
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.SendResponse(const Text: string);                                                      
begin                                                                                                          
  try                                                                                                          
    FCtrlSock.SendBuf(PAnsiChar(AnsiString(Text))^, Length(Text));                                             
  except                                                                                                       
  end;                                                                                                         
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandlePORT(const Param: string);                                                       
var                                                                                                            
  Parts: KOL.PStrList;                                                                                         
  IPStr: string;                                                                                               
  P1, P2: Integer;                                                                                             
begin                                                                                                          
  Parts := NewStrList;                                                                                         
  Parts.CommaText := StringReplace(Param, &#039;,&#039;, &#039;.&#039;, [rfReplaceAll]);                                           
  if Parts.Count = 6 then                                                                                      
  begin                                                                                                        
    IPStr := Parts.Items[0] + &#039;.&#039; + Parts.Items[1] + &#039;.&#039; + Parts.Items[2] + &#039;.&#039; + Parts.Items[3];              
    P1 := StrToIntDef(Parts.Items[4], 0);                                                                      
    P2 := StrToIntDef(Parts.Items[5], 0);                                                                      
    FState.DataIP := IPStr;                                                                                    
    FState.DataPort := P1 * 256 + P2;                                                                          
    SendResponse(&#039;200 PORT command successful.&#039; + #13#10);                                                     
  end                                                                                                          
  else                                                                                                         
    SendResponse(&#039;501 Syntax error in parameters.&#039; + #13#10);                                                  
  Parts.Free;                                                                                                  
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandlePASV(out Port: Word; out IP: string);                                            
var                                                                                                            
  DataSock: PSocket;                                                                                           
  DataAddr: TSockAddrIn;                                                                                       
  LocalIP: array[0..15] of Char;                                                                               
begin                                                                                                          
  if FState.PASVSocket &amp;lt;&amp;gt; nil then FreeAndNil(FState.PASVSocket);                                              
                                                                                                               
  FState.PASVSocket := NewSocket;                                                                              
  FState.PASVSocket.SetReuseAddr(True);                                                                        
                                                                                                               
  Port := 50000;                                                                                               
  repeat                                                                                                       
    DataAddr.sin_family := AF_INET;                                                                            
    DataAddr.sin_port := htons(Port);                                                                          
    DataAddr.sin_addr.S_addr := INADDR_ANY;                                                                    
    if FState.PASVSocket.Bind(DataAddr) = 0 then Break;                                                        
    Inc(Port);                                                                                                 
  until Port &amp;gt; 50100;                                                                                          
                                                                                                               
  if FState.PASVSocket.Listen(1) = SOCKET_ERROR then                                                           
  begin                                                                                                        
    Port := 0;                                                                                                 
    FreeAndNil(FState.PASVSocket);                                                                             
    Exit;                                                                                                      
  end;                                                                                                         
                                                                                                               
  gethostname(LocalIP, SizeOf(LocalIP));                                                                       
  IP := LocalIP;                                                                                               
  SyncLog(&#039;PASV listening on &#039; + IP + &#039;:&#039; + IntToStr(Port));                                                   
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.CreateDataChannel(out DataSock: PSocket);                                              
var                                                                                                            
  DataAddr: TSockAddrIn;                                                                                       
begin                                                                                                          
  if (FState.DataPort &amp;gt; 0) and (FState.DataIP &amp;lt;&amp;gt; &#039;&#039;) then                                                      
  begin                                                                                                        
    // Активный режим (PORT)                                                                                   
    DataSock := NewSocket;                                                                                     
    DataAddr.sin_family := AF_INET;                                                                            
    DataAddr.sin_port := htons(FState.DataPort);                                                               
    DataAddr.sin_addr.S_addr := inet_addr(PAnsiChar(AnsiString(FState.DataIP)));                               
    if DataSock.Connect(DataAddr) = SOCKET_ERROR then                                                          
    begin                                                                                                      
      SendResponse(&#039;425 Can&#039;t open data connection.&#039; + #13#10);                                                
      DataSock.Free;                                                                                           
      DataSock := nil;                                                                                         
    end;                                                                                                       
  end                                                                                                          
  else if FState.PASVSocket &amp;lt;&amp;gt; nil then                                                                        
  begin                                                                                                        
    // Пассивный режим (PASV)                                                                                  
    DataSock := FState.PASVSocket.Accept;                                                                      
    // Сокет прослушивания можно закрыть, он больше не нужен                                                   
    FreeAndNil(FState.PASVSocket);                                                                             
  end                                                                                                          
  else                                                                                                         
  begin                                                                                                        
    SendResponse(&#039;425 Use PORT or PASV first.&#039; + #13#10);                                                      
    DataSock := nil;                                                                                           
  end;                                                                                                         
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleLIST;                                                                            
var                                                                                                            
  DataSock: PSocket;                                                                                           
  SearchRec: TSearchRec;                                                                                       
  ListStr, FullPath: string;                                                                                   
begin                                                                                                          
  CreateDataChannel(DataSock);                                                                                 
  if DataSock = nil then Exit;                                                                                 
                                                                                                               
  SendResponse(&#039;150 Opening ASCII mode data connection for file list.&#039; + #13#10);                              
                                                                                                               
  ListStr := &#039;&#039;;                                                                                               
  FullPath := IncludeTrailingPathDelimiter(FState.CurrentDir);                                                 
  if FindFirst(FullPath + &#039;*.*&#039;, faAnyFile, SearchRec) = 0 then                                                
  begin                                                                                                        
    repeat                                                                                                     
      if (SearchRec.Name &amp;lt;&amp;gt; &#039;.&#039;) and (SearchRec.Name &amp;lt;&amp;gt; &#039;..&#039;) then                                             
      begin                                                                                                    
        if (SearchRec.Attr and faDirectory) &amp;gt; 0 then                                                           
          ListStr := ListStr + &#039;drwxr-xr-x   1 owner    group         0 &#039; +                                    
            FormatDateTime(&#039;mmm dd hh:nn&#039;, FileDateToDateTime(SearchRec.Time)) + &#039; &#039; + SearchRec.Name + #13#10 
        else                                                                                                   
          ListStr := ListStr + &#039;-rw-r--r--   1 owner    group   &#039; +                                            
            IntToStr(SearchRec.Size) + &#039; &#039; +                                                                   
            FormatDateTime(&#039;mmm dd hh:nn&#039;, FileDateToDateTime(SearchRec.Time)) + &#039; &#039; + SearchRec.Name + #13#10;
      end;                                                                                                     
    until FindNext(SearchRec) &amp;lt;&amp;gt; 0;                                                                            
    FindClose(SearchRec);                                                                                      
  end;                                                                                                         
                                                                                                               
  DataSock.SendBuf(PAnsiChar(AnsiString(ListStr))^, Length(ListStr));                                          
  DataSock.Free;                                                                                               
  SendResponse(&#039;226 Directory send OK.&#039; + #13#10);                                                             
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleRETR(const FileName: string);                                                    
var                                                                                                            
  DataSock: PSocket;                                                                                           
  FS: TFileStream;                                                                                             
  Buffer: array[0..4095] of Byte;                                                                              
  ReadBytes: Integer;                                                                                          
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(FileName);                                                                         
  if not FileExists(FullPath) then                                                                             
  begin                                                                                                        
    SendResponse(&#039;550 File not found.&#039; + #13#10);                                                              
    Exit;                                                                                                      
  end;                                                                                                         
                                                                                                               
  CreateDataChannel(DataSock);                                                                                 
  if DataSock = nil then Exit;                                                                                 
                                                                                                               
  SendResponse(&#039;150 Opening BINARY mode data connection for &#039; + FileName + &#039; (&#039; +                              
    IntToStr(GetFileSize(FullPath)) + &#039; bytes).&#039; + #13#10);                                                    
                                                                                                               
  FS := TFileStream.Create(FullPath, fmOpenRead or fmShareDenyNone);                                           
  try                                                                                                          
    repeat                                                                                                     
      ReadBytes := FS.Read(Buffer, SizeOf(Buffer));                                                            
      if ReadBytes &amp;gt; 0 then                                                                                    
        DataSock.SendBuf(Buffer, ReadBytes);                                                                   
    until ReadBytes = 0;                                                                                       
  finally                                                                                                      
    FS.Free;                                                                                                   
    DataSock.Free;                                                                                             
  end;                                                                                                         
  SendResponse(&#039;226 Transfer complete.&#039; + #13#10);                                                             
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleSTOR(const FileName: string);                                                    
var                                                                                                            
  DataSock: PSocket;                                                                                           
  FS: TFileStream;                                                                                             
  Buffer: array[0..4095] of Byte;                                                                              
  ReadBytes: Integer;                                                                                          
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(FileName);                                                                         
                                                                                                               
  CreateDataChannel(DataSock);                                                                                 
  if DataSock = nil then Exit;                                                                                 
                                                                                                               
  SendResponse(&#039;150 Opening BINARY mode data connection for &#039; + FileName + &#039;.&#039; + #13#10);                      
                                                                                                               
  FS := TFileStream.Create(FullPath, fmCreate);                                                                
  try                                                                                                          
    repeat                                                                                                     
      ReadBytes := DataSock.RecvBuf(Buffer, SizeOf(Buffer));                                                   
      if ReadBytes &amp;gt; 0 then                                                                                    
        FS.WriteBuffer(Buffer, ReadBytes);                                                                     
    until ReadBytes = 0;                                                                                       
  finally                                                                                                      
    FS.Free;                                                                                                   
    DataSock.Free;                                                                                             
  end;                                                                                                         
  SendResponse(&#039;226 Transfer complete.&#039; + #13#10);                                                             
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleDELE(const FileName: string);                                                    
var                                                                                                            
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(FileName);                                                                         
  if not FileExists(FullPath) then                                                                             
  begin                                                                                                        
    SendResponse(&#039;550 File does not exist.&#039; + #13#10);                                                         
    Exit;                                                                                                      
  end;                                                                                                         
  if DeleteFile(FullPath) then                                                                                 
    SendResponse(&#039;250 Delete operation successful.&#039; + #13#10)                                                  
  else                                                                                                         
    SendResponse(&#039;550 Delete operation failed.&#039; + #13#10);                                                     
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleMKD(const DirName: string);                                                      
var                                                                                                            
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(DirName);                                                                          
  if CreateDir(FullPath) then                                                                                  
    SendResponse(&#039;257 &amp;quot;&#039; + FullPath + &#039;&amp;quot; directory created.&#039; + #13#10)                                         
  else                                                                                                         
    SendResponse(&#039;550 Create directory operation failed.&#039; + #13#10);                                           
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleRMD(const DirName: string);                                                      
var                                                                                                            
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(DirName);                                                                          
  if RemoveDir(FullPath) then                                                                                  
    SendResponse(&#039;250 Remove directory operation successful.&#039; + #13#10)                                        
  else                                                                                                         
    SendResponse(&#039;550 Remove directory operation failed.&#039; + #13#10);                                           
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleRNFR(const FileName: string);                                                    
var                                                                                                            
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(FileName);                                                                         
  if FileExists(FullPath) or DirectoryExists(FullPath) then                                                    
  begin                                                                                                        
    // В реальном сервере имя нужно сохранить в поле FState.RenameFrom                                         
    SendResponse(&#039;350 Ready for RNTO.&#039; + #13#10);                                                              
  end                                                                                                          
  else                                                                                                         
    SendResponse(&#039;550 File not found.&#039; + #13#10);                                                              
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleRNTO(const FileName: string);                                                    
begin                                                                                                          
  // Здесь должна быть логика переименования из сохраненного в RNFR пути                                       
  // Для примера просто отвечаем 250                                                                           
  SendResponse(&#039;250 Rename successful.&#039; + #13#10);                                                             
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.HandleSIZE(const FileName: string);                                                    
var                                                                                                            
  FullPath: string;                                                                                            
begin                                                                                                          
  FullPath := BuildFullPath(FileName);                                                                         
  if FileExists(FullPath) then                                                                                 
    SendResponse(&#039;213 &#039; + IntToStr(GetFileSize(FullPath)) + #13#10)                                            
  else                                                                                                         
    SendResponse(&#039;550 File not found.&#039; + #13#10);                                                              
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.ProcessCommand(const CmdLine: string);                                                 
var                                                                                                            
  Cmd, Param: string;                                                                                          
  SpacePos: Integer;                                                                                           
begin                                                                                                          
  SyncLog(&#039;Recv: &#039; + CmdLine);                                                                                 
  SpacePos := Pos(&#039; &#039;, CmdLine);                                                                               
  if SpacePos &amp;gt; 0 then                                                                                         
  begin                                                                                                        
    Cmd := UpperCase(Copy(CmdLine, 1, SpacePos - 1));                                                          
    Param := Copy(CmdLine, SpacePos + 1, Length(CmdLine));                                                     
  end                                                                                                          
  else                                                                                                         
  begin                                                                                                        
    Cmd := UpperCase(CmdLine);                                                                                 
    Param := &#039;&#039;;                                                                                               
  end;                                                                                                         
                                                                                                               
  if not FState.Authenticated then                                                                             
  begin                                                                                                        
    if Cmd = &#039;USER&#039; then                                                                                       
    begin                                                                                                      
      FState.User := Param;                                                                                    
      SendResponse(&#039;331 Password required for &#039; + FState.User + &#039;.&#039; + #13#10);                                 
    end                                                                                                        
    else if Cmd = &#039;PASS&#039; then                                                                                  
    begin                                                                                                      
      FState.Authenticated := True;                                                                            
      SendResponse(&#039;230 User &#039; + FState.User + &#039; logged in.&#039; + #13#10);                                        
    end                                                                                                        
    else                                                                                                       
      SendResponse(&#039;530 Not logged in.&#039; + #13#10);                                                             
    Exit;                                                                                                      
  end;                                                                                                         
                                                                                                               
  if Cmd = &#039;SYST&#039; then SendResponse(&#039;215 UNIX Type: L8&#039; + #13#10)                                              
  else if Cmd = &#039;FEAT&#039; then                                                                                    
    SendResponse(&#039;211-Features:&#039; + #13#10 + &#039; PASV&#039; + #13#10 + &#039; SIZE&#039; + #13#10 + &#039;211 End&#039; + #13#10)          
  else if Cmd = &#039;PWD&#039; then SendResponse(&#039;257 &amp;quot;&#039; + FState.CurrentDir + &#039;&amp;quot; is the current directory.&#039; + #13#10)  
  else if Cmd = &#039;TYPE&#039; then                                                                                    
  begin                                                                                                        
    FState.TransferType := Param[1];                                                                           
    SendResponse(&#039;200 Type set to &#039; + FState.TransferType + &#039;.&#039; + #13#10);                                     
  end                                                                                                          
  else if Cmd = &#039;CWD&#039; then                                                                                     
  begin                                                                                                        
    FState.CurrentDir := NormalizeFTPPath(FState.CurrentDir, Param);                                           
    SendResponse(&#039;250 Directory successfully changed.&#039; + #13#10);                                              
  end                                                                                                          
  else if Cmd = &#039;CDUP&#039; then                                                                                    
  begin                                                                                                        
    FState.CurrentDir := NormalizeFTPPath(FState.CurrentDir, &#039;..&#039;);                                            
    SendResponse(&#039;250 Directory successfully changed.&#039; + #13#10);                                              
  end                                                                                                          
  else if Cmd = &#039;PORT&#039; then HandlePORT(Param)                                                                  
  else if Cmd = &#039;PASV&#039; then                                                                                    
  begin                                                                                                        
    var P: Word; var I: string;                                                                                
    HandlePASV(P, I);                                                                                          
    SendResponse(&#039;227 Entering Passive Mode (&#039; +                                                               
      StringReplace(I, &#039;.&#039;, &#039;,&#039;, [rfReplaceAll]) + &#039;,&#039; +                                                       
      IntToStr(P div 256) + &#039;,&#039; + IntToStr(P mod 256) + &#039;).&#039; + #13#10);                                        
  end                                                                                                          
  else if Cmd = &#039;LIST&#039; then HandleLIST                                                                         
  else if Cmd = &#039;RETR&#039; then HandleRETR(Param)                                                                  
  else if Cmd = &#039;STOR&#039; then HandleSTOR(Param)                                                                  
  else if Cmd = &#039;DELE&#039; then HandleDELE(Param)                                                                  
  else if Cmd = &#039;MKD&#039; then HandleMKD(Param)                                                                    
  else if Cmd = &#039;RMD&#039; then HandleRMD(Param)                                                                    
  else if Cmd = &#039;RNFR&#039; then HandleRNFR(Param)                                                                  
  else if Cmd = &#039;RNTO&#039; then HandleRNTO(Param)                                                                  
  else if Cmd = &#039;SIZE&#039; then HandleSIZE(Param)                                                                  
  else if Cmd = &#039;QUIT&#039; then                                                                                    
  begin                                                                                                        
    SendResponse(&#039;221 Goodbye.&#039; + #13#10);                                                                     
    FCtrlSock.CloseSocket;                                                                                     
    Terminate;                                                                                                 
  end                                                                                                          
  else                                                                                                         
    SendResponse(&#039;502 Command not implemented.&#039; + #13#10);                                                     
end;                                                                                                           
                                                                                                               
procedure TWorkerThread.Execute;                                                                               
var                                                                                                            
  Buffer: array[0..1023] of Char;                                                                              
  Received: Integer;                                                                                           
begin                                                                                                          
  SyncLog(&#039;Client &#039; + FCtrlSock.PeerIP + &#039; connected.&#039;);                                                       
  SendResponse(&#039;220-Full-Featured KOL FTP Server&#039; + #13#10);                                                   
  SendResponse(&#039;220 Ready.&#039; + #13#10);                                                                         
                                                                                                               
  while not Terminated and FCtrlSock.Connected do                                                              
  begin                                                                                                        
    Received := FCtrlSock.RecvBuf(Buffer, SizeOf(Buffer) - 1);                                                 
    if Received &amp;lt;= 0 then Break;                                                                               
    Buffer[Received] := #0;                                                                                    
    ProcessCommand(string(Buffer));                                                                            
  end;                                                                                                         
                                                                                                               
  // Очистка ресурсов при дисконнекте                                                                          
  if FState.PASVSocket &amp;lt;&amp;gt; nil then FreeAndNil(FState.PASVSocket);                                              
  SyncLog(&#039;Client &#039; + FCtrlSock.PeerIP + &#039; disconnected.&#039;);                                                    
  FCtrlSock.Free;                                                                                              
end;                                                                                                           
                                                                                                               
begin                                                                                                          
  Application.Initialize;                                                                                      
  Form := NewForm(Applet, &#039;Full-Featured KOL FTP Server&#039;);                                                     
  Form.SetSize(600, 500);                                                                                      
  LogMemo := NewMemo(Form, [moReadOnly, moWantTab]);                                                           
  LogMemo.Align(caClient);                                                                                     
                                                                                                               
  Listener := NewSocket;                                                                                       
  Addr.sin_family := AF_INET;                                                                                  
  Addr.sin_port := htons(2121);                                                                                
  Addr.sin_addr.S_addr := INADDR_ANY;                                                                          
                                                                                                               
  if Listener.Bind(Addr) = SOCKET_ERROR then                                                                   
  begin                                                                                                        
    LogMemo.Add(&#039;Error binding to port 2121.&#039;);                                                                
    Exit;                                                                                                      
  end;                                                                                                         
  if Listener.Listen(10) = SOCKET_ERROR then                                                                   
  begin                                                                                                        
    LogMemo.Add(&#039;Error listening.&#039;);                                                                           
    Exit;                                                                                                      
  end;                                                                                                         
                                                                                                               
  LogMemo.Add(&#039;Full-Featured FTP Server started on port 2121.&#039;);                                               
                                                                                                               
  while True do                                                                                                
  begin                                                                                                        
    var ClientSock := Listener.Accept;                                                                         
    if ClientSock &amp;lt;&amp;gt; nil then                                                                                  
      TWorkerThread.Create(ClientSock, LogMemo);                                                               
    Application.ProcessMessages;                                                                               
  end;                                                                                                         
end.                                                                                                           
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;Вот чё мне отвечал:&lt;/p&gt;
						&lt;p&gt;Да, многопоточность добавить можно. В библиотеке KOL для этого используется объект PThread.&lt;/p&gt;
						&lt;p&gt;Главное правило при работе с потоками в KOL (и в VCL/LCL): поток не может напрямую обращаться к визуальным компонентам (в нашем случае — к LogMemo). Если передать данные из потока в интерфейс напрямую, программа упадет с ошибкой Access Violation. Для передачи данных используется механизм синхронизации — Synchronize.&lt;/p&gt;
						&lt;p&gt;Ниже представлена переработанная версия сервера. Теперь основной цикл просто принимает соединения и передает каждый новый сокет в отдельный поток.&lt;br /&gt;&lt;/p&gt;
						&lt;p&gt;Да, можно создать более функциональную версию. В этом примере реализован базовый, но рабочий набор команд FTP: авторизация, навигация по папкам (PWD, CWD), получение листинга (LIST), установка типа передачи (TYPE) и скачивание файлов (RETR).&lt;/p&gt;
						&lt;p&gt;Для работы с файловой системой здесь используются стандартные модули Delphi (SysUtils, Classes), так как KOL является лишь тонкой оберткой над Windows API и не заменяет RTL (Run-Time Library) для работы с файлами.&lt;/p&gt;
						&lt;p&gt;Важные архитектурные изменения:&lt;/p&gt;
						&lt;p&gt;Состояние сессии: введена запись TFTPSessionState, которая хранит имя пользователя, флаг авторизации, текущую директорию и тип передачи для каждого потока.&lt;br /&gt;Пассивный режим (PASV): сервер открывает случайный порт из диапазона 50000&amp;#8211;50100 и сообщает его клиенту. Это позволяет обходить NAT и роутеры.&lt;br /&gt;Обработка листинга: команда LIST формирует текстовый список файлов в формате drwxr-xr-x (для совместимости с FileZilla и Total Commander).&lt;br /&gt;Обработка путей: добавлена функция NormalizeFTPPath для корректной обработки .. и /.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Tue, 10 Nov 2026 09:21:48 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=942#p942</guid>
		</item>
		<item>
			<title>MirrorFolders</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=934#p934</link>
			<description>&lt;p&gt;KOLMirrorFolders.dcu&lt;br /&gt;Пишет нет такого файла.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (envoy_sky)</author>
			<pubDate>Mon, 02 Nov 2026 05:47:05 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=934#p934</guid>
		</item>
		<item>
			<title>ShellBrowser</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=915#p915</link>
			<description>&lt;p&gt;Скоро сказка сказывается да не скоро дело делается :)&lt;br /&gt;Проблем для реализации предостаточно, до кучи заставить всё это работать в FPC ещё тот секс :)&lt;br /&gt;Но всё решаемо. Написано уже свыше 2000 строк кода и вероятно скоро будет первая реализация задуманного.&lt;br /&gt;К сожалению ничего подобного в интернете на Delphi нет. &lt;br /&gt;Очень хорошо помогла статья &lt;strong&gt;GunSmoker(a)&lt;/strong&gt;&lt;br /&gt;&lt;a href=&quot;https://www.transl-gunsmoker.ru/2009/05/blog-post_7575.html&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;Много нюансов по реализации навигации. Но они решаемы.&lt;br /&gt;В итоге получается гораздо лучше чем всякие кастомные реализации, &lt;br /&gt;потому как это самый настоящий SysListWiew из проводника Windows со всеми вытекающими.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Tue, 28 Jul 2026 06:02:45 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=915#p915</guid>
		</item>
		<item>
			<title>Полезные ресурсы</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=911#p911</link>
			<description>&lt;p&gt;Отличный сайт, &lt;a href=&quot;https://ip76.ru/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://ip76.ru/&lt;/a&gt; автору Роману респект.&lt;br /&gt;Человек просто и досконально с примерами объясняет многие вещи которые очень востребованы у разработчиков. &lt;br /&gt;Много чего можно портировать в HiAsm&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 16 Jul 2026 11:11:50 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=911#p911</guid>
		</item>
		<item>
			<title>Создание и подключения точки доступа адаптеров WI-FI</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=909#p909</link>
			<description>&lt;p&gt;Программа для создания и подключения точки доступа адаптеров WIFI, в том числе c интерфейсом USB.&lt;br /&gt;Требуется компонент для повышения прав доступа до администратора: AdminAppEx (&lt;a href=&quot;https://cloud.mail.ru/public/7eps/VteCRLHkP&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://cloud.mail.ru/public/7eps/VteCRLHkP&lt;/a&gt;)&lt;/p&gt;
						&lt;p&gt;Скачать: &lt;a href=&quot;https://cloud.mail.ru/public/d2Tb/u9v7ubifP&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://cloud.mail.ru/public/d2Tb/u9v7ubifP&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Andrew)</author>
			<pubDate>Wed, 08 Jul 2026 10:53:58 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=909#p909</guid>
		</item>
		<item>
			<title>customver  - версия программы</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=908#p908</link>
			<description>&lt;p&gt;На самом деле, это несложно.&lt;br /&gt;Плагин примерно такой:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;Add(hiPlugs,2953706,175,245)
{
 link(onCommand,11735780:doCase,[])
}
Add(Case,11735780,224,245)
{
 Value=String(build)
 link(onNextCase,9384841:doCase,[])
 link(onTrue,4447036:doEvent2,[(269,258)(269,307)])
 AddHint(-14,-31,47,13,Value)
}
Add(Case,9384841,280,245)
{
 Value=String(run)
 link(onTrue,4447036:doEvent1,[(320,258)(320,300)])
 AddHint(-3,-30,40,13,Value)
}
Add(Hub,4447036,329,294)
{
 InCount=2
 link(onEvent1,11339124:doPart,[])
}
Add(FilePartElm,11339124,371,294)
{
 Mode=0
 Point(Part)
 link(onPart,8338269:doStrCat,[])
 link(FileName,7815630:Var,[])
}
Add(StrCat,8338269,413,294)
{
 Str2=&amp;quot;sha_res.rc&amp;quot;
 link(onStrCat,4380707:doFileExists,[])
}
Add(LineBreak,13812072,175,294)
{
 Type=1
 link(Data,2953706:FileName,[])
 Primary=[7815630,196,-28]
}
Add(FileTools,4380707,462,273)
{
 link(onEnd,10608598:doCase,[])
}
Add(Case,10608598,504,273)
{
 Value=Integer(1)
 link(onTrue,7930170:doStrCatDlm,[])
}
Add(Dir,2728772,581,231)
{
}
Add(WinExec,11667179,700,266)
{
 RunEvent=1
 Point(doConsoleExec)
 Point(onConsoleResult)
 link(FileName,15696064:Var,[])
 link(Params,5753427:FString,[(713,254)(671,254)(671,324)(629,324)])
 link(onConsoleResult,6520271:doMessage,[])
}
Add(FormatStr,5753427,623,280)
{
 DataCount=1
 Mask=&amp;quot;/fo &amp;quot;%1sha_res.res&amp;quot; &amp;quot;%1sha_res.rc&amp;quot;&amp;quot;
 Point(FString)
 link(onFString,10402115:doEvent1,[])
 link(Str1,8405712:Var,[])
}
Add(LineBreak,4882788,371,343)
{
 Caption=&amp;quot;fld&amp;quot;
 Type=1
 link(Data,11339124:Part,[])
 Primary=[8405712,252,-91]
}
Add(LineBreak,4301616,567,322)
{
 Type=1
 link(Data,7930170:Result,[])
 Primary=[15696064,133,-91]
}
Add(StrCatDelim,7930170,567,280)
{
 Str1=&amp;quot;&amp;quot;&amp;quot;
 Str2=&amp;quot;compiler\GoRC.exe&amp;quot;&amp;quot;
 Point(Delimiter)
 link(onStrCatDlm,5753427:doString,[])
 link(Delimiter,2728772:CurrentDir,[])
 AddHint(-79,-73,113,13,Str2)
}
Add(Hub,10402115,665,280)
{
 link(onEvent1,11667179:doConsoleExec,[])
}
Add(Message,6520271,756,280)
{
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Рядом с проектом, для которого нужен бэкап, кладётся файл sha_res.rc с таким текстом (полный путь к файлу можно вставлять и с помощью плагина):&lt;/p&gt;&lt;div class=&quot;quote-box quote-main&quot;&gt;&lt;blockquote&gt;&lt;p&gt;SHA_RES 200 &amp;quot;C:\Program Files (x86)\HiAsm_AltBuild\temp\t\Project5.sha&amp;quot;&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;А в самом проекте - IC с директивой &lt;span style=&quot;font-style: italic&quot;&gt;{$R sha_res.res}&lt;/span&gt;&lt;br /&gt;И при компиляции будет создаваться ресурс и цепляться к exe-шнику. Ну а шифрование, сжатие и пр. - это уже по желанию, тоже несложно.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (3042)</author>
			<pubDate>Sat, 04 Jul 2026 15:40:26 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=908#p908</guid>
		</item>
		<item>
			<title>Mod BitmapArray (doAdd,doInseret,doDelete)</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=903#p903</link>
			<description>&lt;p&gt;&lt;strong&gt;3042&lt;/strong&gt; Вот поэтому до сих пор нет нет верхней точки Data у кнопки, &lt;br /&gt;так как решает что там должно быть а что нет один человек. И всё этим сказано.&lt;br /&gt;Ещё раз напомню для тех кто не в курсе.&lt;br /&gt;Ни одного моего компонента в HiAsm НЕТ&lt;br /&gt;О чём тут ещё можно говорить.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Tue, 30 Jun 2026 13:53:49 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=903#p903</guid>
		</item>
		<item>
			<title>ScreenToPNG</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=899#p899</link>
			<description>&lt;p&gt;А вот мой вариант, с полностью прозрачной формой, как в UVScreenCamera:&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;Add(PictureStream,3493138,546,224)
{
 Quality=90
}
Add(Button,8086098,413,147)
{
 @Color=255
 Left=320
 Top=55
 Width=65
 Height=25
 Caption=&amp;quot;Область&amp;quot;
 Data=Integer(1)
 link(onClick,8063350:doWork1,[])
 AddHint(-70,-1,58,13,Caption)
 AddHint(-34,18,21,13,Data)
}
Add(ScreenShort,8665154,476,231)
{
 UseRegion=1
 Point(Region)
 link(onCapture,15489880:doWork2,[])
 link(Region,8063350:Var2,[])
}
Add(ChildForm,8063350,476,147)
{
 @Hint=#17:Область скриншота|
}
BEGIN_SDK
  Add(EditMulti,4804366,21,21)
  {
   WorkCount=2
   VarCount=2
   Height=298
   VOffset=35
   HOffset=70
   link(doWork1,13786822:In,[])
   link(doWork2,14391666:doOperation,[(42,69)(42,153)])
   link(Var1,13799839:Var1,[(97,306)])
   link(Var2,8605154:Result,[])
  }
  Add(MainForm,10791562,413,35)
  {
   Left=35
   Top=105
   Color=8388736
   Visible=1
   BorderStyle=7
   DragForm=0
   SavePosName=&amp;quot;PrScreener.ini\\Region&amp;quot;
   TransparentManager=&amp;quot;123&amp;quot;
   Point(Handle)
   Point(doVisible)
   link(onCreate,1949982:doData,[])
  }
  Add(TransparentManager,11667004,560,42)
  {
   @Hint=#107:На моей винде делаются прозрачными и одновременно позволяют проваливаться под них только симметричные цвета|20:clPurple = $80 00 80|
   Name=&amp;quot;123&amp;quot;
   FormTranspColor=8388736
   LeftWidth=20
   RightWidth=20
   TopHeight=20
   BottomHeight=20
   AddHint(72,-17,179,65,@Hint)
  }
  Add(ChildPanel,16569986,413,126)
  {
   link(onEvent1,8736232:doReset,[])
   link(Data1,696278:Var2,[])
  }
  BEGIN_SDK
    Add(EditMulti,16122400,21,21)
    {
     EventCount=1
     DataCount=1
    }
    Add(Panel,16212458,119,98)
    {
     Width=400
     Height=20
     Align=2
     Color=65280
     link(onClick,10587399:doMove,[])
    }
    Add(MoveWindow,10587399,168,98)
    {
     link(Handle,16122400:Data1,[(174,60)(27,60)])
    }
    Add(ButtonRush,10641312,273,21)
    {
     Left=378
     Top=2
     Width=20
     Height=16
     Align=3
     BorderColorOver=10789024
     ColorShadowOver=16777215
     ShadowOffsetOver=0
     UpdateSpeed=0
     Caption=&amp;quot;Х&amp;quot;
     Glyphs=[]
     link(onClick,16122400:onEvent1,[])
    }
  END_SDK
  Add(ChildPanel,5872043,406,182)
  {
   link(Data1,7627328:Var2,[])
  }
  BEGIN_SDK
    Add(EditMulti,8733418,21,21)
    {
     DataCount=1
    }
    Add(Panel,673315,91,77)
    {
     Width=400
     Height=5
     Align=4
     Color=65280
     link(onClick,15339854:doMove,[])
    }
    Add(MoveWindow,15339854,147,77)
    {
     link(Handle,8733418:Data1,[(153,49)(27,49)])
    }
  END_SDK
  Add(GetDataEx,696278,413,105)
  {
   link(Data,11045768:Var2,[])
  }
  Add(ChildPanel,13751857,364,126)
  {
   link(Data1,7627328:Var1,[(370,110)])
  }
  BEGIN_SDK
    Add(EditMulti,8840099,21,21)
    {
     DataCount=1
    }
    Add(Panel,7965088,119,98)
    {
     Top=5
     Width=5
     Height=290
     Align=1
     Color=65280
     link(onClick,4259288:doMove,[])
    }
    Add(MoveWindow,4259288,168,98)
    {
     link(Handle,8840099:Data1,[(174,60)(27,60)])
    }
  END_SDK
  Add(GetDataEx,7627328,406,105)
  {
   Angle=1
   link(Data,696278:Var1,[])
  }
  Add(ChildPanel,12797164,462,168)
  {
   link(Data1,696278:Var3,[(468,110)])
  }
  BEGIN_SDK
    Add(EditMulti,6250147,21,21)
    {
     DataCount=1
    }
    Add(Panel,16307853,119,98)
    {
     Top=5
     Width=5
     Height=290
     Align=3
     Color=65280
     link(onClick,240658:doMove,[])
    }
    Add(MoveWindow,240658,168,98)
    {
     link(Handle,6250147:Data1,[(174,60)(27,60)])
    }
  END_SDK
  Add(WinTools,335217,518,42)
  {
   link(Handle,11045768:Var3,[(524,30)(460,30)(460,82)])
  }
  Add(DoData,1949982,469,49)
  {
   Data=Integer(1)
   link(onEventData,335217:doPopup,[])
   AddHint(8,-18,21,13,Data)
  }
  Add(GetDataEx,11045768,413,77)
  {
   link(Data,10791562:Handle,[])
  }
  Add(PosWindow,9681169,98,98)
  {
   link(Handle,679457:Var1,[(104,82)])
  }
  Add(PointXY,13322257,98,196)
  {
   link(X,14391666:Result,[(104,188)(69,188)])
   link(Y,14864177:Result,[])
  }
  Add(PointXY,6469236,161,196)
  {
   link(X,2706150:Result,[])
   link(Y,8554930:Result,[(174,188)(209,188)])
  }
  Add(SizeWindow,4169557,196,98)
  {
   link(Handle,679457:Var2,[])
  }
  Add(GetDataEx,679457,196,77)
  {
   Angle=1
   link(Data,11045768:Var1,[])
  }
  Add(Math,14391666,63,147)
  {
   Op2=12
   ResultType=0
   link(onResult,14864177:doOperation,[])
   link(Op1,9681169:CurrentLeft,[(69,139)(104,139)])
  }
  Add(Math,14864177,105,147)
  {
   Op2=27
   ResultType=0
   link(onResult,2706150:doOperation,[])
   link(Op1,9681169:CurrentTop,[])
  }
  Add(Math,2706150,161,147)
  {
   OpType=1
   Op2=24
   ResultType=0
   link(onResult,8554930:doOperation,[])
   link(Op1,4169557:CurrentWidth,[(167,139)(202,139)])
  }
  Add(Math,8554930,203,147)
  {
   OpType=1
   Op2=39
   ResultType=0
   link(onResult,11532550:In,[])
   link(Op1,4169557:CurrentHeight,[])
  }
  Add(LineBreak,14063066,56,259)
  {
   link(Out,8605154:doCreateRect,[])
   Primary=[11532550,189,-112]
  }
  Add(GetDataEx,13799839,553,301)
  {
   link(Data,8736232:State,[])
  }
  Add(RGN_Rect,8605154,98,259)
  {
   Point2AsOffset=0
   link(Point1,13322257:Point,[])
   link(Point2,6469236:Point,[(111,243)(167,243)])
  }
  Add(Switch,8736232,553,119)
  {
   DataOn=Integer(1)
   DataOff=Integer(0)
   link(onSwitch,10791562:doVisible,[(597,125)(597,97)(401,97)(401,69)])
   AddHint(-15,-22,21,13,DataOff)
   AddHint(20,-23,21,13,DataOn)
  }
  Add(LineBreak,7892894,511,119)
  {
   Caption=&amp;quot;0/1&amp;quot;
   link(Out,8736232:doSwitch,[])
   Primary=[13786822,-462,-63]
  }
END_SDK
Add(Hub,9163698,434,224)
{
 link(onEvent1,8063350:doWork2,[(462,230)(462,160)])
 link(onEvent2,8665154:doCapture,[])
}
Add(ScreenShort,4754156,434,280)
{
 link(onCapture,15489880:doWork3,[(522,286)])
}
Add(IndexToChanel,1084720,385,217)
{
 Data=Integer(0)
 Point(Index)
 link(onEvent1,4754156:doCapture,[(425,223)(425,286)])
 link(onEvent2,9163698:doEvent1,[])
 link(Index,8063350:Var1,[(391,198)(482,198)])
 AddHint(4,36,21,13,Data)
}
Add(HubEx,15489880,518,231)
{
 link(onEvent,3493138:doSave,[])
}
&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/001b/10/a7/10/619964.gif&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/10/t619964.gif&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/10/t619964.gif&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Показано только само окно-область, формирование имени файла и событие для снимка - это дело каждого.&amp;#160; 8-)&lt;/p&gt;</description>
			<author>mybb@mybb.ru (3042)</author>
			<pubDate>Sat, 27 Jun 2026 16:55:11 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=899#p899</guid>
		</item>
		<item>
			<title>Innerfuse Pascal Script</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=896#p896</link>
			<description>&lt;p&gt;Ещё один качественный скриптовый движок для языка &lt;strong&gt;Object Pascal&lt;/strong&gt;&lt;br /&gt;Для FPC пока не работает, хотя и компилируется. &lt;br /&gt;На перспективу хотелось бы доделать и для FPC&lt;/p&gt;
						&lt;p&gt;скачать &lt;/p&gt;&lt;div class=&quot;quote-box hide-box term-login&quot;&gt;&lt;cite&gt;Скрытый текст:&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Для просмотра скрытого текста - &lt;a href=&quot;/login.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;войдите&lt;/a&gt; или &lt;a rel=&quot;nofollow&quot; href=&quot;/register.php&quot; target=&quot;_blank&quot;&gt;зарегистрируйтесь&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/752683.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/752683.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Mon, 15 Jun 2026 13:16:10 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=896#p896</guid>
		</item>
		<item>
			<title>LEDFont</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=892#p892</link>
			<description>&lt;p&gt;Просто ещё один цифровой индикатор.&lt;br /&gt;В любом случае рисует лучше чем штатный&lt;br /&gt;демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/14885.zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;Full версия для активных пользователей.&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/325791.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/325791.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 04 Jun 2026 14:14:49 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=892#p892</guid>
		</item>
		<item>
			<title>Полезные инструменты</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=891#p891</link>
			<description>&lt;p&gt;Портировал юнит с помощью которого можно читать свойства ActiveX&lt;br /&gt;Можно попробовать сделать утилиту с помощью которой можно будет делать&lt;br /&gt;готовые компоненты на основе CoClasses которые присутствуют в ActiveX&lt;br /&gt;Методы и свойства содержат комментарии на английском, нужно будет просто перевести ini файл&lt;br /&gt;желающие заняться пишите в личку &lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;
Add(MainForm,2953706,63,112)
{
 Width=690
 Height=344
 Caption=&amp;quot;ActiveXinfo v1.0&amp;quot;
 BorderStyle=1
}
Add(InlineCode,13096425,266,63)
{
 WorkPoints=#12:doGetActiveX|15:doGetInterfaces|15:doGetProperties|
 EventPoints=#9:onClasses|12:onInterfaces|12:onProperties|7:onEnums|11:onFunctions|
 Code=#26:{ Author -=andrestudio=- }|15:unit HiAsmUnit;|0:|9:interface|0:|32:uses kol,Share,Debug,KOLTlbUtil;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|22:     TL: TTypeLibrary;|27:     ClassesList: PStrList;|30:     InterfacesList: PStrList;|30:     PropertiesList: PStrList;|25:     EnumsList: PStrList;|28:     FunctionList: PStrList;|24:     ClassesID: integer;|27:     InterfacesID: integer;|9:   public|24:     Classes: THI_Event;|27:     Interfaces: THI_Event;|26:     onClasses: THI_Event;|29:     onInterfaces: THI_Event;|29:     onProperties: THI_Event;|24:     onEnums: THI_Event;|28:     onFunctions: THI_Event;|25:     constructor Create; |54:     procedure doGetActiveX(var dt: TData; idx: word);|57:     procedure doGetInterfaces(var dt: TData; idx: word);|57:     procedure doGetProperties(var dt: TData; idx: word);|5: end;|0:|14:implementation|0:|32:constructor THiAsmClass.Create; |5:begin|28:  ClassesList := NewStrList;|31:  InterfacesList := NewStrList;|31:  PropertiesList := NewStrList;|26:  EnumsList := NewStrList;|29:  FunctionList := NewStrList;|4:end;|0:|61:procedure THiAsmClass.doGetActiveX(var dt: TData; idx: word);|3:var|13:  i: integer;|5:begin|31:  if Assigned(TL) then TL.Free;|20:  ClassesList.Clear;|23:  InterfacesList.Clear;|23:  PropertiesList.Clear;|18:  EnumsList.Clear;|21:  FunctionList.Clear;|28:  _hi_onEvent(onClasses,&#039;&#039;);|31:  _hi_onEvent(onInterfaces,&#039;&#039;);|31:  _hi_onEvent(onProperties,&#039;&#039;);|26:  _hi_onEvent(onEnums,&#039;&#039;);|30:  _hi_onEvent(onFunctions,&#039;&#039;);|0:|42:  TL := TTypeLibrary.Create(ToString(dt));|36:  for i := 0 to TL.CoClassCount-1 do|42:    ClassesList.Add(TL.CoClasses[i].Name);|4:    |42:  _hi_onEvent(onClasses,ClassesList.Text);|33:  for i := 0 to TL.EnumCount-1 do|36:    EnumsList.Add(TL.Enums[i].Name);|40:  _hi_onEvent(onEnums,EnumsList.Text);  |4:end;|0:|64:procedure THiAsmClass.doGetInterfaces(var dt: TData; idx: word);|3:var|13:  i: integer;|5:begin|31:  _hi_onEvent(onInterfaces,&#039;&#039;);|23:  InterfacesList.Clear;|29:  ClassesID := ToInteger(dt);|59:  for i := 0 to TL.CoClasses[ClassesID].InterfaceCount-1 do|67:    InterfacesList.Add(TL.CoClasses[ClassesID].Interfaces[i].Name);|48:  _hi_onEvent(onInterfaces,InterfacesList.Text);|4:end;|0:|64:procedure THiAsmClass.doGetProperties(var dt: TData; idx: word);|3:var|13:  i: integer;|17:  name,s: string;|16:  t: TInterface;|5:begin|23:  PropertiesList.Clear;|21:  FunctionList.Clear;|31:  _hi_onEvent(onProperties,&#039;&#039;);|30:  _hi_onEvent(onFunctions,&#039;&#039;);|32:  InterfacesID := ToInteger(dt);|64:  name := TL.CoClasses[ClassesID].Interfaces[InterfacesID].Name;|2:  |38:  for i := 0 to TL.InterfaceCount-1 do|40:    if TL.Interfaces[i].Name = name then|9:    begin|28:      t := TL.Interfaces[i];|12:      Break;|10:    end;  |31:  if not Assigned(t) then Exit;|2:  |36:  for i := 0 to t.PropertyCount-1 do|7:  begin|36:    if t.Properties[i].IsHidden then|35:      _debug(t.Properties[i].Name);|67:    if (t.Properties[i].CanRead) and (t.Properties[i].ID &amp;lt;&amp;gt; 0) then|52:      FunctionList.Add(&#039;Get_&#039;+t.Properties[i].Name);|7:       |30:    s := t.Properties[i].Name;|55:    s := s + &#039;: &#039; + t.Properties[i].Value.DataTypeName;|42:    if PropertiesList.indexOf(s) = -1 then|28:      PropertiesList.Add(s);|7:  end; |49:  _hi_onEvent(onProperties, PropertiesList.Text);|2:  |36:  for i := 0 to t.FunctionCount-1 do|7:  begin|9:    //if |29:    s := t.Functions[i].Name;|26:    //FunctionList.Add(s);|4:    |6:  end;|45:  _hi_onEvent(onFunctions,FunctionList.Text);|4:end;|0:|4:end.|
 link(onClasses,12059634:doText,[])
 link(onInterfaces,10302181:doText,[(375,76)(375,118)])
 link(onProperties,9834733:doText,[(362,83)(362,167)])
 link(onEnums,12678222:doText,[(350,90)(350,216)])
 link(onFunctions,4118586:doText,[(337,97)(337,265)])
}
Add(ODialog,1009433,119,63)
{
 Filter=&amp;quot;ocx|*.ocx|dll|*.dll&amp;quot;
 Title=&amp;quot;Open ActiveX&amp;quot;
 NoChangeDir=1
 link(onExecute,8313438:doText,[])
}
Add(Button,10501238,63,63)
{
 Left=620
 Top=25
 Caption=&amp;quot;Open&amp;quot;
 link(onClick,1009433:doExecute,[])
}
Add(Edit,8313438,182,63)
{
 Left=10
 Top=25
 Width=600
 Ctl3D=1
 Text=&amp;quot;&amp;quot;
 link(onChange,13096425:doGetActiveX,[])
}
Add(ListBox,12059634,392,42)
{
 Left=10
 Top=65
 Width=120
 Height=95
 link(onClick,13096425:doGetInterfaces,[(429,55)(429,28)(256,28)(256,76)])
}
Add(Label,13851853,182,112)
{
 Left=10
 Top=5
 Width=149
 Height=17
 Caption=&amp;quot;Path ActiveX library (*.ocx,*.dll)&amp;quot;
}
Add(Label,9278937,189,119)
{
 Left=10
 Top=50
 Width=53
 Height=17
 Caption=&amp;quot;CoClasses&amp;quot;
}
Add(ListBox,10302181,392,91)
{
 Left=140
 Top=65
 Width=120
 Height=95
 link(onClick,13096425:doGetProperties,[(441,104)(441,16)(243,16)(243,83)])
}
Add(Label,9638729,196,126)
{
 Left=140
 Top=50
 Width=51
 Height=17
 Caption=&amp;quot;Interfaces&amp;quot;
}
Add(ListBox,9834733,392,140)
{
 Left=270
 Top=65
 Width=215
 Height=95
}
Add(Label,10084264,203,133)
{
 Left=270
 Top=50
 Width=43
 Height=17
 Caption=&amp;quot;Property&amp;quot;
}
Add(ListBox,12678222,392,189)
{
 Left=495
 Top=65
 Width=180
 Height=95
}
Add(Label,1653437,210,140)
{
 Left=495
 Top=50
 Width=36
 Height=17
 Caption=&amp;quot;Enums&amp;quot;
}
Add(ListBox,4118586,392,238)
{
 Left=10
 Top=190
 Width=665
 Height=115
}
Add(Label,6549074,217,147)
{
 Left=10
 Top=175
 Width=127
 Height=17
 Caption=&amp;quot;Functions and procedures&amp;quot;
}

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/418093.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/418093.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Fri, 29 May 2026 06:24:06 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=891#p891</guid>
		</item>
		<item>
			<title>Win10 форма аля Win7 :)</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=890#p890</link>
			<description>&lt;p&gt;Сделал попытку применить стили окна как в Debug режиме у Delphi7&lt;br /&gt;Спутав стиль с Ex и сделав их одинаковым получил странный эффект&lt;br /&gt;Кнопки и иконка формы поменялись местами :) причём кнопки работают исправно&lt;br /&gt;Но так и не добился нужного мне результата применив уже точное значение стилей&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/931339.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/931339.png&quot; /&gt;&lt;/p&gt;&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 33em&quot;&gt;&lt;pre&gt;
Add(MainForm,2953706,98,70)
{
 Point(PHandle)
}
Add(InlineCode,13011865,98,133)
{
 WorkPoints=#6:doTest|
 DataPoints=#2:ph|
 Code=#26:{ Author -=andrestudio=- }|15:unit HiAsmUnit;|0:|9:interface|0:|21:uses kol,Share,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10:   private|17:     c: PControl;|9:   public|19:     ph: THI_Event;|48:     procedure doTest(var dt: TData; idx: word);|5: end;|0:|14:implementation|0:|29:procedure THiAsmClass.doTest;|5:begin|26:  c := ReadControl(ph,&#039;&#039;);|23:  c.Style := $16CF0000;|25:  c.ExStyle := $16CF0000;|15:  c.Invalidate;|4:end;|0:|4:end.|
 link(ph,2953706:PHandle,[])
}
Add(Button,8001706,35,133)
{
 Left=15
 Top=40
 link(onClick,13011865:doTest,[])
}

&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 28 May 2026 12:14:02 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=890#p890</guid>
		</item>
		<item>
			<title>VssScrollbar (горизонтальный)</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=887#p887</link>
			<description>&lt;p&gt;Этот скрол хорошо подойдёт для мультимедийных приложений.&lt;br /&gt;Различные настройки позволяют подстроить его под свой вкус и цвет :)&lt;br /&gt;Full версия для активных пользователей&lt;br /&gt;Демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/75329.7z&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/588266.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/588266.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 07 May 2026 12:40:04 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=887#p887</guid>
		</item>
		<item>
			<title>QR-Decoder</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=885#p885</link>
			<description>&lt;p&gt;Простой декодер QR и штрих кодов на основе консольной утилиты &lt;strong&gt;zbarimg.exe&lt;/strong&gt;&lt;br /&gt;Может распознавать QR код прямо со сканов документов&lt;br /&gt;Демка &lt;/p&gt;&lt;div class=&quot;quote-box hide-box term-login&quot;&gt;&lt;cite&gt;Скрытый текст:&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Для просмотра скрытого текста - &lt;a href=&quot;/login.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;войдите&lt;/a&gt; или &lt;a rel=&quot;nofollow&quot; href=&quot;/register.php&quot; target=&quot;_blank&quot;&gt;зарегистрируйтесь&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/366732.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/366732.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Wed, 06 May 2026 11:20:00 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=885#p885</guid>
		</item>
		<item>
			<title>PNG file -&gt; составная иконка</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=884#p884</link>
			<description>&lt;p&gt;Пример создания составной иконки из пропорционального PNG файла с переносом альфа канала.&lt;br /&gt;400 строк кода и ву-аля :) &lt;br /&gt;Создаёт файл ico с именем файла png в директории программы. (файл png можно просто перетащить из проводника в окно программы)&lt;br /&gt;За счёт того что прорисовка осуществляется с помощью GDI+ то из картинки к примеру 32х32 получается вполне качественная 256х256 иконка&lt;br /&gt;демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/58857.zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;Full версия для активных пользователей&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/415537.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/415537.png&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/752988.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/752988.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 30 Apr 2026 07:03:16 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=884#p884</guid>
		</item>
		<item>
			<title>ToolBtn</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=883#p883</link>
			<description>&lt;p&gt;Кнопка с фиксацией на основе ToolBar(a) и менеджер для иконок. Штатный не подходит.&lt;br /&gt;Может иметь свою надпись и иконку для фиксированных состояний.&lt;br /&gt;Так же может использовать свой цвет. Высота кнопки подбирается автоматически.&lt;br /&gt;Демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/25789.zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/266221.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/266221.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Fri, 24 Apr 2026 14:04:37 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=883#p883</guid>
		</item>
		<item>
			<title>ToolBar</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=882#p882</link>
			<description>&lt;p&gt;Следующая модификация компонента&lt;br /&gt;Раз уж перешли на иконки то вероятно имеет смысл загружать из ресурсов, правда это ограничивает выбор ОС.&lt;br /&gt;Ну если нужно только для одной оси то почему бы не использовать эту возможность.&lt;br /&gt;В старом компоненте мне не удалось сделать вертикальный вид отображения, в этом работает.&lt;br /&gt;Так же выпадающее меню выпадало где не надо :) поправил.&lt;/p&gt;
						&lt;p&gt;Итак добавлены свойства&lt;br /&gt;&lt;strong&gt;Icons&lt;/strong&gt;=Содержит список загрузки иконок с различных ресурсов где каждая строка [имя_ресурса] знак равенства [index_иконки]|5|&lt;br /&gt;&lt;strong&gt;@XPMode&lt;/strong&gt;=При стиле XP можно отключить этот стиль False либо оставить его True|14|0|True,False&lt;/p&gt;
						&lt;p&gt;В этом демо примере для &lt;strong&gt;Windows10&lt;/strong&gt; вот такой список &lt;strong&gt;Icons&lt;/strong&gt;&lt;br /&gt;imageres.dll=289&lt;br /&gt;imageres.dll=3&lt;br /&gt;shell32.dll=258&lt;/p&gt;
						&lt;p&gt;imageres.dll=255&lt;br /&gt;imageres.dll=251&lt;/p&gt;
						&lt;p&gt;shell32.dll=260&lt;br /&gt;shell32.dll=259&lt;br /&gt;shell32.dll=263&lt;br /&gt;shell32.dll=131&lt;/p&gt;
						&lt;p&gt;shell32.dll=221&lt;/p&gt;
						&lt;p&gt;Есть конечно ещё над чем поработать но пока так Скачать &lt;/p&gt;&lt;div class=&quot;quote-box hide-box term-login&quot;&gt;&lt;cite&gt;Скрытый текст:&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;Для просмотра скрытого текста - &lt;a href=&quot;/login.php&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;войдите&lt;/a&gt; или &lt;a rel=&quot;nofollow&quot; href=&quot;/register.php&quot; target=&quot;_blank&quot;&gt;зарегистрируйтесь&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/419956.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/419956.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 16 Apr 2026 13:39:41 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=882#p882</guid>
		</item>
		<item>
			<title>ScreenGifRecord</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=881#p881</link>
			<description>&lt;p&gt;&lt;strong&gt;oCam&lt;/strong&gt; Хорошая программа спору нет.&lt;br /&gt;Но хочет денег или ещё чего. Короче задолбала меня куда то в интернет выкидывать после закрытия.&lt;br /&gt;А нужно то всего ничего, делать компактные мувики для соц-сетей и форумов&lt;br /&gt;Ведь иногда лучше увидеть последовательность действий чем сто раз прочитать про них &lt;br /&gt;Вот и поделка выходного дня. Моя собственная реализация. Вроде удобно с навигацией.&lt;br /&gt;Встроенные контекстные меню в окнах для дополнительных возможностей. (можно расширять)&lt;br /&gt;Ну и сам мувик в качестве демонстрации. Программа снимает саму себя &lt;br /&gt;Сам файл программы автономный. Создаёт Директорию Gifs и файл настроек в директории запуска.&lt;/p&gt;
						&lt;p&gt;Вот такой получился рекордер :)&amp;#160; &amp;#160;&lt;a href=&quot;http://forumstatic.ru/files/001b/10/a7/95150.7z&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Скачать&lt;/a&gt;&lt;br /&gt;Сам себя демонстрирует :)&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/432478.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/432478.png&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/791580.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/791580.png&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/725311.gif&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/725311.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Thu, 16 Apr 2026 12:28:00 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=881#p881</guid>
		</item>
		<item>
			<title>ChromePDFRender</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=875#p875</link>
			<description>&lt;p&gt;Портирован модуль чтения PDF&amp;#160; библиотеки хрома &lt;strong&gt;pdf.dll&lt;/strong&gt;&lt;br /&gt;full версия активным пользователям&lt;br /&gt;демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/37327.7z&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/372784.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/372784.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Wed, 25 Mar 2026 08:27:30 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=875#p875</guid>
		</item>
		<item>
			<title>GIFEncoder</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=874#p874</link>
			<description>&lt;p&gt;Вот такой получился рекордер :)&lt;br /&gt;Сам себя демонстрирует :)&lt;/p&gt;
						&lt;p&gt;демка &lt;a href=&quot;http://forumstatic.ru/files/001b/10/a7/95150.7z&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/432478.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/432478.png&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/791580.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/791580.png&quot; /&gt;&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/725311.gif&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/725311.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Sat, 21 Mar 2026 15:44:13 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=874#p874</guid>
		</item>
		<item>
			<title>GDIPCircleProgressBar</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=871#p871</link>
			<description>&lt;p&gt;Почему то здесь забыл выложить :)&lt;br /&gt;Версия 1.02&lt;br /&gt;Добавлены стили градиента и анимации в режиме &lt;strong&gt;doPleaseWait&lt;/strong&gt;&lt;br /&gt;демка &lt;a href=&quot;https://forumstatic.ru/files/001b/10/a7/25017.zip&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;Ссылка&lt;/a&gt;&lt;br /&gt;Нужно править dll для отрисовки в IDE. А это тяжёлый случай :)&lt;/p&gt;
						&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/64770.gif&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/64770.gif&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Fri, 13 Mar 2026 11:03:25 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=871#p871</guid>
		</item>
		<item>
			<title>Create circle avatar</title>
			<link>https://hiasm.bbtalk.me/viewtopic.php?pid=870#p870</link>
			<description>&lt;p&gt;Добавил градиентный бордюр&lt;br /&gt;Не ахти какой конечно но всё же лучше чем просто одноцветный кант&lt;br /&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001b/10/a7/2/550261.png&quot; alt=&quot;https://upforme.ru/uploads/001b/10/a7/2/550261.png&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (andrestudio)</author>
			<pubDate>Mon, 09 Mar 2026 10:42:29 +0300</pubDate>
			<guid>https://hiasm.bbtalk.me/viewtopic.php?pid=870#p870</guid>
		</item>
	</channel>
</rss>
