Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2011, 15:35   #1
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
Печаль EnumChildWindows

Дело вот какое: есть модуль подцепленый на com порт, выдающий значения тридцати двух измерительных инструментов в реальном времени. Разобраться в ответе с этого порта тумкалки не хватило. В то же время есть прога от производителя, где на форме куча компонентов Static в которых переодически обновляются значения. Знаний катастрофически не хватает, потому решил пойти простым и тупым путём - запускать эту прогу и выдёргивать значения из неё.
Но знаний не хватает даже на это
Я насколько понял прога всегда будет в одном порядке раздавать хэндлы компонентам, и если я определю что первое окошко допустим находиться третьим, то оно всегда будет находиться третьим?
Впервые сталкиваюсь плотно с хэндлами. Ну никак не могу всосать что делаю не так.
Создаю ABC: Array of THandle
Скидываю H:=1
Запускаю EnumChildWindows(MHandle, @HandleEnumeration, 0)
и вот текст самого HandleEnumeration(Wnd: THandle, Param: integer):
ABC[H]:=Wnd;
H:=H+1;

Всё вроде просто, я не понял что я не понял , на шаге ABC[H]:=Wnd прога вылетает, что то по address violation ругается.

Помогите советом, дайте может почитать чего нибудь попроще. Или лучше вообще носом тыкните как надо.
BoozZzilla вне форума Ответить с цитированием
Старый 10.03.2011, 15:49   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

массиву то длину задавайте, а точнее придеться динамически менять её.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2011, 16:09   #3
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

Будте так добры, покажите как. Я не понимаю как не зная сколько их там на форме висит задать длину.
ОК
только прошу не бросайте меня одного - мне не справиться ))
вот это у меня теперь:
SetLength(ABC,H+1);
ABC[H]:=Wnd;
H:=H+1;

Почему то заполняет весь массив нулями и вылетает на H=9, запускаю дальше - вылетает на 18
Буду копать интернет, но может кто то чем поможет?

Последний раз редактировалось BoozZzilla; 10.03.2011 в 16:38.
BoozZzilla вне форума Ответить с цитированием
Старый 10.03.2011, 16:45   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Код:
var ABC:array of THandle;

function HandleEnumeration(Wnd: THandle, Param: integer):LONGBOOL;stdcall;
begin
 SetLength(ABC,Length(ABC)+1);
 ABC[Length(ABC)-1]:=Wnd;
 Result:=true;
end;
вызываем
Код:
SetLength(ABC,0);
EnumChildWindows(MHandle, @HandleEnumeration, 0)
кстати, а почему бы не использовать FindWindowEx?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2011, 16:57   #5
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 26.01.2009
Сообщений: 125
По умолчанию

спасибо, намного красивее
а насчёт FindWindowsEx - я этой функцией смогу найти несколько компонент?
Мне нужны будут штук двадцать - инструментов то много висит.

upd - всё так и осталось - массив заполняется нулями, на девятом элементе вылетает, хочет прочитать адрес 00000000.

Последний раз редактировалось BoozZzilla; 10.03.2011 в 17:01.
BoozZzilla вне форума Ответить с цитированием
Старый 10.03.2011, 17:32   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

с помощью FindWindowEx можно находить последовательно(один вызов один компонент, но без повторений) и причем определенного класса.

у вас в коде процедура точно stdcall?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2011, 17:58   #7
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Если у статиков идентификаторы не изменяются при каждом старте чужой проги, и они(статики) расположены на главном окне без иерархии родителей, то намного проще:
прогой навроде WinSpy смотрим идентификаторы статиков.
получаем хендл статика StaticWnd := GetDlgItem(MainDlg, StaticID)
SendMessage(StaticWnd, WM_GETTEXT, Buf, BufLen);
xexxex вне форума Ответить с цитированием
Старый 10.03.2011, 18:02   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а если у нас не диалог, то разве сработает?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.03.2011, 18:09   #9
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Ну я же написал необходимые условия для успеха
Цитата:
Если у статиков идентификаторы не изменяются при каждом старте чужой проги, и они(статики) расположены на главном окне без иерархии родителей
Ждем подтверждения\опровержения автора
xexxex вне форума Ответить с цитированием
Старый 11.03.2011, 08:19   #10
BoozZzilla
Форумчанин
 
Аватар для BoozZzilla
 
Регистрация: 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.
BoozZzilla вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц