Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];

Вниз

Мерцает (подмаргивает) крупный текст на панели.   Найти похожие ветки 

 
RZD ©   (2015-08-15 11:57) [0]

На панель выводится крупный текст (Font.Height = 100). Сам текст представляет число (содержимое некоего счетчика событий). Конкретно - данные с абсолютного энкодера одной из осей металлорежущего станка. Это число выводится постоянно в обработчике события таймера, который работает с интервалом в 30 миллисекунд.

Panel1.Caption:= "X " + IntToStr(Long_Result);

Если число не изменяется (нет перемещения оси станка), то все нормально. Если число изменяется (есть перемещение оси станка), то число (текст) на панели начинает хаотично мерцать (подмаргивать). Как избавиться от этого мерцания?


 
megavoid ©   (2015-08-15 13:43) [1]

О, типичный "дребезг контактов".

Попробуйте установить форрме doublebuffered := true, если не поможет, придётся выводить ещё медленнее.


 
DVM ©   (2015-08-15 14:44) [2]


>  Это число выводится постоянно в обработчике события таймера,
>  который работает с интервалом в 30 миллисекунд.

1) Наблюдателю (человеку) очень нужно каждые 30 миллисекунд видеть обновленные значения? Он что супермен? 3-4 раза в секунду будет за глаза.
2) Все мерцание от стирания фона. doublebuffered должно помочь на пару с 1)


 
RZD ©   (2015-08-15 20:07) [3]

DoubleBuffered (для формы) пробовал (ранее). Не канает. Никакого толка. У компонента TPanel свойства DoubleBuffered нет. Интервал таймера не при чем. Даже при увеличении интервала таймера до 1000 миллисекунд это явление наблюдается, только меньше "глаз режет". При выводе неизменного текста (числа) на Panel.Caption даже при интервале таймера 10 миллисекунд - никаких мерцаний.
Наверное на мой вопрос сможет ответить человек, который практически сталкивался с этой "хренью" и ее победил. Но где такого найти?
В.И.Ленин сказал: "Электрон так же неисчерпаем, как и атом".
Так же неисчерпаем и DELPHI.
P.S. предполагаю, что решение проблемы крайне просто. Но мне оно неизвестно.


 
DVM ©   (2015-08-15 20:58) [4]


> RZD ©   (15.08.15 20:07) [3]


> P.S. предполагаю, что решение проблемы крайне просто. Но
> мне оно неизвестно.

Я уже сказал, что причина мерцания - стирание фона. При изменении текста на панели она перерисовывается полностью и ей сначала приходит сообщение WM_ERASEBKGND при получении которого фон стирается. Затем ей приходит WM_PAINT и она рисует текст. Само рисование занимает какое то время + между сообщениями есть какой то разрыв и получается, что какое то время панель оказывается стерта, но текст еще не выведен - отсюда и мерцание. Побеждается обычно включением буферизации (странно, что в твоем случае не помогает).
Буферизацию несложно сделать и самому - для этого и фон и текст рисуют заранее вместе на заранее заготовленном битмапе, а затем копируют его на поверхность панели.


 
NoUser ©   (2015-08-15 22:07) [5]

Label1.Caption := "X " + IntToStr(Long_Result);
и как Long_Result получает новые значения ?


 
RZD ©   (2015-08-15 23:57) [6]

Как Long_Result получает новые значения - это абсолютно неважно, хотя аппаратно эти значения передаются через канал USB (да хоть через космос).
Важно то, что эта "хрень" проявляется тогда, когда
Label1.Caption(OLD) <> Label1.Caption(NEW). Если они равны - нет никакой "замути", типа - нет физической перезаписи Label1.Caption(OLD). Пробовал обмануть компилятор всяко-разно. Бесполезно.


 
RZD ©   (2015-08-16 00:23) [7]


> Буферизацию несложно сделать и самому - для этого и фон
> и текст рисуют заранее вместе на заранее заготовленном битмапе,
>  а затем копируют его на поверхность панели.

DVM подскажи, как это сделать. Я пробовал организовать невидимую панель, на которой сначала прописывал новое значение PanelN.Caption, а а потом копировал в видимую панель
Panel1.Caption:= PanelN.Caption. Но это не помогло. Я электронщик-аппаратчик и программированием вынужден заниматься только изредка (когда прижмет какая-нибудь проблема).


 
Германн ©   (2015-08-16 00:54) [8]


> RZD ©   (15.08.15 11:57)  

Никакого мерцания в тестовом проекте не вижу. Интервал таймера 30мс.
Д2007. W7.


 
RZD ©   (2015-08-16 12:17) [9]


> Никакого мерцания в тестовом проекте не вижу. Интервал таймера
> 30мс.
> Д2007. W7.

Спасибо. Любое сообщение несет в себе информацию. Тоже сделаю тестовую программку с 3-мя панелями X,Y,Z , в Panel.Caption которых по таймеру записывается содержимое некоего псевдо-счетчика. Эту программку (EXE файл) проверю на разных компах. Может тогда ясность появится.


 
megavoid ©   (2015-08-16 12:43) [10]


procedure TForm1.Timer1Timer(Sender: TObject);
begin
 Panel1.Caption := "X" + IntToStr( 30 + Random (2) );
end;


DXE8, W8(server)
При 30 мерцает, причём вся панель перерисовывается, при 100 уже нет.
Кстати, в XE8 у панели тоже есть doublebuffered, но в этом тесте она ни на что не влияет.


 
RZD ©   (2015-08-16 15:06) [11]


>
> Спасибо. Любое сообщение несет в себе информацию. Тоже сделаю
> тестовую программку с 3-мя панелями X,Y,Z , в Panel.Caption
> которых по таймеру записывается содержимое некоего псевдо-
> счетчика. Эту программку (EXE файл) проверю на разных компах.
>  Может тогда ясность появится.



> DXE8, W8(server)
> При 30 мерцает, причём вся панель перерисовывается, при
> 100 уже нет.


Программку составил с 3-мя панелями и кнопками "ПУСК","СТОП" и "ZERO".
Проверил на 3-х компах с разным количеством ядер и разными видюхами. Везде наблюдаются горизонтальные сполохи цвета фона панели и при интервале таймера 30 миллисек. и при 100 миллисек. и при других интервалах.
Вообще что ли от панели отказаться? Тогда что выбрать вместо панели?


 
Leonid Troyanovsky ©   (2015-08-16 17:48) [12]


> RZD ©   (15.08.15 20:07) [3]

> DoubleBuffered (для формы) пробовал (ранее). Не канает.
> Никакого толка. У компонента TPanel свойства DoubleBuffered
> нет.

В обработчике OnCreate формы Panel1.DoubleBuffered := True;

--
Regards, LVT.


 
RZD ©   (2015-08-16 18:42) [13]


> В обработчике OnCreate формы Panel1.DoubleBuffered := True;


Ура-аааа! Ура-аааа! Ура-аааа! Заработало-оооо! На DELPHI-2007.
Leonid Troyanovsky лично Вам и всем, кто откликнулся на мой вопрос: огромное СПАСИБО!

P.S. Мастерство - не пропьешь!


 
sniknik ©   (2015-08-17 01:00) [14]

Удалено модератором


 
Германн ©   (2015-08-17 01:27) [15]

Удалено модератором


 
RZD ©   (2015-08-17 10:35) [16]

Удалено модератором


 
RZD ©   (2015-08-18 23:41) [17]

Удалено модератором


 
RZD ©   (2015-08-18 23:41) [18]

Удалено модератором



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2017.04.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.002 c
2-1439826143
igel888
2015-08-17 18:42
2017.04.16
Вопрос по Locate


2-1440917515
K-1000
2015-08-30 09:51
2017.04.16
BOOL -> Boolean


2-1440002554
Той
2015-08-19 19:42
2017.04.16
Как узнать все методы имеющиеся в объекте OleVariant ?


15-1460411018
KilkennyCat
2016-04-12 00:43
2017.04.16
12 апреля 1961 года, Ю. А. Гагарин, «Восток-1», «Байконур»


2-1440148888
lewka
2015-08-21 12:21
2017.04.16
BorderStyle для MDIForm





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский