Для управления программными группами в 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. |
[001421]