Управление Program Manager в Win95 с помощью DDE
01.01.2007
Для управления программными группами в Program Manager с помощью DDE мною был использован следующий модуль. За основу был взят код Steve Texeira (sp) из руководства Dephi Developers Guide.
Работает под Win 3.1 и '95.
unit Pm; interface uses SysUtils, Classes, DdeMan; type EProgManError = class(Exception); TProgMan = class(TComponent) private FDdeClientConv: TDdeClientConv; procedure InitDDEConversation; function ExecMacroString(Macro: string): Boolean; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; procedure CreateGroup(GroupName: string; ShowGroup: Boolean); procedure DeleteGroup(GroupName: string); procedure DeleteItem(ItemName: string); procedure AddItem(CmdLine, ItemName: string); end; implementation uses Utils; const { DDE-макростроки для Program Manager } SDDECreateGroup = '[CreateGroup(%s)]'; SDDEShowGroup = '[ShowGroup(%s, 1)]'; SDDEDeleteGroup = '[DeleteGroup(%s)]'; SDDEDeleteItem = '[DeleteItem(%s)]'; SDDEAddItem = '[AddItem(%s, "%s", %s)]'; constructor TProgMan.Create(AOwner: TComponent); begin inherited Create(AOwner); InitDDEConversation; end; destructor TProgMan.Destroy; begin if Assigned(FDDEClientConv) then FDdeClientConv.CloseLink; inherited Destroy; end; function TProgMan.ExecMacroString(Macro: string): Boolean; begin StringAsPchar(Macro); Result := FDdeClientConv.ExecuteMacro(@Macro[1], False); end; procedure TProgMan.InitDDEConversation; begin FDdeClientConv := TDdeClientConv.Create(Self); if not FDdeClientConv.SetLink('PROGMAN', 'PROGMAN') then raise EProgManError.Create('Не могу установить DDE Link'); end; procedure TProgMan.CreateGroup(GroupName: string; ShowGroup: Boolean); begin { Удаляем группу, если она существует } ExecMacroString(Format(SDDEDeleteGroup, [GroupName])); if not ExecMacroString(Format(SDDECreateGroup, [GroupName])) then raise EProgManError.Create('Не могу создать группу ' + GroupName); if ShowGroup then if not ExecMacroString(Format(SDDEShowGroup, [GroupName])) then raise EProgManError.Create('Не могу показать группу ' + GroupName); end; procedure TProgMan.DeleteGroup(GroupName: string); begin if not ExecMacroString(Format(SDDEDeleteGroup, [GroupName])) then raise EProgManError.Create('Не могу удалить группу ' + GroupName); end; procedure TProgMan.DeleteItem(ItemName: string); begin if not ExecMacroString(Format(SDDEDeleteGroup, [ItemName])) then raise EProgManError.Create('Не могу удалить элемент ' + ItemName); end; procedure TProgMan.AddItem(CmdLine, ItemName: string); var P: PChar; PSize: Word; begin PSize := StrLen(SDDEAddItem) + (Length(CmdLine) * 2) + Length(ItemName) + 1; GetMem(P, PSize); try StrFmt(P, SDDEAddItem, [CmdLine, ItemName, CmdLine]); if not FDdeClientConv.ExecuteMacro(P, False) then raise EProgManError.Create('Не могу добавить элемент ' + ItemName); finally FreeMem(P, PSize); end; end; end.
DelphiWorld 6.0