Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#16: 2015-01-18 03:20:21 правка | ЛС | профиль | цитата


Редактировалось 6 раз(а), последний 2021-06-24 08:11:58
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#17: 2015-01-18 03:26:13 правка | ЛС | профиль | цитата


Редактировалось 6 раз(а), последний 2021-06-24 08:11:58
карма: 0

0
Ответов: 84
Рейтинг: 1
#18: 2015-01-18 03:28:46 ЛС | профиль | цитата
Извиняюсь, что напостил лишнего - не заметил, что не авторизовался.
карма: 1

0
Ответов: 8926
Рейтинг: 823
#19: 2015-01-18 10:55:01 ЛС | профиль | цитата
NordWest, пройдитесь мышкой по точкам, внимательно читая примечания - в них есть ответы, а с правой стороны поля панель "Свойства" с подразделом "Точки" и там этих точек пропасть, в т. ч. doSelect
карма: 19

0
Разработчик
Ответов: 26151
Рейтинг: 2127
#20: 2015-01-18 12:23:38 ЛС | профиль | цитата
Леонид, а ничего, что
178.23.6.225 писал(а):
Пытаюсь управлять элементами другого окна

карма: 22

0
Ответов: 2265
Рейтинг: 676
#21: 2015-01-18 14:02:48 ЛС | профиль | цитата
178.23.6.225 писал(а):
но SendMessage не содержит такого сообщения.
У элемента SendMessage, есть точка Message на которую нужно подать номер сообщения. Номер сообщения можете "нагуглить".
карма: 11

0
Ответов: 4630
Рейтинг: 749
#22: 2015-01-18 14:04:53 ЛС | профиль | цитата
178.23.6.225 писал(а):
SendMessage не содержит такого сообщения
На панели "Точки" включить точку Message и с помощью Memory подать на неё код нужного сообщения.
------------ Дoбавленo в 14.04:
[offtop]Блин, надо же [/offtop]
карма: 26

0
Ответов: 8926
Рейтинг: 823
#23: 2015-01-18 14:06:45 ЛС | профиль | цитата
nesco писал(а):
Леонид, а ничего, что..
ой, здесь чего
Тогда наброски с IC code_34934.txt
карма: 19

0
файлы: 1code_34934.txt [3.8KB] [551]
Ответов: 84
Рейтинг: 1
#24: 2015-01-19 00:01:21 ЛС | профиль | цитата
sla8a писал(а):
Номер сообщения можете "нагуглить".

Запарился если честно гуглить - везде описание, а вот кодов как то не попадалось.
Но потом наткнулся на ресурс где всё же добыл желаемое. Кое что даже стало получаться...

code_34936.txt
карма: 1

1
файлы: 1code_34936.txt [2.4KB] [449]
Голосовали:sla8a
Ответов: 84
Рейтинг: 1
#25: 2015-01-20 00:09:22 ЛС | профиль | цитата
Продолжаю копаться в сообщениях...
С простыми сообщениями не требующими передачи параметров всё более менее понятно. А вот с более сложными не могу разобраться.
У компонента SendMessage есть два входных параметра - WParam и LParam.
Пытаюсь разобраться с сообщением cb_FindString Читаю мануал...
cb_FindString
Находит пеpвый элемент блока списка комбиниpованного блока, соответствующий пpефиксной стpоке.

Паpаметpы:
wParam: Является индексом, с котоpого должен начинаться поиск. Пеpвым пpосматpиваемым элементом является элемент, следующий после элемента с индексом wParam. Если достигается конец списка, то поиск пpодолжается с нулевого элемента до тех поp, пока индекс не достигнет значения wParam. Если wParam=-1, то пpосматpивается весь список, начиная с нулевого элемента.

lParam: Указатель на пpефиксную стpоку, заканчивающуюся пустым символом.

Возвpащаемое значение:

В случае успеха возвpащается индекс пеpвого совпадающего элемента, в пpотивном случае, возвpащается cb_Err.


Как я понимаю в wParam я должен задать индекс, с которого будет стартовать перебор, а вот что задавать в lParam вообще не врубаюсь.

code_34940.txt
карма: 1

0
файлы: 1code_34940.txt [4.2KB] [449]
Ответов: 9906
Рейтинг: 351
#26: 2015-01-20 08:34:55 ЛС | профиль | цитата
В принципе, это делается примерно так:
Add(MainForm,8334998,567,70)
{
Width=318
Height=364
Caption="Управление элементами окна"
Point(onKeyDown)
Point(Handle)
link(onCreate,1165461:doFind,[])
}
Add(Memo,9721830,819,343)
{
Left=20
Top=225
Width=260
Height=85
ScrollBars=2
}
Add(FindWindow,1165461,623,84)
{
ClassName="obj_Form"
Caption="Управление элементами окна"
link(onFind,3653999:doFindChild,[])
}
Add(FindWindow,15939415,679,343)
{
ClassName="obj_COMBOBOX"
SkipParam=1
link(onFind,14481733:doSendMessage,[])
link(ParentHandle,16018623:Var,[])
}
Add(SendMessage,14481733,749,343)
{
Point(Message)
link(onSend,9721830:doAdd,[])
link(Handle,1381670:Var,[(755,334)(741,334)(741,411)(685,411)])
link(WParam,11491058:Text,[])
link(LParam,7728158:Var,[(769,306)(629,306)])
link(Message,9697802:Var,[])
}
Add(DoData,6923920,469,308)
{
link(onEventData,8878466:doEvent1,[])
link(Data,6225669:Text,[])
}
Add(Button,12440954,413,308)
{
Left=20
Top=175
Width=260
Caption="Отправить сообщение"
link(onClick,6923920:doData,[])
}
Add(IntegerArray,9153682,770,133)
{
IntArray=['CB_ADDSTRING'=323,'CB_DELETESTRING'=324,'CB_DIR'=325,'CB_FINDSTRING'=332,'CB_FINDSTRINGEXACT'=344,'CB_GETCOUNT'=326,'CB_GETCURSEL'=327,'CB_GETDROPPEDCONTROLRECT'=338,'CB_GETDROPPEDSTATE'=343,'CB_GETDROPPEDWIDTH'=351,'CB_GETEDITSEL'=320,'CB_GETEXTENDEDUI'=342,'CB_GETHORIZONTALEXTENT'=349,'CB_GETITEMDATA'=336,'CB_GETITEMHEIGHT'=340,'CB_GETLBTEXT'=328,'CB_GETLBTEXTLEN'=329,'CB_GETLOCALE'=346,'CB_GETTOPINDEX'=347,'CB_INITSTORAGE'=353,'CB_INSERTSTRING'=330,'CB_LIMITTEXT'=321,'CB_MSGMAX'=354,'CB_RESETCONTENT'=331,'CB_SELECTSTRING'=333,'CB_SETCURSEL'=334,'CB_SETDROPPEDWIDTH'=352,'CB_SETEDITSEL'=322,'CB_SETEXTENDEDUI'=341,'CB_SETHORIZONTALEXTENT'=350,'CB_SETITEMDATA'=337,'CB_SETITEMHEIGHT'=339,'CB_SETLOCALE'=345,'CB_SETTOPINDEX'=348,'CB_SHOWDROPDOWN'=335]
UseName=0
}
Add(ArrayRW,10336840,770,182)
{
link(Array,9153682:Array,[])
}
Add(Label,9341551,819,77)
{
Left=20
Top=90
Width=65
Height=17
Caption="Сообщение:"
}
Add(Label,15718932,868,77)
{
Left=20
Top=120
Width=41
Height=17
Caption="String"
}
Add(Label,5683312,917,77)
{
Left=195
Top=120
Width=60
Height=17
Caption="WParam"
}
Add(Edit,6225669,469,245)
{
Left=20
Top=140
Width=165
Text="Пункт2"
}
Add(Edit,11491058,756,245)
{
Left=190
Top=140
Width=65
Text="0"
DataType=2
}
Add(Label,8465279,966,77)
{
Left=20
Top=205
Width=37
Height=17
Caption="Ответ:"
}
Add(ChildPanel,6140200,770,77)
{
}
BEGIN_SDK
Add(EditMulti,1666175,21,21)
{
}
Add(Panel,12487912,49,70)
{
Left=20
Top=10
Width=262
Height=69
}
Add(ComboBox,13277300,105,126)
{
Left=150
Top=20
Width=95
Height=24
Strings=#6:Пункт1|6:Пункт2|6:Пункт3|
Text=""
}
Add(Label,12146243,105,70)
{
Left=10
Top=25
Width=136
Height=17
Caption="Объект для опытов:"
}
END_SDK
Add(FindWindow,3653999,679,77)
{
ClassName="obj_STATIC"
SkipParam=1
link(ParentHandle,12424888:Var,[(685,68)(671,68)(671,152)(629,152)])
}
Add(ComboBox,4188647,714,175)
{
Left=90
Top=90
Width=190
Height=21
Strings=#12:CB_ADDSTRING|16:CB_DELETESTRING |6:CB_DIR|14:CB_FINDSTRING |19:CB_FINDSTRINGEXACT |11:CB_GETCOUNT|12:CB_GETCURSEL|25:CB_GETDROPPEDCONTROLRECT |19:CB_GETDROPPEDSTATE |19:CB_GETDROPPEDWIDTH |13:CB_GETEDITSEL|16:CB_GETEXTENDEDUI|23:CB_GETHORIZONTALEXTENT |14:CB_GETITEMDATA|17:CB_GETITEMHEIGHT |12:CB_GETLBTEXT|16:CB_GETLBTEXTLEN |12:CB_GETLOCALE|14:CB_GETTOPINDEX|14:CB_INITSTORAGE|15:CB_INSERTSTRING|12:CB_LIMITTEXT|10:CB_MSGMAX |16:CB_RESETCONTENT |15:CB_SELECTSTRING|12:CB_SETCURSEL|19:CB_SETDROPPEDWIDTH |14:CB_SETEDITSEL |16:CB_SETEXTENDEDUI|23:CB_SETHORIZONTALEXTENT |14:CB_SETITEMDATA|16:CB_SETITEMHEIGHT|12:CB_SETLOCALE|14:CB_SETTOPINDEX|15:CB_SHOWDROPDOWN|
Text="не выбрано"
link(onClick,10336840:doRead,[])
}
Add(MemoryStream,9156883,609,245)
{
Point(Memory)
Point(doSize)
}
Add(DataToFile,14836274,609,315)
{
Type=6
link(Stream,9156883:Stream,[])
}
Add(Hub,8878466,518,308)
{
OutCount=3
link(onEvent1,4070461:doData,[(543,314)(543,265)])
link(onEvent2,14836274:doPut,[])
link(onEvent3,15939415:doFindChild,[(599,328)(599,356)])
}
Add(DoData,4070461,553,259)
{
Data=Integer(0)
link(onEventData,9156883:doSize,[])
}
Add(Debug,1381670,679,392)
{
WEName=""
VDName="hnd0"
link(Data,15939415:Handle,[])
}
Add(Debug,9697802,770,287)
{
WEName=""
VDName="msg"
link(Data,10336840:Item,[])
}
Add(Debug,7728158,623,287)
{
WEName=""
VDName="Mem"
link(Data,9156883:Memory,[])
}
Add(Debug,12424888,623,133)
{
WEName=""
VDName="hnd2"
link(Data,1165461:Handle,[])
}
Add(Debug,16018623,679,196)
{
WEName=""
VDName="hnd1"
link(Data,3653999:Handle,[])
}

Есть замечания:

1) Научись сначала правильно искать окна.
obj_Form - это не только именно твоя форма, но и, к примеру - аплет.
obj_STATIC - это не только именно твоя панель, но и все Label этого уровня.

2) Можно было, выкладывая пример, хотя бы убедиться, что ты работаешь (или не знаешь как работать) с НУЖНЫМ хэндлом.
Сэкономил бы коллегам время, между прочим.

3) Это какой же идиот это переводил: "Указатель на пpефиксную стpоку, заканчивающуюся пустым символом"
Моего образования не хватает, чтобы связать это с оригиналом: "A pointer to the null-terminated string"
Никогда больше не работай с тем ресурсом, где ты добыл этот перевод...
карма: 9

1
Голосовали:NordWest
Ответов: 84
Рейтинг: 1
#27: 2015-01-20 10:21:42 ЛС | профиль | цитата
Galkov, огромное спасибо. Сам бы я к такому решению точно не пришел.

Galkov писал(а):
1) Научись сначала правильно искать окна. obj_Form - это не только именно твоя форма, но и, к примеру - аплет.obj_STATIC - это не только именно твоя панель, но и все Label этого уровня.
А где про это почитать?
Я делал просто. Сторонним софтом смотрел ClassName и Caption и подставлял. Имя главной формы сознательно проигнорировал, т.к. был уверен, что в данном конкретном случае будет работать и так.

Galkov писал(а):
Можно было, выкладывая пример, хотя бы убедиться, что ты работаешь (или не знаешь как работать) с нужным хэндлом.
Не знаю как это сделать.
Я определял, что работаю с нужным хендлом по тому, что получал ожидаемые данные посылая CB_GETCURSEL

Galkov писал(а):
Это какой же идиот это переводил "Указатель на пpефиксную стpоку, заканчивающуюся пустым символом
Судя по имени ресурса это Андрей Платонов - http://platonov-andrei.narod.ru/Delphi/WM_HELP/index.htm
Ничего лучшего в сети по данному вопросу на русском языке не нашел, а с английским у меня туго. Вероятно после прочтения русского описания нужно просматривать и англоязычный вариант...

А если в вашей схеме сделать так? Не криминально?

карма: 1

0
Ответов: 9906
Рейтинг: 351
#28: 2015-01-20 11:51:14 ЛС | профиль | цитата
NordWest писал(а):
А где про это почитать?
Я делал просто. Сторонним софтом смотрел ClassName и Caption и подставлял

А фиг его знает... Про аплета (и кто есть STATIC) я знаю, потому что KOL читал, что советом являться не может.
И я даже не знаю, почему он находит нашу форму по Caption... У аплета Caption тот же, для нашего случая.
А вспоминать стал, после того, как в Debug-ах нулевые хэндлы увидел.
Внимание: УВИДЕЛ. И не надо мне парить про "получаю ответы"
Да, "сторонний софт" - это выход, если он правильный. И он обязан был показать две формы и кучу STATIC.

NordWest писал(а):
Не знаю как это сделать.
Я определял, что работаю с нужным хендлом по тому, что получал ожидаемые данные посылая CB_GETCURSEL

Ну и что, что "не знаю". Мало ли какие сюрпризы дальше будут...
Вообще-то у каждого визульного элемента этот хэндл снизу торчит.
Поэтому, задачу можно поделить на две (если, конечно же, думать об этом): поиск хэндла (скажем, чужого приложения), и посылку сообщения.
Вторую можно решать (искать решение) независимо от первой. Например:
Add(MainForm,8334998,497,77)
{
Width=318
Height=364
Caption="Управление элементами окна"
Point(onKeyDown)
Point(Handle)
}
Add(Memo,9721830,623,350)
{
Left=20
Top=225
Width=260
Height=85
ScrollBars=2
}
Add(SendMessage,14481733,553,350)
{
Point(Message)
link(onSend,9721830:doAdd,[])
link(Handle,6140200:Var1,[])
link(WParam,11491058:Text,[])
link(LParam,9156883:Memory,[(573,306)(517,306)])
link(Message,10336840:Item,[])
}
Add(DoData,6923920,406,308)
{
link(onEventData,8878466:doEvent1,[])
link(Data,6225669:Text,[])
}
Add(Button,12440954,350,308)
{
Left=20
Top=175
Width=260
Caption="Отправить сообщение"
link(onClick,6923920:doData,[])
}
Add(IntegerArray,9153682,574,140)
{
IntArray=['CB_ADDSTRING'=323,'CB_DELETESTRING'=324,'CB_DIR'=325,'CB_FINDSTRING'=332,'CB_FINDSTRINGEXACT'=344,'CB_GETCOUNT'=326,'CB_GETCURSEL'=327,'CB_GETDROPPEDCONTROLRECT'=338,'CB_GETDROPPEDSTATE'=343,'CB_GETDROPPEDWIDTH'=351,'CB_GETEDITSEL'=320,'CB_GETEXTENDEDUI'=342,'CB_GETHORIZONTALEXTENT'=349,'CB_GETITEMDATA'=336,'CB_GETITEMHEIGHT'=340,'CB_GETLBTEXT'=328,'CB_GETLBTEXTLEN'=329,'CB_GETLOCALE'=346,'CB_GETTOPINDEX'=347,'CB_INITSTORAGE'=353,'CB_INSERTSTRING'=330,'CB_LIMITTEXT'=321,'CB_MSGMAX'=354,'CB_RESETCONTENT'=331,'CB_SELECTSTRING'=333,'CB_SETCURSEL'=334,'CB_SETDROPPEDWIDTH'=352,'CB_SETEDITSEL'=322,'CB_SETEXTENDEDUI'=341,'CB_SETHORIZONTALEXTENT'=350,'CB_SETITEMDATA'=337,'CB_SETITEMHEIGHT'=339,'CB_SETLOCALE'=345,'CB_SETTOPINDEX'=348,'CB_SHOWDROPDOWN'=335]
UseName=0
}
Add(ArrayRW,10336840,574,189)
{
link(Array,9153682:Array,[])
}
Add(Label,9341551,602,77)
{
Left=20
Top=90
Width=65
Height=17
Caption="Сообщение:"
}
Add(Label,15718932,651,77)
{
Left=20
Top=120
Width=41
Height=17
Caption="String"
}
Add(Label,5683312,700,77)
{
Left=195
Top=120
Width=60
Height=17
Caption="WParam"
}
Add(Edit,6225669,406,245)
{
Left=20
Top=140
Width=165
Text="Пункт2"
}
Add(Edit,11491058,560,245)
{
Left=190
Top=140
Width=65
Text="0"
DataType=2
}
Add(Label,8465279,749,77)
{
Left=20
Top=205
Width=37
Height=17
Caption="Ответ:"
}
Add(ChildPanel,6140200,553,77)
{
}
BEGIN_SDK
Add(EditMulti,1666175,21,21)
{
VarCount=1
link(Var1,13277300:Handle,[(27,180)(125,180)])
}
Add(Panel,12487912,49,70)
{
Left=20
Top=10
Width=262
Height=69
}
Add(ComboBox,13277300,105,126)
{
Left=150
Top=20
Width=95
Height=24
Strings=#6:Пункт1|6:Пункт2|6:Пункт3|
Text=""
Point(Handle)
}
Add(Label,12146243,105,70)
{
Left=10
Top=25
Width=136
Height=17
Caption="Объект для опытов:"
}
END_SDK
Add(ComboBox,4188647,497,182)
{
Left=90
Top=90
Width=190
Height=21
Strings=#12:CB_ADDSTRING|16:CB_DELETESTRING |6:CB_DIR|14:CB_FINDSTRING |19:CB_FINDSTRINGEXACT |11:CB_GETCOUNT|12:CB_GETCURSEL|25:CB_GETDROPPEDCONTROLRECT |19:CB_GETDROPPEDSTATE |19:CB_GETDROPPEDWIDTH |13:CB_GETEDITSEL|16:CB_GETEXTENDEDUI|23:CB_GETHORIZONTALEXTENT |14:CB_GETITEMDATA|17:CB_GETITEMHEIGHT |12:CB_GETLBTEXT|16:CB_GETLBTEXTLEN |12:CB_GETLOCALE|14:CB_GETTOPINDEX|14:CB_INITSTORAGE|15:CB_INSERTSTRING|12:CB_LIMITTEXT|10:CB_MSGMAX |16:CB_RESETCONTENT |15:CB_SELECTSTRING|12:CB_SETCURSEL|19:CB_SETDROPPEDWIDTH |14:CB_SETEDITSEL |16:CB_SETEXTENDEDUI|23:CB_SETHORIZONTALEXTENT |14:CB_SETITEMDATA|16:CB_SETITEMHEIGHT|12:CB_SETLOCALE|14:CB_SETTOPINDEX|15:CB_SHOWDROPDOWN|
Text="не выбрано"
link(onClick,10336840:doRead,[])
}
Add(MemoryStream,9156883,497,245)
{
Point(Memory)
}
Add(DataToFile,14836274,497,315)
{
Type=6
link(Stream,9156883:Stream,[])
}
Add(Hub,8878466,455,308)
{
OutCount=3
link(onEvent1,9156883:doClear,[(480,314)(480,258)])
link(onEvent2,14836274:doPut,[])
link(onEvent3,14481733:doSendMessage,[(480,328)(480,356)])
}

NordWest писал(а):
Вероятно после прочтения русского описания нужно просматривать и англоязычный вариант...
Тут, видимо, некто Платонов заложил в перевод "свой интеллект". Что делать следует чрезвычайно осторожно. Скажем, прилагательное "префиксный", относящееся к строке, видимо имеет семантику всего сообщения. Ну типа, будет найдено то, что начинается с такой строки. А нормальный человек будет думать, что это характеристика формата строки... Начнет гуглить "префиксную строку"... Может нагуглить, что паскалевские строки имеют своим префиксом длину.
А уж семантика термина "пустой символ"....

Мир докатился до того, что верить вообще никому нельзя...
Например, читаю Вирта, а там - "научная графомания"
Не говоря уже о менее известных авторах...
К сожалению...

NordWest писал(а):
А если ...
Все правильно.
Настолько, что doClear делает именно ЭТО, и ничего кроме ЭТОГО (P.Size := 0).
Это просто я в попыхах "не заметил" более простой точки.



В этом деле следует усвоить главное:
1) MemoryStream.Memory - пожалуй единственный у нас способ подставить "поинтер" в параметры для SendMessage. А там это часто надо...
2) Данные по этому "поинтеру" можно записать/прочитать с помощью DataToFile
3) Следует иметь ввиду, что, при изменении размеров стрима (например, при записи туда дополнительных данных) - этот "поинтер" легко может изменить свое значение. По научному - реаллоцироваться.
4) Собственно, и все.

карма: 9

0
Ответов: 84
Рейтинг: 1
#29: 2015-01-20 12:38:57 ЛС | профиль | цитата
Galkov писал(а):
Да, "сторонний софт" - это выход, если он правильный. И он обязан был показать две формы и кучу STATIC.

Он может показывать всю структуру, но мне было достаточно этого


Galkov писал(а):
Вторую можно решать (искать решение) независимо от первой.

Об этом я не подумал - спасибо за подсказку.
карма: 1

0
Ответов: 9906
Рейтинг: 351
#30: 2015-01-20 15:19:46 ЛС | профиль | цитата
1) А чего на Lable-ы прицел не наводишь
2) Аплет - это форма с нулевой высотой и с шириной и координатами, которые совпадают с нашим MainForm
ПОЭТОМУ: фигу ты в него прицелом попадешь. И он является owner-ом для нашей формы. И его Caption - не обязан совпадать с нашим заголовком, но именно его Caption отражается в ToolBar-е винды. И именно для него (а не для нашей формы) винда делает анимацию (ну типа - свернуть/развернуть)
[offtop]BTW: всю эту фигню не мы придумывали, естественно [/offtop]

Щаз, приду домой - своим шпионом пошарю... Мне его коллега tsdima когда-то давно-давно выписывал
карма: 9

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)