Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема в водимых параметрах функции 
V
    Опции темы
-Сергей-
Дата 2.10.2012, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



Всем привет!
Ребят или лето на дворе или и вправду лыжи не едут....
Короче дело в чем: 
Написал я ф-ю, кот-я ищет в окне родителе контрол по его классу и надписи на нем, и если находит, то возвращает его хэндл:
Код

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;

тогда все работает.
Подскажите в чем причина понять не могу.
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
Illusion Dolphin
Дата 2.10.2012, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



У вас неправильно передаются параметры:
Код

type
  TWinEnumParameters = class
    aClassName: string;
    aText: string
  end;

function EnumChildProc(aHwnd: hWnd; iParam: LongInt): Boolean; stdcall;
var
  aBuffClass: String[255];
  aBuffText: String[255];
  Params: TWinEnumParameters;
begin
  Params := TWinEnumParameters(iParam);
  SetLength(aBuffclass, GetClassName(aHwnd, @aBuffClass[1], 254));
  SetLength(aBufftext, SendMessage(aHwnd, WM_GETTEXT, 254, LPARAM(@aBuffText[1])));

  Result := not ( (Params.aClassName = aBuffClass) and (Params.aText = aBuffText) );
end;

function GetCtrlHandle(aParent: HWND; aClassName: String; aText: String): HWND;
var
  Params: TWinEnumParameters;
begin
  Params := TWinEnumParameters.Create;
  try
    EnumChildWindows(aParent, @EnumChildProc, DWORD(Params));
  finally
    Params.Free;
  end;
end;



MSDN:
Код

BOOL CALLBACK EnumChildProc(
  _In_  HWND hwnd,
  _In_  LPARAM lParam
);



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
-Сергей-
Дата 2.10.2012, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



А где теперь результат от GetCtrlHandle?
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
Illusion Dolphin
Дата 2.10.2012, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

А где теперь результат от GetCtrlHandle? 

Ой - забыл что-то про него. Что-то вроде этого.
Код

type
  TWinEnumParameters = class
    aClassName: string;
    aText: string;
    Result: HWND;
  end;

function EnumChildProc(aHwnd: hWnd; iParam: LongInt): Boolean; stdcall;
var
  aBuffClass: string[255];
  aBuffText: string[255];
  Params: TWinEnumParameters;
begin
  Params := TWinEnumParameters(iParam);
  SetLength(aBuffclass, GetClassName(aHwnd, @aBuffClass[1], 254));
  SetLength(aBufftext, SendMessage(aHwnd, WM_GETTEXT, 254, LPARAM(@aBuffText[1])));

  Result := not ((Params.aClassName = aBuffClass) and (Params.aText = aBuffText));
  if not Result then
    Params.Result := aHwnd;
end;

function GetCtrlHandle(aParent: HWND; aClassName: String; aText: String): HWND;
var
  Params: TWinEnumParameters;
begin
  Params := TWinEnumParameters.Create;
  try
    Params.aClassName := aClassName;
    Params.aText := aText;
    EnumChildWindows(aParent, @EnumChildProc, DWORD(Params));
    Result := Params.Result;
  finally
    Params.Free;
  end;
end;



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
-Сергей-
Дата 2.10.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 224
Регистрация: 2.8.2003
Где: Россия

Репутация: нет
Всего: 1



smile ну я так и сделал. Правда костыль какой-то. Но имхо по-другому никак...
--------------------
Для утвердительного ответа достаточно лишь одного слова - "да". Все прочие слова придуманы, чтобы сказать "нет".
PM MAIL WWW ICQ MSN   Вверх
bems
Дата 4.10.2012, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



и коллбек-функция не может быть вложенной


--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0496 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.