Текущий архив: 2007.10.14;
Скачать: CL | DM;
Вниз
Указатель на метод класса Найти похожие ветки
← →
Виктор007 (2007-09-15 15:39) [0]Почему не работает такой код:
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?
← →
Инс © (2007-09-15 15:42) [1]EnumWindowsProc не должна быть методом класса.
← →
Виктор007 (2007-09-15 15:44) [2]Пробовал так
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:46) [3]Дело в том, что в метод класса неявно передается еще один параметр - ссылка на экземпляр, чей метод выполняется (Self). Делайте просто функцию, а не метод.
← →
Виктор007 (2007-09-15 15:47) [4]А если сделать так
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);
← →
Anatoly Podgoretsky © (2007-09-15 15:49) [5]> Виктор007 (15.09.2007 15:44:02) [2]
EnumWindowsProc имеет два параметра
← →
Виктор007 (2007-09-15 15:54) [6]Анатолий и Икс, большое спсибо.
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:55) [7]> Виктор007 (15.09.2007 15:47:04) [4]
Повторяю для непонятливых - ДВА параметра!
← →
Инс © (2007-09-15 16:06) [8]BOOL CALLBACK EnumWindowsProc(
HWND hwnd, // handle to parent window
LPARAM lParam // application-defined value
);
← →
Slym © (2007-09-17 07:36) [9]
Виктор007 (15.09.07 15:54) [6]
procedure EnumWindowsProc(hW:HWND; Self:TChkWin); stdcall;
var
S: string;
begin
....
Self.fWinList.Add(S)
end;
упс... работаед? значед не надолго :)
← →
Slym © (2007-09-17 07:40) [10]Виктор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:41) [11]таг сработаед
procedure TChkWin.RefreshWinList;
procedure EnumWindowsProcs(hW,lp:HWND); stdcall;
begin
ChkWin.fWinList.Add("sdas");
end;
begin
fWinList.Clear;
EnumWindows(@EnumWindowsProcs, 0);
end;
← →
evvcom © (2007-09-17 09:40) [12]
> Slym © (17.09.07 07:41) [11]
> таг сработаед
> ChkWin.fWinList.Add("sdas");
ChkWin - что это? Глобальный параметр? Не делай так больше. И не учи так других.
> Slym © (17.09.07 07:36) [9]
> procedure EnumWindowsProc
А вот это ты правильно выделил, но написал муть. В [8] приведена декларация, это функция, а не процедура.
← →
evvcom © (2007-09-17 09:47) [13]
> Виктор007 (15.09.07 15:54) [6]
Из хелпа:
To continue enumeration, the callback function must return TRUE; to stop enumeration, it must return FALSE.
Рискуешь не найти того, что ищешь.
← →
Виктор007 (2007-09-17 11:18) [14]Да, я заметил что не всегда работает правильно. Зделал так и все прекрасно.
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))
Получает заголовки для всех окон, но помоему работает медленнее...
← →
Slym © (2007-09-17 12:46) [15]evvcom © (17.09.07 9:40) [12]
Не делай так больше. И не учи так других
я постил таг сработаед, а не делай таг
енто раз...
evvcom © (17.09.07 9:40) [12]
это функция, а не процедура
кто-то по тойже причине implimintation с ошибками пищедъ http://delphimaster.net/view/2-1189747819/
енто двас... :)
← →
{RASkov} © (2007-09-17 12:51) [16]> [15] Slym © (17.09.07 12:46)
> кто-то по тойже причине implimintation с ошибками пищедъ
Ээээ.... Это разные вещи :) Триссс
← →
Slym © (2007-09-17 13:00) [17]и немного не доглядел...
я указывал на то что процедура (правильней функция) не метод класса и self в ней неопределен :) а ано вона как передается Self:PChkWin...
енто теперь черырес :-D
← →
evvcom © (2007-09-18 09:29) [18]
> Slym ©
Тебя и так тяжело понять, а еще твое коверканье языка вообще в ступор вводит.
Твое "таг сработаед" я понял, как "сделай так, и будет тебе счастье", т.е. в твоем понимании так верно, значит так и нужно. Если ты закладывал иной смысл в свою реплику, то постарайся тогда в будущем выражаться ясней и на русском языке. Как это на твоем сленге? Пятьс?
И второе, чем тебе не нравится название формального параметра с именем Self в обычной процедуре? Мне не нравится только тем, что смысл параметра все-таки немного не тот (имхо), но работать будет на ура и корректно. Шестьс? :-)
← →
{RASkov} © (2007-09-18 09:50) [19]> [18] evvcom © (18.09.07 09:29)
> чем тебе не нравится название формального параметра с именем
> Self в обычной процедуре
Я бы все равно так не делал... :(
Хоть, да, ошибки нет, но может быть путаница, когда тело процедуры(текста много) большое и не видно заголовка, то можно подумать, что это метод, а self.... ну понятно кто.
:) Ну на крайняк назвал бы так ASelf: T<что-то>
← →
evvcom © (2007-09-18 10:26) [20]
> Я бы все равно так не делал... :(
Так я бы тоже :) Поначалу было дело, писал типа того, но потом поправился на параметры вида AControl: TSomeControl
Страницы: 1 вся ветка
Текущий архив: 2007.10.14;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.027 c