Работает под Win 3.1 и '95.
unitPm;
interface
usesSysUtils, Classes, DdeMan;
type
EProgManError = class( Exception);
TProgMan = class(TComponent)
private
FDdeClientConv: TDdeClientConv;
procedureInitDDEConversation;
functionExecMacroString(Macro: String): Boolean;
public
constructorCreate(AOwner: TComponent); override;
destructorDestroy; override;
ProcedureCreateGroup(GroupName: String; ShowGroup:Boolean);
procedureDeleteGroup(GroupName: String);
procedureDeleteItem(ItemName: String);
procedureAddItem(CmdLine, ItemName: String);
end;
implementation
usesUtils;
const
{ DDE-макростроки для Program Manager }
SDDECreateGroup = '[CreateGroup(%s)]';
SDDEShowGroup = '[ShowGroup(%s, 1)]';
SDDEDeleteGroup = '[DeleteGroup(%s)]';
SDDEDeleteItem = '[DeleteItem(%s)]';
SDDEAddItem = '[AddItem(%s, "%s", %s)]';
constructorTProgMan.Create(AOwner: TComponent);
begin
inheritedCreate(AOwner);
InitDDEConversation;
end;
destructorTProgMan.Destroy;
begin
ifAssigned(FDDEClientConv) thenFDdeClientConv.CloseLink;
inheritedDestroy;
end;
functionTProgMan.ExecMacroString(Macro: String): Boolean;
Begin
StringAsPchar(Macro);
Result := FDdeClientConv.ExecuteMacro(@Macro[1], False);
End;
ProcedureTProgMan.InitDDEConversation;
begin
FDdeClientConv := TDdeClientConv.Create(Self);
If NOTFDdeClientConv.SetLink('PROGMAN', 'PROGMAN') then
raiseEProgManError.Create('Не могу установить DDE Link');
end;
ProcedureTProgMan.CreateGroup(GroupName: String; ShowGroup:Boolean);
Begin
{ Удаляем группу, если она существует }ExecMacroString(Format(SDDEDeleteGroup, [GroupName]));
If NOTExecMacroString(Format(SDDECreateGroup, [GroupName])) then
raiseEProgManError.Create('Не могу создать группу ' + GroupName);
IfShowGroup then
If notExecMacroString(Format(SDDEShowGroup, [GroupName])) then
raiseEProgManError.Create('Не могу показать группу ' + GroupName);
End;
ProcedureTProgMan.DeleteGroup(GroupName: String);
Begin
if NOTExecMacroString(Format(SDDEDeleteGroup, [GroupName])) then
raiseEProgManError.Create('Не могу удалить группу ' + GroupName);
End;
ProcedureTProgMan.DeleteItem(ItemName: String);
Begin
if NOTExecMacroString(Format(SDDEDeleteGroup, [ItemName])) then
raiseEProgManError.Create('Не могу удалить элемент ' + ItemName);
End;
ProcedureTProgMan.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 NOTFDdeClientConv.ExecuteMacro(P, False) then
raiseEProgManError.Create('Не могу добавить элемент ' + ItemName);
finally
FreeMem(P, PSize);
end;
End;
end.
GROUPFILE и ADDITEM для групп
Вот код для создания файла группы и добавления в группу файла-элемента. Чтобы использовать эту процедуру, определите DDE clientconv App как ProgMan.
procedureTMainForm.CreateWinGroup(Sender: TObject);
var
Name: string;
Name1: string;
Macro: string;
Macro1: string;
Cmd, Cmd1: array[0..255] ofChar;
begin
{destDir - dos-каталог, хранящий YourFile.Ext'}
Name := 'GroupName';
Name1 := destDir + 'YourFile.Ext, FileName_in_Group ';
Macro := Format('[CreateGroup(%s)]', [Name]) + #13#10;
Macro1 :=Format('[Additem(%s)]',[Name1]) +#13#10;
StrPCopy(Cmd, Macro);
StrPCopy(cmd1, Macro1);
DDEClient.OpenLink;
if notDDEClient.ExecuteMacro(Cmd, False) then
MessageDlg('Невозможно создать группу '+Name, mtInformation, [mbOK], 0)
else begin
DDEClient.ExecuteMacro(Cmd1, False);
end;
DDEClient.CloseLink;
end;
Как можно работать с DDE под Delphi, используя вызовы API?
Кстати, достаточно легко: следующий пример демонстрирует как можно научить общаться клиентскую программу с программой-сервером. Обе программы полностью созданы на Delphi. В итоге мы имеем 2 проекта, 3 формы и 3 модуля. Для работы с DDE-запросами данный пример использует методы DDE ML API.
Читать дальше