![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Указатель на метод класса
Виктор007 © (2007-09-15 15:39:00)Почему не работает такой код:
procedure TChkWin.EnumWindowsProc(hW:HWND); stdcall;
var
S: string;
begin
SetLength(S,SendMessage(hW,WM_GETTEXTLENGTH,0,0)+1);
SetLength(S,SendMessage(hW,WM_GETTEXT,Length(S),LPARAM(S)));
fWinList.Add(S)
end;
procedure TChkWin.RefreshWinList;
begin
fWinList.Clear;
EnumWindows(@Self.EnumWindowsProc, 0);
end;
Вернее ошибка в строке EnumWindows(@Self.EnumWindowsProc, 0);
Компилятор ругается. Как правильно получить указатель на TChkWin.EnumWindowsProc?
evvcom (2007-09-18 10:26:00) [1]
> Я бы все равно так не делал... :(
Так я бы тоже :) Поначалу было дело, писал типа того, но потом поправился на параметры вида AControl: TSomeControl
{RASkov} (2007-09-18 09:50:00) [2]> [18] evvcom © (18.09.07 09:29)
> чем тебе не нравится название формального параметра с именем
> Self в обычной процедуре
Я бы все равно так не делал... :(
Хоть, да, ошибки нет, но может быть путаница, когда тело процедуры(текста много) большое и не видно заголовка, то можно подумать, что это метод, а self.... ну понятно кто.
:) Ну на крайняк назвал бы так ASelf: T<что-то>
evvcom (2007-09-18 09:29:00) [3]
> Slym ©
Тебя и так тяжело понять, а еще твое коверканье языка вообще в ступор вводит.
Твое "таг сработаед" я понял, как "сделай так, и будет тебе счастье", т.е. в твоем понимании так верно, значит так и нужно. Если ты закладывал иной смысл в свою реплику, то постарайся тогда в будущем выражаться ясней и на русском языке. Как это на твоем сленге? Пятьс?
И второе, чем тебе не нравится название формального параметра с именем Self в обычной процедуре? Мне не нравится только тем, что смысл параметра все-таки немного не тот (имхо), но работать будет на ура и корректно. Шестьс? :-)
Slym (2007-09-17 13:00:00) [4]и немного не доглядел...
я указывал на то что процедура (правильней функция) не метод класса и self в ней неопределен :) а ано вона как передается Self:PChkWin...
енто теперь черырес :-D
{RASkov} (2007-09-17 12:51:00) [5]> [15] Slym © (17.09.07 12:46)
> кто-то по тойже причине implimintation с ошибками пищедъ
Ээээ.... Это разные вещи :) Триссс
Slym (2007-09-17 12:46:00) [6]evvcom © (17.09.07 9:40) [12]
Не делай так больше. И не учи так других
я постил таг сработаед, а не делай таг
енто раз...
evvcom © (17.09.07 9:40) [12]
это функция, а не процедура
кто-то по тойже причине implimintation с ошибками пищедъ http://www.delphimaster.ru/cgi-bin/forum.pl?id=1189747819&n=18
енто двас... :)
Виктор007 (2007-09-17 11:18:00) [7]Да, я заметил что не всегда работает правильно. Зделал так и все прекрасно.
function EnumWindowsProc(hW:HWND; Self:PChkWin):boolean; stdcall;
begin
GetWindowText(hW, Self.fStrBuffer, 255);
if Byte(Self.fStrBuffer[0]) > 0 then
Self.fWinList.Add(Self.fStrBuffer);
result := true;
end;
procedure TChkWin.RefreshWinList;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProc, Integer(@Self));
end;
правда почему-то GetWindowText для двух окон в моей системе возвращает пустые строки, в то время как SendMessage(hW,WM_GETTEXT,Length(S),LPARAM(S))
Получает заголовки для всех окон, но помоему работает медленнее...
evvcom (2007-09-17 09:47:00) [8]
> Виктор007 (15.09.07 15:54) [6]
Из хелпа:
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
Рискуешь не найти того, что ищешь.
evvcom (2007-09-17 09:40:00) [9]
> Slym © (17.09.07 07:41) [11]
> таг сработаед
> ChkWin.fWinList.Add('sdas');
ChkWin- что это? Глобальный параметр? Не делай так больше. И не учи так других.
> Slym © (17.09.07 07:36) [9]
> procedure EnumWindowsProc
А вот это ты правильно выделил, но написал муть. В [8] приведена декларация, это функция, а не процедура.
Slym (2007-09-17 07:41:00) [10]таг сработаед
procedure TChkWin.RefreshWinList;
procedure EnumWindowsProcs(hW,lp:HWND); stdcall;
begin
ChkWin.fWinList.Add('sdas');
end;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProcs, 0);
end;
Slym (2007-09-17 07:40:00) [11]Виктор007 (15.09.07 15:44) [2]
procedure TChkWin.RefreshWinList;
procedure EnumWindowsProcs(hW:HWND); stdcall;
begin
fWinList.Add('sdas');
end;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProcs, 0);
end;
компилится нормально... но при исполнении в стеке нед self'а , EnumWindows низнаед об self ничего...
Slym (2007-09-17 07:36:00) [12]
Виктор007 (15.09.07 15:54) [6]
procedure EnumWindowsProc (hW:HWND; Self:TChkWin); stdcall;
var
S: string;
begin
....
Self. fWinList.Add(S)
end;
упс... работаед? значед не надолго :)
Инс (2007-09-15 16:06:00) [13]BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
);
Anatoly Podgoretsky (2007-09-15 15:55:00) [14]> Виктор007 (15.09.2007 15:47:04) [4]
Повторяю для непонятливых - ДВА параметра!
Виктор007 (2007-09-15 15:54:00) [15]Анатолий и Икс, большое спсибо.
procedure EnumWindowsProc(hW:HWND; Self:TChkWin); stdcall;
var
S: string;
begin
SetLength(S,SendMessage(hW,WM_GETTEXTLENGTH,0,0)+1);
SetLength(S,SendMessage(hW,WM_GETTEXT,Length(S),LPARAM(S)));
Self.fWinList.Add(S)
end;
procedure TChkWin.RefreshWinList;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProc, Integer(Self));
end;
Вот так прекрасно работает.
Anatoly Podgoretsky (2007-09-15 15:49:00) [16]> Виктор007 (15.09.2007 15:44:02) [2]
EnumWindowsProc имеет два параметра
Виктор007 (2007-09-15 15:47:00) [17]А если сделать так
procedure EnumWindowsProc(hW:HWND); stdcall;
var
S: string;
begin
SetLength(S,SendMessage(hW,WM_GETTEXTLENGTH,0,0)+1);
SetLength(S,SendMessage(hW,WM_GETTEXT,Length(S),LPARAM(S)));
fWinList.Add(S)
end;
procedure TChkWin.RefreshWinList;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProc, 0);
end;
То как-же EnumWindowsProc сможет редактировать переменные класса. В данном случае fWinList.Add(S);
Инс (2007-09-15 15:46:00) [18]Дело в том, что в метод класса неявно передается еще один параметр - ссылка на экземпляр, чей метод выполняется (Self). Делайте просто функцию, а не метод.
Виктор007 (2007-09-15 15:44:00) [19]Пробовал так
procedure TChkWin.RefreshWinList;
procedure EnumWindowsProcs(hW:HWND); stdcall;
begin
fWinList.Add('sdas');
end;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProcs, 0);
end;
Но тогда компилируется нормально, но после первого вызова EnumWindowsProcs программ вылетает
Инс (2007-09-15 15:42:00) [20]EnumWindowsProc не должна быть методом класса.