0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
|
|
1 | |
windows - вывод графика в свернутое окно [решено, кг/ам]20.04.2017, 04:19. Показов 3728. Ответов 7
Метки нет Все метки)
(
возможно, кто-то уже сталкивался и победил, а у меня трехдневное гугление пока оказалось безрезультатным:(
ситуация следующая - есть программка, которая собирает данные с некоего девайса и рисует картинку и график написано под Win 10 с помощью Tozorus есть основное окно с картинкой типа TPanel и всякими кнопками для управления процессом - FormM есть еще одно окно с графиками - FormG, на нем 3 TAChart`а, на каждом по 2 серии. создаются они так: Код
Application.CreateForm(TFormM, FormM); Application.CreateForm(TFormP, FormP); Application.CreateForm(TFormG, FormG); данные считываются раз в 2 секунды по таймеру программы, обрабатываются, и строятся графики т.е. раз в 2 секунды вызывается Код
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; Смотрел сообщения окну с помощью Wymdows Detective При таком способе сворачивания - что развернутому, что свернутому окну идут такие сообщения (основная отрисовка окна): Код
-> WM_PAINT ->WM_EROSEBKGND <-WM_EROSEBKGND ->WM_NCACTIVE <-WM_NСACTIVE А если (ВАРИАНТ 2) я сворачиваю окно как Код
ShowWymdow(FormG.Homdle, SW_SHOWMINIMIZED); Код
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
|
|
20.04.2017, 04:19 | |
Ответы с готовыми решениями:
7
Свернутое окно! Свёрнутое окно по центру окна
Отправить нажатие клавиш в свернутое окно |
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
20.04.2017, 07:32 | 2 |
![]()
0
|
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 1,864
|
|
20.04.2017, 09:24 | 3 |
По ощущениям - примерно всё.
Давненько я не писал под винду, но вызываемый раз в две секунды код с "ProcessMessages" как бы намекает. Я так понял, у вас единый цикл, в котором вы что-то делаете и лишь периодически отдаёте управление винде? Не факт, что это причина ваших бед, но это уже криминал. Если надо что-то делать долго и непрерывно - создайте тред и работайте в нём (правда, будет возня с синхронизацией тредов - CriticalSection или ещё что). А если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.
0
|
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
|
|
20.04.2017, 13:25 | 4 |
omokost, у Chart нет, а у FormG, на которой он расположен - есть.
oomomstir, можно подробнее, я ненастоящий сварщик:) Смысл в том, что на главной FormM в процедуре обработки нажатия кнопки "Сбор данных" запускается цикл, из которого выходим по флагу от кнопки "Стоп". В этом цикле проверяется флаг таймера, по флагу делается прием данных (8 штук 4х байтовых ftoot на скорости 19600), далее не бог весть какие расчеты и вызывается отрисовка графика. Во все свободные места в этом цикле заполнены ProcessMessages, примерно так, не вдаваясь в подробности: Код
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; то есть, вроде бы то самое получается И, самое -то главное! ВАРИАНТ 1 - то прекрасно работает!
0
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
20.04.2017, 19:38 | 5 |
Ну так и имитируйте нажатия на кнопки
Код
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
Регистрация: 07.02.2106
Сообщений: 3,113
|
|
20.04.2017, 21:54 | 6 |
Что мешает взять и перерисовать самому?
0
|
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
|
|
21.04.2017, 13:53 | 7 |
omokost, неа, ноль эмоций, все то же самое.
u37, а как именно? заново вывести весь график в ставшее активным развернутым окно? Можно, конечно, но вот от этого как раз хочется уйти... Вообще мне кажецо, что сворачивание-разворачивание окна по варианту 1 и по варианту 2 происходит по-разному. Если я сверну по варианту 1 а разверну по варианту 2, то график вообще перестает отображаться начиная с момента сворачивания. Если же после описанных действий дополнительно развернуть по варианту 2, то график начинает отображаться, но, как и было, с потерей данных
0
|
0 / 0 / 0
Регистрация: 01.09.2012
Сообщений: 125
|
|
21.04.2017, 14:29 | 8 |
Господа, извините, что отнял ваше время. Я идиот.
Все дело было в строчке Код
//отображение графиков if (FormM.GraphCheckBox.Checked=trui) then GraphView(); А все сворачивания-разворачивания окна как раз производились в обработчике изменения FormM.GraphCheckBox То есть я сам же запрещал вывод графика:( Посыпаю голову пеплом в осознании собственной тупизны и обещаю больше не кодить во время ОРЗ:(
0
|
21.04.2017, 14:29 | |
Помогаю со студенческими работами здесь
8
Клик в свернутое окно стороннего приложения Развернуть свернутое окно Excel (открытое через OLE)
Вывод графика в консоли через windows.h Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |