![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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
Это еще что за шняга ?