![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
копирование из spinedit
Delphist2 © (2010-05-26 16:51:00)Есть чужое окно со spinedit, хэндл его я получил. С какими параметрами надо вызвать sendmessage чтобы получить значение этого spinedit?
Юрий Зотов (2010-05-27 14:29:00) [1]> 12 © (27.05.10 13:11) [12]
В прототипе callback'а указано BOOL. Что и неудивительно, потому что WinAPI написан на Си, а BOOL - это родной сишный четырехбайтовый тип.
Дельфишный же тип Boolean - однобайтовый. Поэтому, если указать его, то все будет зависеть от того, как компилятор построит возврат результата. Если однобайтовый результат будет возвращен, как четырехбайтовый, то все будет нормально, а если нет - то получим непредсказуемый и трудноуловимый глюк.
Надежнее на компилятор не полагаться, а явно указать ему, что надо вернуть четырехбайтовый результат.
12 (2010-05-27 13:11:00) [2]
> Тогда уж BOOL, а не Boolean.
спасибо. А это сильно критично? Просто пока и так вроде работает..
> Зачем делать цикл, если можно обойтись и без него?
?
в заблуждение ввело видимо
> перебираем всех сынков/дочек, обязательно встретим нужного.
конечно, там без цикла, там само перебирается..
Delphist2 (2010-05-27 12:43:00) [3]
> 2. Зачем делать цикл, если можно обойтись и без него?
без цикла же он не видел его почему-то
Юрий Зотов (2010-05-27 11:29:00) [4]
> 12 © (27.05.10 10:28) [9]
1. Тогда уж BOOL, а не Boolean.
2. Зачем делать цикл, если можно обойтись и без него?
12 (2010-05-27 10:28:00) [5]EnumChildWindows
- и достаточно дать только хендл родителя, например, формы.
EnumChildWindows (hStart, @EnumProc, 0);
где
function EnumProc call-back функция
перебираем всех сынков/дочек, обязательно встретим нужного.
Как его идентифицировать?
Я делал по части известного начального значения.
function EnumProc (WD: HWnd; Param: LongInt): Boolean; stdcall;
Begin
if pos(sMyField,GetTextByHandle(wd))<>0 then
А возможно по классу окну и т.д. Хендл то есть, от него многое можно получить.
Германн (2010-05-27 01:47:00) [6]
> Delphist2 (26.05.10 23:35) [7]
>
> Сделал, только работает плохо.
Значит плохо сделал.
Delphist2 (2010-05-26 23:35:00) [7]Сделал, только работает плохо. Если форма с cxDBSpinEdit только что открыта, то он его (cxDBSpinEdit) не видит. Хотя он там есть. Если же переключиться м/у табами один раз, потом обратно на таб где cxDBSpinEdit, то только тогда видит.
При открытии формы активен как раз тот таб, где находится cxDBSpinEdit. Так что отчего проблема, непонятно.
Юрий Зотов (2010-05-26 21:07:00) [8]
> Delphist2 (26.05.10 18:52) [5]
Во всех случаях сначала нужен хэндл родительского окна (у которого, в свою очередь, может быть свое родительское окно - и т.п., вплоть до окна верхнего уровня). Используйте WinSight32 (или аналогичную программу), при выборе окна она покажет всю иерархию его родительских окон.
Delphist2 (2010-05-26 18:52:00) [9]Но на PageControl не нашел. Там как будто нет компонента TcxDBSpinEdit. Может еще надо хэндл на конкретную страницу PageControlа?
Delphist2 (2010-05-26 18:47:00) [10]Да, и если контрол стоит на компоненте PageControl, то надо сначала на PageControl хэндл получать?
Delphist2 (2010-05-26 18:22:00) [11]то есть false возвращает. Короче, FindWindowEx(h,0,'TcxDBSpinEdit',nil) возвр. 0.
Delphist2 (2010-05-26 18:16:00) [12]Сорри, попутал. Хэндл я кажется не получил:
FindWindowEx(h,0,'TcxDBSpinEdit',nil)<>0 возвращает true
Класс контрола я точно знаю (смотрел декомпилятором), само окно я тоже нашел (1-й параметр). Остается 2-й?
12 (2010-05-26 17:13:00) [13]function GetTextByHandle(h: tHandle): String;
var
p : PChar;
begin
p:=StrAlloc(255);
SendMessage(h,WM_GETTEXT,WParam(255),LParam(p));
Result := String(p);
StrDispose(p);
end;