Вверх ↑
Этот топик читают: Гость
Ответов: 1706
Рейтинг: 149
#1: 2019-07-08 19:43:06 ЛС | профиль | цитата
Add(Edit,4537472,280,154)
{
@Hint=#7:Фамилия|
Left=70
Top=10
Width=130
TabOrder=1
Ctl3D=1
Text="Иванов"
Point(onPaint)
link(onPaint,7074271:doWork2,[])
}
Add(Label,15555315,280,112)
{
@Hint=#7:Фамилия|
Left=10
Top=15
Width=56
Height=17
Color=6718159
Caption="Фамилия:"
Point(onPaint)
link(onPaint,1883189:doWork2,[])
}
Add(BitBtn,15150872,280,217)
{
Left=30
Top=40
Width=35
Height=35
Color=6718159
TabOrder=2
Hint="Добавить из базы"
Caption=""
Bitmap=[ZIP3609000078DA73F235E36400033320D600620928666450804840E591C1FFFFFFF1E2D344A82117AF009A0DC3D4367B27D4DC39507A271E3B606E9808C5C4980F0B1798DB718513CCDE3950B74C24D1AF3B89548FEC5752CC27267E91CD24D5FC3B04D423FB6F2795D3012DD3EE1D0ACCE66D58851553C35DECBDBB193CAFBE6350BEFE8FC1ECE63F86FC67FF197A9FFF6270D97597623B4066F7FCFEC710F9EA1F86F99E071F3370CC3D4F911D94987F9A401EA786FB09955520F337FFF9C7B0EDDB7F86635FFF333CFAF98FE1F56F08BDFEC96786987DF751CC07A52198BB5720950FAD38EC0099BFEBDD3706833D771904975F62109A7F9A4161D16906D3E56719D426ED679874EE09C5EEF73A7A1767F8B0356D1BD0F01FCAE99358F32702D34FD38FFF0CF9405CF5EF3F98BF0088936F7D65E05D748562F3FFFDF9C1F005C8BE0CC4A0B40AC26B816C1006D9496919C133E900D87C509A3F0E3517E4FED9BFFF3008B7AEA75A19870D936316002CFEC18C]
Point(onPaint)
link(onPaint,7074271:doWork3,[(368,230)])
}
Add(Img_Point,14270471,462,119)
{
}
Add(HubEx,1883189,364,119)
{
link(onEvent,14270471:doDraw,[])
}
Add(HubEx,7074271,364,168)
{
Angle=3
link(onEvent,1883189:doWork3,[])
}

И вот такой результат.

Что за глюки с onPaint? Так и не смог понять, что в коде (pas) не так.

ps. У светодиода (LED) OnPaint работает нормально:
Add(LED,6626431,329,336)
{
Left=30
Top=80
Width=35
Height=35
Color=6718159
Point(onClick)
Point(Handle)
Point(onPaint)
link(onClick,6626431:doChangeValue,[(373,349)(373,345)(317,345)(317,342)])
link(onPaint,8963850:doWork1,[])
}
Add(LineBreak,10385927,336,378)
{
Type=1
link(Data,6626431:Handle,[])
Primary=[895121,56,-56]
}
Add(MultiElement,8963850,392,350)
{
@Hint=#24:Знак Power на светодиоде|
link(Data1,895121:Var,[])
}
BEGIN_SDK
Add(EditMulti,6665014,21,21)
{
WorkCount=1
DataCount=1
link(doWork1,2522156:doDraw,[(42,27)(42,83)])
}
Add(Img_Ellipse,2522156,63,77)
{
Point1=655370
Point2=983055
Point2AsOffset=0
DrawSource=1
Size=2
Color=-16777208
link(onDraw,10251529:doDraw,[])
link(Bitmap,13688848:Var2,[])
}
Add(Img_Line,10251529,112,77)
{
Point1=458769
Point2=983057
DrawSource=1
Size=2
Color=-16777208
link(Bitmap,13688848:Var3,[(118,61)])
}
Add(GetDataEx,13688848,63,56)
{
link(Data,6665014:Data1,[(69,38)(27,38)])
}
END_SDK

Редактировалось 1 раз(а), последний 2019-07-08 19:43:39
карма: 5
0
файлы: 1onpaintbug.png [2KB] [152]
vip
#1.1контекстная реклама от партнеров
Ответов: 1706
Рейтинг: 149
#2: 2019-07-09 16:28:54 ЛС | профиль | цитата
Почему тишина? У остальных глюк повторяется?
карма: 5
0
Ответов: 299
Рейтинг: 5
#3: 2019-07-09 21:26:40 ЛС | профиль | цитата
У меня все нормально отображается

карма: 2

0
Разработчик
Ответов: 25459
Рейтинг: 2070
#4: 2019-07-10 12:18:44 ЛС | профиль | цитата
3042 писал(а):
Что за глюки с onPaint?

Вообще-то onPaint предполагает, что контекст будет отрисован вручную. Led же отрисовывается вручную перехватом onPaint в самом коде, а сам onPaint наружу выдается уже после отрисованного контрола, те можно дорисовать чего-либо на контексте Led.

Редактировалось 1 раз(а), последний 2019-07-10 12:19:07
карма: 19

0
Ответов: 1706
Рейтинг: 149
#5: 2019-07-10 13:20:26 ЛС | профиль | цитата
nesco писал(а):
сам onPaint наружу выдается уже после отрисованного контрола, те можно дорисовать чего-либо на контексте Led.

По-моему, так должно быть и в других компонентах, иначе просто пропадает смысл в этом событии. Если у кнопки есть OnPaint - это не значит, что она не должна отрисовываться: если мне нужно что-то отрисовать с нуля, я возьму PaintBox. Следовательно, другие компоненты должны автоматически отрисовываться, а по OnPaint уже программист добавляет свои каракули.

Я тут проверил: в Win.pas, в ф-ции SetOnPaint происходит назначение обработчика Control.OnPaint := _OnPaint;, и именно эта строчка отключает отрисовку. Что же происходит с отрисовкой?
карма: 5
0
Ответов: 3910
Рейтинг: 620
#6: 2019-07-10 14:47:33 ЛС | профиль | цитата
Вероятно, надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint. Вот только я не в курсе как это согласуется с принципами работы окон Windows.

Редактировалось 1 раз(а), последний 2019-07-10 16:22:14
карма: 19

0
Ответов: 299
Рейтинг: 5
#7: 2019-07-10 16:10:52 ЛС | профиль | цитата
Вы тут спорите, я извиняюсь, а что не так, или что должно быть? По схеме не понятно, я так понял точки на Label и Edit у 3042 появляются не в тему, вот и на вопрос ответил, у меня нормально отображается. Может я первую схему не понял. Я в рисовании с вкладкой не совсем дружу просто
карма: 2

0
Ответов: 9810
Рейтинг: 340
#8: 2019-07-10 16:33:25 ЛС | профиль | цитата
3042 писал(а):
По-моему, так должно быть и в других компонентах, иначе просто пропадает смысл в этом событии

Так сделано в библиотеке (все правильно nesco сказал, просто забыл это добавить).
Можно сделать библиотеку самому. То чего предлагает Netspirit:
Netspirit писал(а):
надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint

-- это и есть начало сего неблагодарного процесса.

Как-то так...

Редактировалось 1 раз(а), последний 2019-07-10 16:34:27
карма: 8

0
Ответов: 1706
Рейтинг: 149
#9: 2019-07-10 22:46:49 ЛС | профиль | цитата
Sersey писал(а):
точки на Label и Edit у 3042 появляются не в тему, вот и на вопрос ответил, у меня нормально отображается.

Точки - это точки с поля hiasm Потому что Label и Edit не отрисовываются - вот и остаётся то, что было под ними (если запустить прогу с рабочего стола - на месте Label и Edit будет кусок обоев).

--- Добавлено в 2019-07-10 22:50:36

Galkov писал(а):
То чего предлагает Netspirit:
Netspirit писал(а):
надо самому перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего самому вызывать OnPaint

-- это и есть начало сего неблагодарного процесса.

Остаётся надеяться, что хватит одной правки Win.pas - вместо назначения обработчика Control.OnPaint := _OnPaint -
Netspirit писал(а):

надо ... перехватывать событие WM_PAINT, передавать его дефолтной процедуре обработки сообщений, после чего ... вызывать OnPaint


Редактировалось 4 раз(а), последний 2019-07-10 22:54:09
карма: 5
0
9
Сообщение
...
Прикрепленные файлы
(файлы не залиты)