-
В окне несколько едитов некоторые находятся на [Panel] и [GroupBox] --> искать рекурсивно
как мне найти нужный [Edit] зная его [Name] дело в том что функция FindWindowEx ищет по заголовку а мне надо по имени
-
> ivanoff (17.08.09 21:07)
> функция FindWindowEx ищет по заголовку а мне надо по имени
Она ищет по классу окна или по его заголовку. What is "имя"?
-- Regards, LVT.
-
> What is "имя"?
TEdit(...).Name
дело в том что в разных едитах может быть написано одно и тоже, мне нужно только в одном из них написать, а пишу во всех :(
-
> ivanoff (17.08.09 21:35) [2]
> TEdit(...).Name
По дельфийски означает: одного (оконного) класса.
> дело в том что в разных едитах может быть написано одно > и тоже
Для различения эдитов одного класса можно использовать: - координаты; - ID; - z-order; - еще чего-либо, необходимого для их идентификации, скажем, наличие SetProp & etc.
-- Regards, LVT.
-
и как определить ID я знаю только handle который всегда разный
а без танцев с бубном (координаты; ID; z-order; еще чего-либо, необходимого для их идентификации, скажем, наличие SetProp & etc) никак?
-
> ivanoff (17.08.09 21:56) [4]
А откуда тебе стало известно это самое [Name] ?
-
ResGrabber
-
Тогда этим самым ResGrabber'ом ты вполне мог увидеть и зн-я свойств Left, Top.
Если эти св-ва не изменяются программно после загрузки контролов-одноклассников в родительский контейнер, то по ним как раз и можно идентифицировать требуемый контрол, ибо маловероятно, что два Edit'а на одном и том же род.окне перекрывают частично или полностью друг-друга (тогда потребуется доп.идентификация по z-ордеру)
-
> ivanoff (17.08.09 21:56) [4]
> и как определить ID я знаю только handle который всегда > разный
GetDlgCtrlID
> а без танцев с бубном (координаты; ID; z-order; еще чего- > либо, необходимого для их идентификации, > скажем, наличие SetProp & etc) никак?
Дед Мороз жив, forever!
-- Regards, LVT.
-
to Leonid Troyanovsky © (17.08.09 22:47) [8]
GetDlgCtrlID 1. даст уникальный идентификатор корнтрола на форме(или во всем приложении) даже если оркрыто больше одного экземпляра одного и того же приложения? 2. Меняется ли этот идентификатор при след. сапуске приложения (как Handle)? 3. Могу ли я искать на прямую по этому ID? Как? 4. Есть др. способ искать насквозь во все окна (без рекурсии)
спасибо
-
> ivanoff (18.08.09 15:08) [9] > GetDlgCtrlID
1. Для дельфийских приложений его никто не назначает, он, видимо, генерируется системой. Уникальность заявлена в пределах окна парента. 2. Меняется, т.к. 1 3. Непонятно, чего его искать, если хендл известен. 4. EnumChildWindows with GetClassName.
-- Regards, LVT.
-
> Leonid Troyanovsky © (18.08.09 15:58) [10]
Мда, у окон дельфийских винконтролов есть еще Property, в которые наряду с другим вписывается значение указателя. Если контролы не создаются в рантайм, то есть шанс идентифицировать по ем. См. например, реализацию FindControl, а также EnumProps.
-- Regards, LVT.
-
Я всегда делаю примерно так: var h:longint;
s:string;
begin
h:=FindWindowEx(handle,0,'TEdit',nil);
h:=FindWindowEx(handle,h,'TEdit',nil);
s:='Text';
sendmessage(h,wm_settext,0,longint(s)); handle - найти можно через FindWindow В примере я обращаюсь ко второму объекту и заношу туда текст.
-
> Nikfel (18.08.09 16:20) [12]
> Я всегда делаю примерно так:
Если всегда, то это неправильно. См. msdn: комментарий к EnumChidWindows.
Ну, понятно, что здесь используется информация о z-order.
-- Regards, LVT.
-
Пойду по пути идентифицировать по координатам. Вопрос как получить Top, Left, Height, Width? делаю так...
sStrClass, sWindowName, sStrToSet: String;
...
function EnumProc (W: HWnd; Param: LongInt): Boolean; stdcall;
var
WName: array[0..255] of Char;
CName: array[0..255] of Char;
begin
GetWindowText(W, WName, 256);
GetClassName(W, CName, 256);
if (AnsiCompareText(sStrClass, CName) = 0) and (AnsiCompareText(sWindowName, Nm) = 0) then
SendMessage(W, WM_Settext, 0, Integer(PChar(sStrToSet)))
else
begin
EnumChildWindows (W,@EnumProc, 0);
EnumProc := True;
end;
end;
procedure FindAndSetText(ParentHnd: HWND; const StrClass, WindowName, StrToSet: String);
begin
sStrClass := StrClass;
sWindowName := WindowName;
sStrToSet := StrToSet;
EnumWindows(@EnumProc, 0);
end; ... //делаю пробы в моем-же приложении так FindAndSetText(Form1.Handle, 'TEdit', 'Edit1', 'My Text');
-
> как получить Top, Left, Height, Width?
The GetWindowRect function retrieves the dimensions of the bounding rectangle of the specified window. The dimensions are given in screen coordinates that are relative to the upper-left corner of the screen
-
вижу EnumWindows(@EnumProc, 0); это я взял из примера - я так понимаю ParentHnd никак не передаётся значит ли это то что ищется во всех окнах и не надо прибегать к рекурсии? извеняюсь за настырство, только делаю все путем проб и ошибок на базе разных примеров
-
-
> делаю все путем проб и ошибок
Почитать документацию в голову не приходило ?)
-
вобщем разобрался тока ...
GetWindowRect дает координаты по отношению к экрану (абсолютные) - могу ли я получить относительные координаты объекта (без расчетов). контрол находится на несколько вложенных Panel, GroupBox
-
> ivanoff (19.08.09 19:06) [19]
> GetWindowRect
GetClientRect?
> контрол находится на несколько вложенных Panel, GroupBox
Вложенные, т.е., рекурсивно.
-- Regards, LVT.
|