Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизкопирование из spinedit Найти похожие ветки
← →
Delphist2 (2010-05-26 16:51) [0]Есть чужое окно со spinedit, хэндл его я получил. С какими параметрами надо вызвать sendmessage чтобы получить значение этого spinedit?
← →
12 © (2010-05-26 17:13) [1]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;
← →
Delphist2 (2010-05-26 18:16) [2]Сорри, попутал. Хэндл я кажется не получил:
FindWindowEx(h,0,"TcxDBSpinEdit",nil)<>0 возвращает true
Класс контрола я точно знаю (смотрел декомпилятором), само окно я тоже нашел (1-й параметр). Остается 2-й?
← →
Delphist2 (2010-05-26 18:22) [3]то есть false возвращает. Короче, FindWindowEx(h,0,"TcxDBSpinEdit",nil) возвр. 0.
← →
Delphist2 (2010-05-26 18:47) [4]Да, и если контрол стоит на компоненте PageControl, то надо сначала на PageControl хэндл получать?
← →
Delphist2 (2010-05-26 18:52) [5]Но на PageControl не нашел. Там как будто нет компонента TcxDBSpinEdit. Может еще надо хэндл на конкретную страницу PageControlа?
← →
Юрий Зотов © (2010-05-26 21:07) [6]
> Delphist2 (26.05.10 18:52) [5]
Во всех случаях сначала нужен хэндл родительского окна (у которого, в свою очередь, может быть свое родительское окно - и т.п., вплоть до окна верхнего уровня). Используйте WinSight32 (или аналогичную программу), при выборе окна она покажет всю иерархию его родительских окон.
← →
Delphist2 (2010-05-26 23:35) [7]Сделал, только работает плохо. Если форма с cxDBSpinEdit только что открыта, то он его (cxDBSpinEdit) не видит. Хотя он там есть. Если же переключиться м/у табами один раз, потом обратно на таб где cxDBSpinEdit, то только тогда видит.
При открытии формы активен как раз тот таб, где находится cxDBSpinEdit. Так что отчего проблема, непонятно.
← →
Германн © (2010-05-27 01:47) [8]
> Delphist2 (26.05.10 23:35) [7]
>
> Сделал, только работает плохо.
Значит плохо сделал.
← →
12 © (2010-05-27 10:28) [9]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 11:29) [10]
> 12 © (27.05.10 10:28) [9]
1. Тогда уж BOOL, а не Boolean.
2. Зачем делать цикл, если можно обойтись и без него?
← →
Delphist2 (2010-05-27 12:43) [11]
> 2. Зачем делать цикл, если можно обойтись и без него?
без цикла же он не видел его почему-то
← →
12 © (2010-05-27 13:11) [12]
> Тогда уж BOOL, а не Boolean.
спасибо. А это сильно критично? Просто пока и так вроде работает..
> Зачем делать цикл, если можно обойтись и без него?
?
в заблуждение ввело видимо
> перебираем всех сынков/дочек, обязательно встретим нужного.
конечно, там без цикла, там само перебирается..
← →
Юрий Зотов © (2010-05-27 14:29) [13]> 12 © (27.05.10 13:11) [12]
В прототипе callback"а указано BOOL. Что и неудивительно, потому что WinAPI написан на Си, а BOOL - это родной сишный четырехбайтовый тип.
Дельфишный же тип Boolean - однобайтовый. Поэтому, если указать его, то все будет зависеть от того, как компилятор построит возврат результата. Если однобайтовый результат будет возвращен, как четырехбайтовый, то все будет нормально, а если нет - то получим непредсказуемый и трудноуловимый глюк.
Надежнее на компилятор не полагаться, а явно указать ему, что надо вернуть четырехбайтовый результат.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.057 c