Переслать данные в другую программу методом Drag-and-Drop

Материал из DRKB

Переслать данные в другую программу методом Drag-and-Drop[править | править код]

// Autor: Hagen Reddmann

uses
  ShellAPI;

// Creates a hDrop Object 
// erzeugt ein hDrop Object 
function MakeDrop(const FileNames: array of string): THandle;
var
  I, Size: Integer;
  Data: PDragInfoA;
  P: PChar;
begin
  // Calculate memory size needed 
  // berechne notwendig Speichergro?e 
  Size := SizeOf(TDragInfoA) + 1;
  for I := 0 to High(FileNames) do
    Inc(Size, Length(FileNames[I]) + 1);
  // allocate the memory 
  // alloziere den speicher 
  Result := GlobalAlloc(GHND or GMEM_SHARE, Size);
  if Result <> 0 then
  begin
    Data := GlobalLock(Result);
    if Data <> nil then
    try
      // fill up with data 
      // fulle daten 
      Data.uSize := SizeOf(TDragInfoA);
      P  := PChar(@Data.grfKeyState) + 4;
      Data.lpFileList := P;
      // filenames at the at of the header (separated with #0) 
      // am ende des headers nun die filenamen getrennt mit #0 
      for I := 0 to High(FileNames) do
      begin
        Size := Length(FileNames[I]);
        Move(Pointer(FileNames[I])^, P^, Size);
        Inc(P, Size + 1);
      end;
    finally
      GlobalUnlock(Result);
    end;
    GlobalFree(Result);
    Result := 0;
  end;
 end;

// search for a edit control with classname 'TEditControl' 
// suche ein child fenster mit klassennamen 'TEditControl' 
function MyEnum(Wnd: hWnd; Res: PInteger): Bool; stdcall;
var
  N: string;
begin
  SetLength(N, MAX_PATH);
  SetLength(N, GetClassName(Wnd, Pointer(N), Length(N)));
  Result := AnsiCompareText('TEditControl', N) <> 0;
  if not Result then Res^ := Wnd;
end;

// Example: Open msdos.sys in Delphi's Editor window 
// Beispiel: msdos.sys im Delphi Editor offnen 
procedure TForm1.Button1Click(Sender: TObject);
var
  Wnd: HWnd;
  Drop: hDrop;
begin
  // search for Delphi's Editor 
  // suche Delphis Editor Fenster 
  EnumChildWindows(FindWindow('TEditWindow', nil), @MyEnum, Integer(@Wnd));
  if IsWindow(Wnd) then
  begin
    // Delphi's Editor found. Open msdos.sys 
    // Delphis editor gefunden, also offne msdos.sys 
    Drop := MakeDrop(['c:\msdos.sys']);
    if Drop <> 0 then PostMessage(Wnd, wm_DropFiles, Drop, 0);
    // Free the memory? 
    // Speicher wieder freigeben? 
    GlobalFree(Drop);
  end;
end;


Language: en
Source: Взято с сайта: http://www.swissdelphicenter.ch
ID: 00718