tag:blogger.com,1999:blog-1702873441071265539.post939798510520693335..comments2023-05-29T19:02:20.570+03:00Comments on Блог GunSmoker-а: Задачка №18АGunSmokerhttp://www.blogger.com/profile/15611696588191431330noreply@blogger.comBlogger13125tag:blogger.com,1999:blog-1702873441071265539.post-70243205047726316002015-05-01T00:17:33.675+03:002015-05-01T00:17:33.675+03:00Меня вполне устраивал статичный старый, CodeMonkey...Меня вполне устраивал статичный старый, <b>CodeMonkey</b>. Вполне удобный был.Anonymoushttps://www.blogger.com/profile/00085796548321458688noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-31300770510705531292015-05-01T00:16:47.744+03:002015-05-01T00:16:47.744+03:00Этот комментарий был удален автором.Anonymoushttps://www.blogger.com/profile/00085796548321458688noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-47581260295590809712015-04-29T14:54:18.914+03:002015-04-29T14:54:18.914+03:00Увы, не получалось у меня нормально настроить отоб...Увы, не получалось у меня нормально настроить отображения на всех устройствах. Поэтому поменял тему на попроще - теперь блог можно нормально читать на компе, планшетах и мобилках.<br /><br />При желании можно вручную использовать <a href="http://www.gunsmoker.ru/view/classic" rel="nofollow">несколько динамических шаблонов</a>, но их работу я не проверял.GunSmokerhttps://www.blogger.com/profile/15611696588191431330noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-88452693329581221262015-04-28T12:41:22.038+03:002015-04-28T12:41:22.038+03:00Блин, почему блог только в "Simple" отоб...Блин, почему блог только в "Simple" отображается? Где нормальные десктопные шаблоны?Anonymoushttps://www.blogger.com/profile/00085796548321458688noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-17819652045606347642015-04-23T19:01:33.971+03:002015-04-23T19:01:33.971+03:00После чего значение глобальной переменной перезатр...После чего значение глобальной переменной перезатрет любой сторонний поток, который тоже имеет к ней доступ. <br />Вы серьезно? :)Александр (Rouse_) Багельhttps://www.blogger.com/profile/03072586754182036553noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-23729520268807094182015-04-23T18:50:32.340+03:002015-04-23T18:50:32.340+03:00Конечно сохраняется, я даже и спорить не будут. Но...Конечно сохраняется, я даже и спорить не будут. Но что нам это дает, если калбэк не умеет получать эту информацию? :)Александр (Rouse_) Багельhttps://www.blogger.com/profile/03072586754182036553noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-46485014392935025132015-04-23T13:44:18.236+03:002015-04-23T13:44:18.236+03:00Компилятор рассчитает кадр стека относительно Butt...Компилятор рассчитает кадр стека относительно <i>Button1Click</i>. Но в действительности вызов <i>EnumWindowsProc</i> произойдет из другой подпрограммы.<br />Но раз есть пользовательский параметр, чего же ним не воспользоваться?<br />-------<br />procedure TForm1.Button1Click(Sender: TObject);<br /><br /> function EnumWindowsProc(Wnd: HWND; Param: LPARAM): LongBool; stdcall;<br /> begin<br /> if Param = 0 then<br /> begin<br /> SetLastError(ERROR_INVALID_PARAMETER);<br /> Result := false;<br /> end<br /> else if TForm(Param).Handle = Wnd then<br /> begin<br /> TForm(Param).Caption := 'OK';<br /> SetLastError(ERROR_SUCCESS);<br /> Result := false;<br /> end<br /> else<br /> Result := true;<br /> end;<br />begin<br /> if not EnumWindows(@EnumWindowsProc, LPARAM(Self)) and (GetLastError <> ERROR_SUCCESS) then<br /> RaiseLastOSError;<br />end;Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-54196175107737805762015-04-23T10:47:12.848+03:002015-04-23T10:47:12.848+03:00На самом деле Wnd и Self сохраняются в стеке TForm...На самом деле Wnd и Self сохраняются в стеке TForm1.Button1Click, и затем оттуда получаются EnumWindowsProc.<br />Просто в данном случае это не работает. Такое вот ограничение вложенной функции, ее можно вызвать только непосредственно из основной функции.Chaahttps://www.blogger.com/profile/14387721107858333063noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-43247439657320910652015-04-22T23:02:54.277+03:002015-04-22T23:02:54.277+03:00var
Form1: TForm1;
Wnd: HWND;
implementation
...var<br /> Form1: TForm1;<br /> Wnd: HWND;<br /><br />implementation<br /><br />{$R *.dfm}<br /><br />procedure TForm1.Button1Click(Sender: TObject);<br />(* <br /> область видимости переменной ограничена локальным стеком,<br /> поэтому Wnd будет не доступна для EnumWindowsProc<br /> переносим переменную Wnd в объявление глобальных переменных<br />var<br /> Wnd: HWND;<br />*)<br /> function EnumWindowsProc(const AWnd: HWND; const AParam: LPARAM): BOOL; stdcall;<br /> begin<br /> if AWnd = Wnd then<br /> begin<br /> (* Caption := 'OK'; *) // Свойство Caption окна не доступно при вызове EnumWindowsProc<br /> SetWindowText(Wnd, 'ОК'); // Изменяем Caption окна например так<br /> Result := False; // При нахождении окна программы, прерываем выполнение EnumWindows<br /> end else<br /> Result := True;<br /> end;<br /><br />begin<br /> Wnd := Handle;<br /> EnumWindows(@EnumWindowsProc, 0);<br />end;<br /><br />B3nT3nnoreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-24877695481134413342015-04-22T12:58:15.524+03:002015-04-22T12:58:15.524+03:001. Self не передается в callback
2. эта строка не ...1. Self не передается в callback<br />2. эта строка не верная "if AWnd = Wnd then" т.к. вместо значения Wnd берется что-то от балды со стека - можно вообще на AV налететь при хорошем везении<br />3. ну и это, из-за пункта 1 тоже не верно "Caption := 'OK';"Александр (Rouse_) Багельhttps://www.blogger.com/profile/03072586754182036553noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-64447986693466009912015-04-22T08:02:25.281+03:002015-04-22T08:02:25.281+03:00Да, помню меня это сильно удивило, когда я столкну...Да, помню меня это сильно удивило, когда я столкнулся с таким первый раз - компилятор "видит" переменные, а на самом деле эти переменные выходят из области видимости.<br />Наверняка следующая часть будет связана со стекомНиколай Зверевhttps://www.blogger.com/profile/08965247674233981930noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-44617662306394364722015-04-22T07:02:33.953+03:002015-04-22T07:02:33.953+03:00Задачка очень интересная.
> не передаёт указат...Задачка очень интересная.<br /><br />> не передаёт указатель Self, переменная WND в теле этой процедуры будет не видна...<br />В этом случае код бы не компилировался. А он компилируется, и даже работает. Но неправильно.Chaahttps://www.blogger.com/profile/14387721107858333063noreply@blogger.comtag:blogger.com,1999:blog-1702873441071265539.post-25535912140288407012015-04-22T00:20:40.199+03:002015-04-22T00:20:40.199+03:00Ну, EnumWindows - это API функция винды, и когда о... Ну, EnumWindows - это API функция винды, и когда она вызывает callback функцию EnumWindowsProc, она не передаёт указатель Self, поэтому "Caption := 'OK'" должен будет вызвать исключение.<br /> Ну и, переменная WND в теле этой процедуры то-же будет не видна - ведь она вызывается через callback функцию.<br /><br /> Точнее так: из callback функции EnumWindowsProc недоступны данные процедуры, вызвавшей EnumWindows - ни указатель Self, ни переменная Wnd.<br />AlnZhttps://www.blogger.com/profile/04024511757099280427noreply@blogger.com