Подробный и понятный комментарий!
Все мы хорошо знаем, как сложно порой разбирать исходники столь важные для нас.
Даже при наличии комментариев, чаще всего авторы их не уделяют внимания нюансам, или считают их делом само собой разумеющимся.
И не раз приходилось заново всё самим раскомментировать в меру своих знаний.
Однако, это настоящее несчастье для новичков, а ещё более для тех, кому мало просто вставить код, и чтоб он работал!
Настоящий исследователь постоянно задаётся вопросами типа: А почему именно так? А можно ли сделать эдак?
Глядя на константу WS_EX_TOPMOST: А какие ещё бывают? И так далее...
В результате приходится сутками рыться в интернете и справочниках в поисках подробностей.
В связи с этим предлагаю в рамках данной темы создать общим усилием Базу Подробных Комментариев, которая нам позволит сохранить многие часы в поисках сути, а при необходимости выяснить детали у автора напрямую.
Предлагаю такую схему:
1.Источник исходника - сайт или справочник если прога не своя.
2.Описание программы - что она делает.
3.Собственно листинг, причём с прекрасным, подробным комментарием!
Помоему идея заслуживает внимания.
В качестве начинания даю первый код.
Взято со страницы http://www.delphisyte.ru/Articles/base/api_find_window_and_activate_it.html и подробно раскомментировано мною лично.
Как получить дескриптор(хендл) окна другого приложения и сделать его активным?
Использование фуекции Windows API FindWindow() - простейший способ нахождение окна, при условии, что известен его заголовок или имя оконного класса. Если Вам известна только часть заголовка окна (например 'Netscape - ' + 'какой-то неизвестный URL'), Вам нужно использовать функцию EnumWindows() для получения всех окон, затем вызывать функцию GetWindowsText() и GetClassName для поиска нужного окна. Следующий пример находит первое окно, содержащее совпадающую часть заголовка окна и полностью совпадающее название оконного класса (если он задан) и делает это окно активным.
Читать следует с конца, т.к. описания всех функций расположены до их вызова.
type {объявляем свои типы}
PFindWindowStruct = ^TFindWindowStruct;{указатель на тип TFindWindowStruct}
TFindWindowStruct = record {тип TFindWindowStruct в себе содержит...}
Caption : string;
ClassName : string;
WindowHandle : THandle;
end;
function EnumWindowsProc(hWindow : hWnd;
lParam : LongInt) : Bool
{$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
lpBuffer : PChar;
WindowCaptionFound : bool;
ClassNameFound : bool;
begin
GetMem(lpBuffer, 255);{выделяем 255 байт динамической памяти под указатель lpBuffer: Pointer}
Result := True;{для продолжения перечисления окон функцией EnumWindows}
WindowCaptionFound := False;{обнуляем перед поиском - ещё не найдено}
ClassNameFound := False;{обнуляем перед поиском - ещё не найдено}
try
if GetWindowText(hWindow, lpBuffer, 255) > 0 {если текст заголовка не нулевой...}
then
if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 {и если позиция
переданного заголовка('Netscape - ')в строке lpBuffer не нулевая, т.е. он в ней есть...}
then WindowCaptionFound := true;{...заголовок найден!}
if PFindWindowStruct(lParam).ClassName = '' then {если класс окна не указан(не важен)...}
ClassNameFound := True {...то будем будем считать, что он найден}
else { иначе(если указан)...}
if GetClassName(hWindow, lpBuffer, 255) > 0 then {...если класс окна не нулевой...}
if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer))> 0 {и если позиция
переданной строки класса в строке lpBuffer не нулевая, т.е. она в ней есть...}
then ClassNameFound := True;{...требуемый класс найден!}
if (WindowCaptionFound and ClassNameFound) then begin {если и заголовок и класс найдены...}
PFindWindowStruct(lParam).WindowHandle := hWindow;{хендл окна - искомый результат,
передаём в поле WindowHandle}
Result := False; {для завершения перечисления окон функцией EnumWindows}
end;
finally
FreeMem(lpBuffer, sizeof(lpBuffer^));{освобождаем область памяти размером указанным lpBuffer^ ,
выделенную ранее процедурой GetMem}
end;
end;
function FindAWindow(Caption : string;
ClassName : string) : THandle;{функция поиска должна вернуть хендл}
var
WindowInfo : TFindWindowStruct;{присваиваем тип}
begin
with WindowInfo do
begin {заполняем поля этого типа преданными FindAWindow параметрами}
Caption := Caption; {'Netscape - '}
ClassName := ClassName; {''}
WindowHandle := 0; {обнуляем перед поиском}
EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));{перечисляем все pодительские окна на экpане,
передавая по очереди хендл каждого окна(hWindow)в функцию обратного вызова EnumWindowsProc
пока не получим от неё Result := False }
FindAWindow := WindowHandle; {хендл окна - искомый результат,
передан в поле WindowHandle функцией EnumWindowsProc}
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
TheWindowHandle : THandle;{хендл искомого окна - будет найден функцией FindAWindow}
begin
TheWindowHandle := FindAWindow('Netscape - ', '');{FindAWindow функция поиска и её параметры}
if TheWindowHandle = 0 then {если не найдено...}
ShowMessage('Окно не найдено!') {выводим сообщение}
else {иначе...}
BringWindowToTop(TheWindowHandle);{...наверх и активизировать!}
end;
Завалим толпою этого зверюгу - Delphi!
С мнением начет ну оч-чень подробных комментариев не согласен. Комментарий должен быть только там, где это действительно нужно, не засоряя основной логики алгоритма. Как говориться, редко, да метко.
Ты посмотри, столько места (в строках кода) занял и времени отнял у тебя такой элементарнейший алгоритм. А представь, что будет, если тебе придется реализовать сколько-нибудь сложнуй задачу.
Многие статьи в MSDN для новичков весьма туманны, согласен. Но человек, поднабравшийся опыта, наоборот, находит, что в них нету ненужной воды, зато все расписано по полочкам. По моему, очень даже правильно.
. . .
Комментарий должен быть только там, где это действительно нужно, не засоряя основной логики алгоритма. Как говориться, редко, да метко.
. . .
Полностью согласен. Как заметил один известный человек (к сожалению не помню имени): "Чтение программы должно быть таким же трудным занятием, как и ее написание"
А коментарии по поводу и без только отвлекают внимание от чтения.
А что будет если ваш коментарий содержит неправильное истолкование? Вообще можно запутаться.
Помоему идея заслуживает внимания.
Комментировать исходники - задача нужная, и порой незаменимая. Только вот размещать комментарии непосредственно в исходном коде является далеко не лучшим выбором. В исходниках одной известной фирмы (не будем показывать пальцем ;)), например, за комментариями не видно кода. Если простая процедура из десяти строк расписывается так, что для ее чтения приходится один раз нажимать PageDown - это уже кошмар.
Обратите внимание на технологию вроде JavaDoc. Она вроде уже реализована для многих языков программирования, в том числе Паскаля и Си. Только вот реальное ее использование напрямую зависит от поддержки средой разработки. Короче, копайте...