<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Создание таблиц из скриптов на нужной вкладке]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=329&amp;type=atom" />
	<updated>2024-06-13T06:34:34Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=329</id>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4347#p4347" />
			<content type="html"><![CDATA[<p>Задача ваша понятна, но вот идей как это сделать лучше у меня так и не придумалось...</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2024-06-13T06:34:34Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4347#p4347</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4345#p4345" />
			<content type="html"><![CDATA[<p>Здесь идея проста. Если каждую вкладку привязать к определённому инструменту, то чтобы скрипт знал, с каким инструментом ему работать, он должен знать, какая вкладка активна в данный момент.<br />Я не знаю, какая тут может быть идея, кроме периодического вызова TabCtrl_GetItemText. Можно было бы не циклически вызывать эту функцию, а например по клику левой кнопки мыши. Но тогда надо каким-то образом перехватить нажатие левой кнопки мыши...<br />Но пока у меня такая идея - создать вспомогательный скрипт, который и будет периодически вызывать TabCtrl_GetItemText и передавать имя активной вкладки в основной скрипт с помощью StaticVar. Я думаю, что в этом случае эта функция не будет подвешивать основной скрипт.<br />Время обновления названия активной вкладки, равное 100мс (и даже 200мс) вполне бы устроило. Главное чтобы это не подвешивало основной скрипт (там итак есть много чего, что могло бы его подвесить)).</p>]]></content>
			<author>
				<name><![CDATA[igor]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3369</uri>
			</author>
			<updated>2024-06-12T16:43:41Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4345#p4345</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4335#p4335" />
			<content type="html"><![CDATA[<p>Я думаю, что не смотря на выполнение TabCtrl_GetItemText в другом потоке, она, однако, синхронизируется с основным потоком терминала в том смысле, что Windows синхронизирует обращения к оконной функции (а для получения результата Windows вызывает оконную функцию). Соответственно если основной поток занят (например, перерисовывает графики, обновляет таблицы в терминале при получении торговых данных), то и TabCtrl_GetItemText останавливается до замершения других обработчиков (не Lua, обработчиков терминала и Windows). Могу предположить, что в эти моменты и происходят &quot;провалы&quot; по скорости её ответа.</p><p>Так что думаю надо просто придумать другую идею вместо &quot;затрахивания&quot; вызовами TabCtrl_GetItemText.</p><p>Хотя я примерно могу предположить для какой задачи у вас сделана такая работа робота.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2024-06-10T11:18:32Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4335#p4335</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4334#p4334" />
			<content type="html"><![CDATA[<p>Да, я из main() вызываю w32.TabCtrl_GetItemText(hTabWnd).<br />Миллисекунды действительно не критичны. Но здесь речь идёт о величине &gt; 100мс (если не больше). А это уже может быть заметно. Ведь это подвешивает и весь остальной скрипт.<br />Мне это чем-то напоминает ситуацию с функцией Sleep(1), задержка от которой тоже колеблется от 1мс до ~16мс, а иногда и ещё больше (решается с помощью NtSetTimerResolution).<br />Вот я и подумал, что может быть аналогичная ситуация и с функцией w32.TabCtrl_GetItemText(hTabWnd). Т.е. возможно она, чтобы отработать, ожидает какого-то сигнала от Windows. И может быть здесь тоже есть какое-нибудь решение, аналогичное решению с функцией Sleep(1).</p>]]></content>
			<author>
				<name><![CDATA[igor]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3369</uri>
			</author>
			<updated>2024-06-09T06:35:52Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4334#p4334</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4333#p4333" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>igor пишет:</cite><blockquote><p>Задача - сделать так, чтобы скрипт постоянно знал, какая вкладка активна в данный момент времени.</p></blockquote></div><p>У вас &quot;данный момент&quot; наступает так часто, что критичны миллисекунды?</p><p>Вообще &quot;под капотом&quot; там простой вызов непосредственно WinAPI функции, так что если и тормозит - то сама Windows в этом месте, видимо нет надобности для пользовательского интерфейса делать это супер быстро и стабильно.</p><p>Кстати, а вы не из main() случайно вызываете w32.TabCtrl_GetItemText(hTabWnd)?</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2024-06-07T04:31:48Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4333#p4333</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=4330#p4330" />
			<content type="html"><![CDATA[<p>Обнаружил, что время выполнения оператора w32.TabCtrl_GetItemText(hTabWnd) очень большое. Точнее оно колеблется от 1мс до ~130мс (непонятно, от чего это зависит).<br />Никто не знает, чем это вызвано, и можно ли как-нибудь с этим бороться?<br />Задача - сделать так, чтобы скрипт постоянно знал, какая вкладка активна в данный момент времени.</p>]]></content>
			<author>
				<name><![CDATA[igor]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3369</uri>
			</author>
			<updated>2024-06-05T10:48:07Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=4330#p4330</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3005#p3005" />
			<content type="html"><![CDATA[<p>Это я про запуск после загрузки квика.</p><p>Выделяешь все скрипты и запускаешь выделенные. В итоге часть окон не в тех вкладках.<br />Понятно почему и это не критично, можно запускать по одному.<br />Наверное если вдруг получится через меню &quot;переместить во вкладку&quot; то этого не будет.&nbsp; Если что я первый в очереди )</p>]]></content>
			<author>
				<name><![CDATA[Kolossi]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3109</uri>
			</author>
			<updated>2021-02-14T17:46:15Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3005#p3005</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3004#p3004" />
			<content type="html"><![CDATA[<p>У вас несколько скриптов одновременно создают окна? Именно одновременно?</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2021-02-14T16:33:25Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3004#p3004</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3003#p3003" />
			<content type="html"><![CDATA[<p>Однако если запущены одновременно несколько скриптов, то окно таблицы запросто может влететь в чужую вкладку. Текущую для другого вызова функции.</p>]]></content>
			<author>
				<name><![CDATA[Kolossi]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3109</uri>
			</author>
			<updated>2021-02-14T10:32:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3003#p3003</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3002#p3002" />
			<content type="html"><![CDATA[<p>А, понял! <br />Координаты таблицы надо передавать в текущее окно.<br />Получилось так:<br /></p><div class="codebox"><pre><code>function OpenTable(Name,kid,pos) -- функция открытия таблицы (kid) с координатами (pos) в нужной вкладке (Name)
    local mmes=&quot;&quot;
    local hQuikWnd = GetQuikMainWindowHandle() -- handle главного окна QUIK
    local hTabWnd = 0 --  handle окна вкладок
        if hQuikWnd &gt; 0 then
            hTabWnd = w32.FindWindowEx(hQuikWnd, 0, &quot;SysTabControl32&quot;, &quot;&quot;)
            if hTabWnd ~= 0 and not w32.IsWindowVisible(hTabWnd) then -- отображение вкладок отключено
                hTabWnd = 0
            end
        end
    if hTabWnd &gt; 0 then --  вкладки в терминале отображаются
        local prevIdx = w32.TabCtrl_GetCurFocus(hTabWnd)  --  индекс текущей активной вкладки
        local idxGr = w32.TabCtrl_GetItemIndexByText(hTabWnd, Name) -- индекс заданной вкладки
        if idxGr &gt;= 0 then -- вкладка найдена
            w32.TabCtrl_SetCurFocus(hTabWnd, idxGr) -- переключение на найденную вкладку
            local txt = w32.TabCtrl_GetItemText(hTabWnd) --  название текущей активной вкладки
            mmes=&quot;   Вкладка &quot; .. tostring(txt)
            CreateWindow(kid)
            SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
            w32.TabCtrl_SetCurFocus(hTabWnd, prevIdx) -- назад на исходную вкладку
        else
            CreateWindow(kid)
            SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
            local txt = w32.TabCtrl_GetItemText(hTabWnd)
            mmes=&quot;   Вкладка не найдена. Текущая &quot; .. tostring(txt)
        end
    else -- вкладки не отображены, открываем в текущей
        CreateWindow(kid)
        SetWindowPos(kid, pos.a, pos.b, pos.c, pos.d)
        mmes=&quot;   Вкладка текущая&quot;
    end
    return mmes
end</code></pre></div><p>...<br />&nbsp; &nbsp; local pos={a=0,b=0,c=600,d=990}<br />&nbsp; &nbsp; local addtxt=OpenTable(&quot;Дивиденды&quot;,table_id,pos)<br />&nbsp; &nbsp; SetWindowCaption(table_id,&quot;&nbsp; Закрытие дивидендных реестров. &quot;..addtxt)<br />...<br /> Все супер, спасибо swerg!</p>]]></content>
			<author>
				<name><![CDATA[Kolossi]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3109</uri>
			</author>
			<updated>2021-02-14T08:32:07Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3002#p3002</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3001#p3001" />
			<content type="html"><![CDATA[<p>Добрый день.<br />Все вроде отлично, но что-то не так в датском королевстве c позиционированием окна.<br />Сделал из вашего кода функцию в свою библиотечку:<br />--<br /></p><div class="codebox"><pre><code>function OpenTable(Name,kid) -- функция открытия таблицы (kid) в нужной вкладке (Name)
    local mmes=&quot;&quot;
    local hQuikWnd = GetQuikMainWindowHandle() -- handle главного окна QUIK
    local hTabWnd = 0 --  handle окна вкладок
        if hQuikWnd &gt; 0 then
            hTabWnd = w32.FindWindowEx(hQuikWnd, 0, &quot;SysTabControl32&quot;, &quot;&quot;)
            if hTabWnd ~= 0 and not w32.IsWindowVisible(hTabWnd) then -- отображение вкладок отключено
                hTabWnd = 0
            end
        end
    if hTabWnd &gt; 0 then --  вкладки в терминале отображаются
        local prevIdx = w32.TabCtrl_GetCurFocus(hTabWnd)  --  индекс текущей активной вкладки
        local idxGr = w32.TabCtrl_GetItemIndexByText(hTabWnd, Name) -- индекс заданной вкладки
        if idxGr &gt;= 0 then -- вкладка найдена
            w32.TabCtrl_SetCurFocus(hTabWnd, idxGr) -- переключение на найденную вкладку
            local txt = w32.TabCtrl_GetItemText(hTabWnd) --  название текущей активной вкладки
            mmes=&quot;   Вкладка &quot; .. tostring(txt)
            CreateWindow(kid)
            w32.TabCtrl_SetCurFocus(hTabWnd, prevIdx) -- назад на исходную вкладку
        else
            CreateWindow(kid)
            local txt = w32.TabCtrl_GetItemText(hTabWnd)
            mmes=&quot;   Вкладка не найдена. Текущая&quot; .. tostring(txt)
        end
    else -- вкладки не отображены, открываем в текущей
        CreateWindow(kid)
        mmes=&quot;   Вкладка текущая&quot;
    end
    return mmes
end</code></pre></div><p>Главный код:<br />&nbsp; &nbsp; &nbsp; &nbsp; ...<br />&nbsp; &nbsp; local addtxt=OpenTable(&quot;Дивиденды&quot;,table_id)<br />&nbsp; &nbsp; SetWindowCaption(table_id,&quot;&nbsp; Закрытие дивидендных реестров. &quot;..addtxt)<br />&nbsp; &nbsp; SetWindowPos(table_id, 0,0, 600, 990)<br />&nbsp; &nbsp; &nbsp; &nbsp; local a,b,c,d=GetWindowRect(table_id)<br />&nbsp; &nbsp; &nbsp; &nbsp; message(tostring(a)..&quot;-&quot;..tostring(b)..&quot;-&quot;..tostring(c)..&quot;-&quot;..tostring(d))</p><p>Вроде все отлично, таблица попадает прямиком во вкладку &quot;Дивиденды&quot; и message() возвращает 0-0-600-990</p><p>Однако левый верхний угол таблицы в окне &quot;Дивиденды&quot; где угодно, только не в 0,0<br />Что я не понимаю ?</p>]]></content>
			<author>
				<name><![CDATA[Kolossi]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3109</uri>
			</author>
			<updated>2021-02-14T08:17:33Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3001#p3001</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2875#p2875" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>а если через пункт меню &quot;переместить на вкладку&quot;?</p></blockquote></div><p>Да, вариант. Надо будет поискать подходы. Спасибо за идею!</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2020-11-21T04:03:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2875#p2875</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2874#p2874" />
			<content type="html"><![CDATA[<p>а если через пункт меню &quot;переместить на вкладку&quot;?</p>]]></content>
			<author>
				<name><![CDATA[toxa]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3172</uri>
			</author>
			<updated>2020-11-20T14:58:30Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2874#p2874</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2873#p2873" />
			<content type="html"><![CDATA[<p><span style="color: #CCCCCC">&lt; reserved &gt;</span></p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2020-11-17T20:47:09Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2873#p2873</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Создание таблиц из скриптов на нужной вкладке]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=2871#p2871" />
			<content type="html"><![CDATA[<p>При переключении вкладок из скрипта всё моргает, конечно, но куда деваться...</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2020-11-17T20:42:45Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=2871#p2871</id>
		</entry>
</feed>
