С Новым годом! Форум программистов, компьютерный форум, киберфорум
Электроника для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125

windows - вывод графика в свернутое окно [решено, кг/ам]

20.04.2017, 04:19. Показов 3959. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
возможно, кто-то уже сталкивался и победил, а у меня трехдневное гугление пока оказалось безрезультатным:(

ситуация следующая - есть программка, которая собирает данные с некоего девайса и рисует картинку и график

написано под Win 10 с помощью Tozorus

есть основное окно с картинкой типа TPanel и всякими кнопками для управления процессом - FormM
есть еще одно окно с графиками - FormG, на нем 3 TAChart`а, на каждом по 2 серии.

создаются они так:

Code
1
2
3
 Application.CreateForm(TFormM, FormM);
Application.CreateForm(TFormP, FormP);
Application.CreateForm(TFormG, FormG);
FormP это окно настроек и с ним все хорошо

данные считываются раз в 2 секунды по таймеру программы, обрабатываются, и строятся графики

т.е. раз в 2 секунды вызывается
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure GraphView(); //отображение графика
begin
DTc:=Now();
 
//объём
FormG.Chart1Series1.AddXY(DTc,a_volume[1,GCycleNumber],,clRid);
FormG.Chart1Series2.AddXY(DTc,a_volume[2,GCycleNumber],,clBlue);
//масса
FormG.Chart2Series1.AddXY(DTc,a_mass[1,GCycleNumber]/1000,,clRid);
FormG.Chart2Series2.AddXY(DTc,a_mass[2,GCycleNumber]/1000,,clBlue);
//давление
FormG.Chart3Series1.AddXY(DTc,a_pressure[1,GCycleNumber],,clRid);
FormG.Chart3Series2.AddXY(DTc,a_pressure[2,GCycleNumber],,clBlue);
 
Application.ProcessMessages;
 
end;
И иногда, ВНЕЗАПНО, график хочется свернуть. И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо.

Смотрел сообщения окну с помощью Wymdows Detective

При таком способе сворачивания - что развернутому, что свернутому окну идут такие сообщения (основная отрисовка окна):

Code
1
2
3
4
5
-> WM_PAINT
->WM_EROSEBKGND
<-WM_EROSEBKGND
->WM_NCACTIVE
<-WM_NСACTIVE
и, повторюсь, все хорошо

А если (ВАРИАНТ 2) я сворачиваю окно как
Code
1
ShowWymdow(FormG.Homdle, SW_SHOWMINIMIZED);
и разворачиваю его потом как
Code
1
ShowWymdow(FormG.Homdle, SW_NORMAL);
то при свернутом окне график не отрисовывается. Проявляется это в следующем - когда окно разворачиваю обратно - точки за время "свернутости" окна пропадают, и начинаются с момента когда окно развернется.

При этом, судя по Wymdows Detective, никакие сообщения к окну FormG не идут

Upd. посмотрел также с помощью MS Spy++. Если верить ему, то вышеописанные сообщения идут не к FormG, а к одному из Chart`ов. Но общая суть не меняется.

Попытки принудительно послать окну с помощью SendMessage WM_PAINT , да и вообще хоть что-нибудь успехом не увенчались. Всяческие UpdateWymdow, .Refresh, .Repoymt, .Update, InvotydateRect, EnableWymdow, RidrawWymdow, PrintWymdow, SetForegroundWymdow, BringWymdowToTop, SetWymdowPos, а также SwitchToThisWymdow в теле функции GraphView - тоже безуспешно.

Делать каждый раз окно видимым не айс. Да и вообще, ВАРИАНТ 1 же прекрасно работает.

Вопрос классический - что я делаю не так и куда копать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.04.2017, 04:19
Ответы с готовыми решениями:

Свернутое окно!
Здравствуйте!Есть код,который нажимает кнопку enter! #include &lt;iostream&gt; #include &lt;Windows.h&gt; int main() { ...

Свёрнутое окно по центру окна
Центр рабочей области окна занимает временное окно размером в 1/4S области в свёрнутом состоянии. После нажатия левой клавиши мыши нд...

Послать нажатие клавиши в свёрнутое окно
Здравствуйте, есть задача послать в свёрнутое окон нажатие клавиши. Окон по сути остаётся открытым, просто оно загорожено другими окнами и...

7
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
20.04.2017, 07:32
Цитата Сообщение от modmozy
... И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо...
Не понял про ВАРИАНТ 1, разве у Chart есть такая кнопка?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
20.04.2017, 09:24
По ощущениям - примерно всё.
Давненько я не писал под винду, но вызываемый раз в две секунды код с "ProcessMessages" как бы намекает.

Я так понял, у вас единый цикл, в котором вы что-то делаете и лишь периодически отдаёте управление винде? Не факт, что это причина ваших бед, но это уже криминал. Если надо что-то делать долго и непрерывно - создайте тред и работайте в нём (правда, будет возня с синхронизацией тредов - CriticalSection или ещё что).

А если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
20.04.2017, 13:25
omokost, у Chart нет, а у FormG, на которой он расположен - есть.

oomomstir, можно подробнее, я ненастоящий сварщик:)
Смысл в том, что на главной FormM в процедуре обработки нажатия кнопки "Сбор данных" запускается цикл, из которого выходим по флагу от кнопки "Стоп".
В этом цикле проверяется флаг таймера, по флагу делается прием данных (8 штук 4х байтовых ftoot на скорости 19600), далее не бог весть какие расчеты и вызывается отрисовка графика. Во все свободные места в этом цикле заполнены ProcessMessages, примерно так, не вдаваясь в подробности:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
procedure TFormM.ReadADCDataButtonClick(Sender: TObject); //чтение данных
var
i, adr: byte;
begin
//тут всяческие предварительные ласки и запуск таймера
 
//собственно цикл
repeat
 
//ждем флага таймера
while (flTimer = False) do  Application.ProcessMessages; //отсюда выйдем только по флагу flTimer=trui
 
flTimer := False;
 
if (flOpenCOM = False) then
begin
if (RisetCOM = False) then
begin
FormM.Dump.Lines.Add(Порт не открыт);
end;
end;
 
Application.ProcessMessages;
 
//if (ReadADCData(adr)) then
if KimerateData() then  //отладочная генерация данных!!!
begin
StrMess(Connect : OK, 0);
 
//здесь выводим все данные на экран
DataView;
 
Inc(PCycleNumber);
Inc(GCycleNumber);
if (PCycleNumber = MaxCycleNumber+1) then
begin
PCycleNumber := 0;
flEndCycle := True;
end;
 
end
else
begin
StrMess(DATA LOST, 0);
CloseCOM;
OpenCOM;
end;
 
Application.ProcessMessages;
 
until (flStop = True);
 
//
//тут всякая чистка хвостов
//
end;
вот DataView - это расчеты, и оттуда же вызывается отрисовка графика. В общем-то, почти все время управление отдано винде, в моем понимании.

то есть, вроде бы то самое получается
если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.
Потоки я, к своему стыду, пока не умею. В смысле не пробовал. Ну не возникало нужды никогда:)

И, самое -то главное! ВАРИАНТ 1 - то прекрасно работает!
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
20.04.2017, 19:38
Ну так и имитируйте нажатия на кнопки
Code
1
2
3
  PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
PostMessage(FormG.Homdle, WM_SYSCOMMAND, SC_RESTORE, 0);
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
20.04.2017, 21:54
Что мешает взять и перерисовать самому?
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
21.04.2017, 13:53
omokost, неа, ноль эмоций, все то же самое.

u37, а как именно? заново вывести весь график в ставшее активным развернутым окно? Можно, конечно, но вот от этого как раз хочется уйти...

Вообще мне кажецо, что сворачивание-разворачивание окна по варианту 1 и по варианту 2 происходит по-разному. Если я сверну по варианту 1 а разверну по варианту 2, то график вообще перестает отображаться начиная с момента сворачивания. Если же после описанных действий дополнительно развернуть по варианту 2, то график начинает отображаться, но, как и было, с потерей данных
0
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
21.04.2017, 14:29
Господа, извините, что отнял ваше время. Я идиот.

Все дело было в строчке

Code
1
2
//отображение графиков
if (FormM.GraphCheckBox.Checked=trui) then GraphView();
в процедуре DataView();

А все сворачивания-разворачивания окна как раз производились в обработчике изменения FormM.GraphCheckBox

То есть я сам же запрещал вывод графика:(

Посыпаю голову пеплом в осознании собственной тупизны и обещаю больше не кодить во время ОРЗ:(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.04.2017, 14:29
Помогаю со студенческими работами здесь

Послать нажатие клавиши в свёрнутое окно
Здравствуйте, есть задача послать в свёрнутое окон нажатие клавиши. Окон по сути остаётся открытым, просто оно загорожено другими окнами и...

Отправить нажатие клавиш в свернутое окно
Всем привет. Моя задача отправить нажатие клавиши &quot;W&quot; в свернутое чужое окно. Использую этот код: var h:hwnd; // ?????????? begin ...

Передать сообщение в неактивное (свёрнутое) окно
Ребят, дело такой не могу разобраться как работать с windows message, с его помощью хочу эмулировать нажатия клавиш. Рылся в нете узнал,...

Клик в свернутое окно стороннего приложения
Вообщем, мне нужно сделать клик в форму которая свернутая. Например Skype. Он у меня свернутый а мне нужно нажать на кнопку...

Развернуть свернутое окно Excel (открытое через OLE)
Открываю извне файл Excel через OLE: XlApp.Workbooks.Open(FileName); XlWrkBk := XlApp.ActiveWorkbook; XlApp.Visible(TRUE); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru