Contributor: IBOA

unit DropBtns;

{ (C) 1995, ingenieursbureau Office Automation
  All Rights Reserved

  Hereby the right to distribute this work electronically is granted,
  provided such is done for at most a nominal fee. Also the right is
  granted to store this work on a computer system.
  Finally the right is granted to incorporate this work into other
  work provided no fee is asked for this work.
  In all cases of distribution this work must be distributed in full,
  which specifically includes this notice.
  Liability is limited to the amount payed for this work. Legal
  jurisdiction is with the court of Leeuwarden, the Netherlands.
}

interface

uses
  WinTypes, WinProcs, Messages, Classes, Controls, Forms, Graphics,
  StdCtrls, ExtCtrls, Buttons, ShellApi, SysUtils;

type
  TDropButton = class(TBitBtn)
  protected
    procedure CreateParams(var Params : TCreateParams); override;
    procedure WMDropFiles(var Message : TMessage); message WM_DROPFILES;
  end;

procedure Register;

implementation

procedure TDropButton.CreateParams(var Params : TCreateParams);
begin
  inherited CreateParams(Params);
  with Params do
  begin
    ExStyle := ExStyle or WS_EX_ACCEPTFILES;
  end;
end;

procedure TDropButton.WMDropFiles(var Message : TMessage);
var
  hDrop : THandle;
  nFiles, i, j, size : word;
  Glyphs : integer; {darned privates!}
  Pstr : PChar;
begin
  hDrop := Message.WParam;
  Pstr := StrAlloc(256);
  Pstr[0] := chr(0);
  Message.Result := 0; {accept}
  try
    nFiles := DragQueryFile(hDrop, $FFFF, Pstr, size);
    dec(nFiles);
    for i := nFiles to nFiles do
    begin
      size := DragQueryFile(hDrop, i, nil, size); {don't ask}
      size := DragQueryFile(hDrop, i, Pstr, size+1);
      Glyph.LoadFromFile(StrPas(Pstr));
      if Glyph.Width mod Glyph.Height = 0 then
      begin
        Glyphs := Glyph.Width div Glyph.Height;
        if Glyphs > 4 then Glyphs := 1;
        NumGlyphs := Glyphs;
      end;
    end;
  finally
    DragFinish(hDrop);
    StrDispose(Pstr);
  end;
end;

procedure Register;
begin
  RegisterComponents('IBOA', [TDropButton]);
end;

end.