Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

EnumChildWindows [D7, XP]


aleko ©   (2008-04-18 13:56:00) 

Доброго времени суток...
Подскажите что не так, не обращайте внимания на sleep и showmessage, пытался выяснить где прокол:


...
function EnumProc(WD: HWnd; Param: LongInt): Boolean; stdcall;
...

function TForm1.EnumProc(WD: HWnd; Param: LongInt): Boolean;
begin
Sleep(1000);
ShowMessage(IntToStr(WD));
Result:=true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
Parent: HWND;

begin
Parent := FindWindow(nil,'Подключение');
ShowMessage(IntToStr(Parent));
if Parent <> 0 then EnumChildWindows(Parent,@TForm1.EnumProc, 0)
else ShowMessage('Нет такого окна');
end;



проблема - находит родительское окно - первый шоу показывает его дескриптор, запускает EnumChildWindows и все... все ожидаемые дочерние  дескрипторы равны нулю... почему, что не так? и через некоторое время, для этого окна через 10 вызовов вылетает с ошибкой доступа...

и к тому же, когда в EnumChildWindows(ParentHWND,@TForm1.EnumProc, 0)
пишу не @TForm1.EnumProc, а просто @EnumProc, как вроде бы надо - пишет "требуется переменная" (Variable required)

... извините за легкий хаос... ))


ZENsan   (2008-04-18 17:28:00) [1]

@TForm1.EnumProc - eto ot neznanija. prosto..
TForm.EnumProc - eto TMethod, 8 baitov adres Self i smeshenie nachala koda
Poetomu i ne rabotalo. obichnaja funkcija ne ravna metodu klassa.. Hotja mozhno i eto nakolotj..


ZENsan   (2008-04-18 17:26:00) [2]

Удалено модератором


Сергей М.   (2008-04-18 14:20:00) [3]


> строго по книжкам делал так:
>
> EnumChildWindows(Parent,@EnumProc, 0) - разве не правильно?
>
>


Правильно.
Но ты в [2] вник ?


aleko   (2008-04-18 14:20:00) [4]


> Palladin ©   (18.04.08 14:14) [4]


...все... понял..... )))))
..извините за бред...

..удалил объявление метода, заработало, еще раз спасибо....


easy   (2008-04-18 14:18:00) [5]

function EnumProc(wnd: HWND; Lines: TStrings): BOOL; stdcall;
var
 buf, Caption: array[0..255] of char;
begin
 Result := True;
 GetClassName(wnd, buf, SizeOf(buf) - 1);
 SendMessage(wnd, WM_GETTEXT, 256, Integer(@Caption));
 Lines.Add(Format('ID: %d, ClassName: %s, Caption: %s',
          [GetDlgCtrlID(wnd), buf, Caption]));
end;

procedure TForm1.PrintDialog1Show(Sender: TObject);
begin
 Memo1.Clear;
 EnumChildWindows(printdialog1.Handle, @EnumProc, Integer(memo1.Lines));
end;

http://www.swissdelphicenter.ch/torry/showcode.php?id=327


Palladin   (2008-04-18 14:17:00) [6]

да и с типом результатом EnumProc накосячил


aleko   (2008-04-18 14:15:00) [7]


> Palladin ©   (18.04.08 14:01) [2]


опечатался

строго по книжкам делал так:

EnumChildWindows(Parent,@EnumProc, 0) - разве не правильно?


Palladin   (2008-04-18 14:14:00) [8]


> aleko   (18.04.08 14:11) [3]

так ты хоть понимашь чего происходит то? ты создал отдельную функцию EnumProc, и метод формы EnumProc, при компиляции компилятор конечно отдает предпочтение методу формы, и конечно ругается, что ему фуфло тут подсовывают, как исправить догадаешься сам то?


aleko   (2008-04-18 14:11:00) [9]


> Сергей М. ©   (18.04.08 13:57) [1]


если пишу не @TForm1.EnumProc, а просто @EnumProc, как вроде
бы надо - то пишется ошибка "требуется переменная" (Variable required)


> Palladin ©   (18.04.08 14:01) [2]


строго по книжкам делал так:

EnumChildWindows(ParentHWND,@EnumProc, 0) - разве не правильно?


> Palladin ©   (18.04.08 14:01) [2]



> Сергей М. ©   (18.04.08 13:57) [1]


@TForm1.EnumProc - это от отчаяния


Palladin   (2008-04-18 14:01:00) [10]


> aleko   (18.04.08 13:56) 

метод класса - это не процедура
процедура - это не метод класса

EnumChildWindows требует на входе процедуру (а точнее адрес ее тела), а ты чего ей суешь?


Сергей М.   (2008-04-18 13:57:00) [11]


> @TForm1.EnumProc


Это еще что за шняга ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо