![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 125
|
![]()
Дело вот какое: есть модуль подцепленый на com порт, выдающий значения тридцати двух измерительных инструментов в реальном времени. Разобраться в ответе с этого порта тумкалки не хватило. В то же время есть прога от производителя, где на форме куча компонентов Static в которых переодически обновляются значения. Знаний катастрофически не хватает, потому решил пойти простым и тупым путём - запускать эту прогу и выдёргивать значения из неё.
Но знаний не хватает даже на это ![]() Я насколько понял прога всегда будет в одном порядке раздавать хэндлы компонентам, и если я определю что первое окошко допустим находиться третьим, то оно всегда будет находиться третьим? Впервые сталкиваюсь плотно с хэндлами. Ну никак не могу всосать что делаю не так. Создаю ABC: Array of THandle Скидываю H:=1 Запускаю EnumChildWindows(MHandle, @HandleEnumeration, 0) и вот текст самого HandleEnumeration(Wnd: THandle, Param: integer): ABC[H]:=Wnd; H:=H+1; Всё вроде просто, я не понял что я не понял ![]() Помогите советом, дайте может почитать чего нибудь попроще. Или лучше вообще носом тыкните как надо. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
массиву то длину задавайте, а точнее придеться динамически менять её.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 125
|
![]()
Будте так добры, покажите как. Я не понимаю как не зная сколько их там на форме висит задать длину.
ОК только прошу не бросайте меня одного - мне не справиться )) вот это у меня теперь: SetLength(ABC,H+1); ABC[H]:=Wnd; H:=H+1; Почему то заполняет весь массив нулями и вылетает на H=9, запускаю дальше - вылетает на 18 Буду копать интернет, но может кто то чем поможет? Последний раз редактировалось BoozZzilla; 10.03.2011 в 16:38. |
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]() Код:
Код:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#5 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 125
|
![]()
спасибо, намного красивее
а насчёт FindWindowsEx - я этой функцией смогу найти несколько компонент? Мне нужны будут штук двадцать - инструментов то много висит. upd - всё так и осталось - массив заполняется нулями, на девятом элементе вылетает, хочет прочитать адрес 00000000. Последний раз редактировалось BoozZzilla; 10.03.2011 в 17:01. |
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
с помощью FindWindowEx можно находить последовательно(один вызов один компонент, но без повторений) и причем определенного класса.
у вас в коде процедура точно stdcall? Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 31.07.2010
Сообщений: 52
|
![]()
Если у статиков идентификаторы не изменяются при каждом старте чужой проги, и они(статики) расположены на главном окне без иерархии родителей, то намного проще:
прогой навроде WinSpy смотрим идентификаторы статиков. получаем хендл статика StaticWnd := GetDlgItem(MainDlg, StaticID) SendMessage(StaticWnd, WM_GETTEXT, Buf, BufLen); |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
а если у нас не диалог, то разве сработает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#9 | |
Пользователь
Регистрация: 31.07.2010
Сообщений: 52
|
![]()
Ну я же написал необходимые условия для успеха
Цитата:
|
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 26.01.2009
Сообщений: 125
|
![]()
ребята, я совсем растерялся.
Что такое хэндл я с грехом пополам понимаю, оказывается у компонент есть ещё и идентификаторы? )) Я WinSpy (nncron-овский, я правильно понял?) смотрю инфо о статике - показывает тока хэндл, где мне можно идентификатор узнать чтобы поэкспериментировать меняется ли он при новом открытии программы? upd - Скачал Spy++, посмотрел - окно диалог, ID не меняются. Попробую сейчас сделать как вы предложили - выдёргивать хэндлы через айди, но не могли бы вы всё таки обьяснить что это такое? upd - спасибо вам огромное, всё работает встал на следующем шагу - объявляю StaticID: Array [0..31]of Integer в теле пытаюсь его заполнить так: StaticID:=[$000003ef,$000003ea,$000003ed.....$ 00000447]; ругается constant expression violates subrange bounds пробовал объявлять как массив LongInt всё тоже самое причем как то странно ругается, не 32 ошибки, а где то около двадцати Последний раз редактировалось BoozZzilla; 11.03.2011 в 10:47. |
![]() |
![]() |