Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1180362429
makvell
2007-05-28 18:27
2007.10.14
Какие компоненты использовать


3-1180078722
DelphiLexx
2007-05-25 11:38
2007.10.14
FIBDataSet.RollBack


1-1185946868
Alexey_k
2007-08-01 09:41
2007.10.14
www-addres to file name


15-1190031053
boa_kaa
2007-09-17 16:10
2007.10.14
И это задача для детсткого сада!


15-1189284559
NailMan
2007-09-09 00:49
2007.10.14
К вопросу об уничтоженнии данны на харде