Читаем О чём не пишут в книгах по Delphi полностью

  // повлияет, т.к. функция StrAlloc (а также прочие

  // функции выделения памяти для нуль-терминированных

  // строк модуля SysUtils) сохраняет размер выделенной

  // памяти рядом с самой строкой, и StrDispose

  // ориентируется именно на этот размер, а не на

  // завершающий ноль.

  if TextLen > 104 then

  begin

   (Text + 104)^ := #0;

   (Text + 103)^ := '.';

   (Text + 102)^ := '.';

   (Text + 101)^ := '.';

   (Text + 100)^ := ' ';

  end;

  GetClassName(Wnd, ClassName, ClassNameLen);

  if Text^ = #0 then NodeName := 'Без названия (' + ClassName + ') '

  else NodeName := Text + ' (' + ClassName + ');

  Node := FormWindows.TreeWindows.Items.AddChild(ParentNode, NodeName);

  Node.Data := Pointer(Wnd);

  EnumChildWindows(Wnd, @EnumWindowsProc, LParam(Node));

 finally

  // Вручную освобождаем память, выделенную для буфера

  StrDispose(Text);

 end;

end;

Второй вариант функции EnumWindowsProc отличается от первого только тем что для организации буфера для получения имени окна вместо переменной типа string используется переменная типа PChar. Соответственно, все манипуляции с динамической памятью теперь выполняются вручную, а просто отсечь конец слишком длинной строки и прибавить к результату другую строку (многоточие) мы не можем, приходится модифицировать строку посимвольно. Тем не менее видно, что и с помощью типа PChar задача создания буфера для строки, возвращаемой API-функцией, достаточно легко решается.

<p>1.2.2. Пример Line</p>

Пример Line представляет собой невизуальный компонент TLine, который перехватывает оконные сообщения своего владельца (владельца в терминах VCL, разумеется, раз речь идет о неоконном компоненте). Компонент TLine рисует на своем владельце линию из точки (StartX, StartY) в точку (EndX, EndY) цветом Color. Пользователь может перемещать концы линии мышью. Достаточно разместить компонент TLine на форме, и на ней появится линия, которую пользователь может перемещать как во время проектирования формы, так и во время выполнения программы. Можно также разместить на форме, например, панель, и сделать ее владельцем компонента TLine — тогда линия будет рисоваться на панели. Но это можно сделать только во время исполнения программы, потому что владельцем всех компонентов, созданных во время проектирования формы, становится сама форма. Чтобы установить компонент, нужно выполнить следующие действия:

1. Переписать с компакт-диска файлы Line.pas и Line.dcr в папку, где вы храните компоненты. Если такой папки еще нет, самое время создать ее. Где именно она будет расположена, значения не имеет, выбирайте любое удобное для вас место. Главное — это прописать эту папку в путях, где Delphi ищет компоненты. Чтобы сделать это в Delphi 7 и более ранних версиях, откройте меню Tools\Environment Options, в появившемся диалоговом окне выберите закладку Library и добавьте свою папку в поле Library path. В BDS 2006 и выше откройте меню Tools\Options, в появившемся диалоговом окне в дереве в левой части выберите пункт Environment Options\Delphi Options\Library — Win32 и добавьте папку в поле Library path.

2. Создайте новый пакет (меню File\New\Other, в открывшемся окне выбрать Package). После этого в Delphi 7 и более ранних версиях откроется небольшое окно пакета. В BDS 2006 и более поздних версиях окно не откроется, но пакет появится в группе проектов (по умолчанию это окно Project Manager в правом верхнем углу главного окна). Сохраните пакет в ту же папку, где находится Line.pas, под любым именем, кроме Line (иначе будет конфликт имен).

3. Добавьте в пакет файл Line.pas. В BDS 2006 для этого необходимо с помощью правой кнопки мыши вызвать контекстное меню пакета в окне Project Manager и выбрать там пункт Add. В Delphi 7 и более ранних версиях в окне пакета нужно нажать кнопку Add.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже