Главная » Delphi » Как получить информацию о пакете

0

Вполне  возможно запросить у пакета  информацию о содержащихся в нем модулях и необходимых ему пакетах. Для этого  используются две процедуры: EnumModules() и  GetPackageInfo(). Обоим  процедурам необходимы функции обратного  вызова (callback  function).  Листинг 14.5  иллюстрирует  применение таких  функций.  Исход ный код примера находится на прилагаемом CD.

Листинг 14.5. Пример получения информации о пакете

unit MainFrm;

interface uses

Windows, Messages, SysUtils, Variants, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, ComCtrls, DBXpress, DB,

SqlExpr, DBTables;

type

TForm1 = class(TForm)

Button1: TButton;

TreeView1: TTreeView;

Table1: TTable;

SQLConnection1: TSQLConnection;

procedure Button1Click(Sender: TObject);

private

{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

Form1: TForm1;

implementation

{$R *.dfm}

type

TNodeHolder = class

ContainsNode: TTreeNode;

RequiresNode: TTreeNode;

end;

procedure RealizeLength(var S: string);begin

SetLength(S, StrLen(PChar(S)));

end;

procedure PackageInfoProc(const Name: string;

NameType: TNameType; Flags: Byte;

Param: Pointer);

var

NodeHolder: TNodeHolder;

TempStr: String;

begin

with Form1.TreeView1.Items do begin

TempStr := EmptyStr;

if (Flags and ufMainUnit) <> 0 then

TempStr := ‘Main unit’

else if (Flags and ufPackageUnit) <> 0 then

TempStr := ‘Package unit’ else

if (Flags and ufWeakUnit) <> 0 then

TempStr := ‘Weak unit';

if TempStr <> EmptyStr then

TempStr := Format(‘ (%s)’, [TempStr]);

NodeHolder := TNodeHolder(Param);

case NameType of

ntContainsUnit: AddChild(NodeHolder.ContainsNode,

Format(‘%s %s’, [Name,TempStr]));

ntRequiresPackage: AddChild(NodeHolder.RequiresNode, Name);

end; // case

end;

end;

function EnumModuleProc(HInstance: integer;

Data: Pointer): Boolean;

var

ModFileName: String;

ModNode: TTreeNode;

ContainsNode: TTreeNode;

RequiresNode: TTreeNode;

ModDesc: String;

Flags: Integer;

NodeHolder: TNodeHolder;

begin

with Form1.TreeView1 do begin

SetLength(ModFileName, 255);

GetModuleFileName(HInstance, PChar(ModFileName), 255);

RealizeLength(ModFileName);

ModNode := Items.Add(nil, ModFileName);

ModDesc := GetPackageDescription(PChar(ModFileName));

ContainsNode := Items.AddChild(ModNode, ‘Contains’);

RequiresNode := Items.Addchild(ModNode, ‘Requires’);

if ModDesc <> EmptyStr then begin

NodeHolder := TNodeHolder.Create;

tryNodeHolder.ContainsNode := ContainsNode; NodeHolder.RequiresNode := RequiresNode; GetPackageInfo(HInstance, NodeHolder,

Flags, PackageInfoProc);

finally

NodeHolder.Free;

end;

Items.AddChild(ModNode, ModDesc);

if Flags and pfDesignOnly = pfDesignOnly then

Items.AddChild(ModNode, ‘Design-time package’);

if Flags and pfRunOnly = pfRunOnly then

Items.AddChild (ModNode, ‘Run-time package’);

end;

end;

Result := True;

end;

procedure TForm1.Button1Click(Sender: TObject);

begin

EnumModules(EnumModuleProc, nil);

end;

end.Сначала  вызывается процедура EnumModules(). Она  просматривает всю выпол няемую программу и пересчитывает все обнаруженные пакеты. Процедуру EnumMod- ules() обслуживает функция обратного  вызова  EnumModuleProc(). Эта  функция заполняет  компонент  TTreeView информацией  о  каждом   пакете   в  приложении. Большую часть кода занимает установка  параметров компонента TTreeView. Функция GetPackageDescription() возвращает  строку,   описывающую  ресурсы,  содержа щиеся  в пакетах. Обращение к процедуре GetPackageInfo() расположено в функ ции обратного вызова  PackageInfoProc().

Функция  PackageInfoProc() способна обработать информационную таблицу па кета  (information table). Она  вызывается для каждого  модуля в составе  пакета  и для каждого   пакета,  обязательного  для  данного  пакета.   Здесь   компонент  TTreeView вновь  заполняется информацией,  полученной в результате  исследования значений параметра Flags и параметра NameType. Более  подробная информация по этой  теме приведена в интерактивной справочной системе в разделе “TPackageInfoProc”.

Приведенный код является модификацией листинга из превосходной книги  Марко Канту (Marco  Cantu) Mastering Delphi 5, которая должна  быть  в библиотеке каждого серьезного программиста Delphi.

Резюме

Пакет  —  это  ключевая часть  архитектуры Delphi/VCL.  Научившись использовать пакеты не только  для хранения компонентов, можно  создавать весьма элегантные приложения, обладающие гибкой  архитектурой.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии