Всем привет! Ребят или лето на дворе или и вправду лыжи не едут.... Короче дело в чем: Написал я ф-ю, кот-я ищет в окне родителе контрол по его классу и надписи на нем, и если находит, то возвращает его хэндл:
| Код | function GetCtrlHandle(aParent: HWND; aClassName: String; aText: String): HWND; function EnumProc(aHwnd: HWND; RetValue: PDWORD): BOOL; stdcall; var aBuffClass: String[255]; var aBuffText: String[255]; begin SetLength(aBuffclass, GetClassName(aHwnd, @aBuffClass[1], 254)); SetLength(aBufftext, SendMessage(aHwnd, WM_GETTEXT, 254, LPARAM(@aBuffText[1]))); Result := Not ( (aClassName = aBuffClass) and (aText = aBuffText) ); If Not Result Then RetValue^ := aHwnd; end; begin EnumChildWindows(aParent, @EnumProc, DWORD(@Result)); end;
|
Например будем искать на "чужой" форме кнопку TButton с текстом Обновить.
| Код | Memo1.Lines.Add(IntToStr(GetCtrlHandle(FindWindow('TfrmMain', nil), 'TButton', 'Обновить')));
|
И процедура выдает Accecc Violation ..... Но если вот это сравнение изменить
| Код | Result := Not ( (aClassName = aBuffClass) and (aText = aBuffText) );
|
и вместо вводимых параметров функции заменить глобальными переменными, то все работает. например изменить функцию вот так:
| Код | var gClassName: String; gText: String;
.......
function GetCtrlHandle(aParent: HWND; aClassName: String; aText: String): HWND; function EnumProc(aHwnd: HWND; RetValue: PDWORD): BOOL; stdcall; var aBuffClass: String[255]; var aBuffText: String[255]; begin SetLength(aBuffclass, GetClassName(aHwnd, @aBuffClass[1], 254)); SetLength(aBufftext, SendMessage(aHwnd, WM_GETTEXT, 254, LPARAM(@aBuffText[1]))); Result := Not ( (gClassName = aBuffClass) and (gText = aBuffText) ); If Not Result Then RetValue^ := aHwnd; end; begin gClassName := aClassName; gText := aText; EnumChildWindows(aParent, @EnumProc, DWORD(@Result)); end;
|
тогда все работает. Подскажите в чем причина понять не могу. |