home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue57 / DragDrop / DragObjects2U.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2000-03-23  |  4.5 KB  |  166 lines

  1. unit DragObjects2U;
  2.  
  3. {$ifdef Ver90} { Delphi 2.0x }
  4.   {$define DelphiLessThan4}
  5. {$endif}
  6. {$ifdef Ver93} { C++ Builder 1.0x }
  7.   {$define DelphiLessThan4}
  8. {$endif}
  9. {$ifdef Ver100} { Delphi 3.0x }
  10.   {$define DelphiLessThan4}
  11. {$endif}
  12. {$ifdef Ver110} { C++ Builder 3.0x }
  13.   {$define DelphiLessThan4}
  14. {$endif}
  15.  
  16. {$ifndef DelphiLessThan4}
  17.   'This project is designed for Delphi 2 and 3'
  18. {$endif}
  19.  
  20. interface
  21.  
  22. uses
  23.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  24.   StdCtrls, ExtCtrls;
  25.  
  26. type
  27.   //Custom drag object based on TDragObject 
  28.   //in order to work well in Delphi 2 and 3
  29.   TTextDragObject = class(TDragObject)
  30.   private
  31.     FControl: TControl;
  32.   protected
  33.     function GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor; override;
  34.   public
  35.     Data: String;
  36.     constructor Create(Control: TControl);
  37.     property Control: TControl read FControl;
  38.   end;
  39.  
  40.   TForm1 = class(TForm)
  41.     Label1: TLabel;
  42.     Edit1: TEdit;
  43.     Panel1: TPanel;
  44.     Button1: TButton;
  45.     Memo1: TMemo;
  46.     ListBox1: TListBox;
  47.     ComboBox1: TComboBox;
  48.     procedure Button1StartDrag(Sender: TObject;
  49.       var DragObject: TDragObject);
  50.     procedure Label1StartDrag(Sender: TObject;
  51.       var DragObject: TDragObject);
  52.     procedure ComboBox1StartDrag(Sender: TObject;
  53.       var DragObject: TDragObject);
  54.     procedure Edit1StartDrag(Sender: TObject; var DragObject: TDragObject);
  55.     procedure Memo1StartDrag(Sender: TObject; var DragObject: TDragObject);
  56.     procedure ListBox1StartDrag(Sender: TObject;
  57.       var DragObject: TDragObject);
  58.     procedure SharedEndDrag(Sender, Target: TObject; X, Y: Integer);
  59.     procedure Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  60.       State: TDragState; var Accept: Boolean);
  61.     procedure Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
  62.   private
  63.     FDragObject: TTextDragObject;
  64.   end;
  65.  
  66. var
  67.   Form1: TForm1;
  68.  
  69. implementation
  70.  
  71. {$R *.DFM}
  72.  
  73. { TTextDragObject }
  74.  
  75. type
  76.   TControlAccess = class(TControl);
  77.  
  78. constructor TTextDragObject.Create(Control: TControl);
  79. begin
  80.   inherited Create;
  81.   FControl := Control
  82. end;
  83.  
  84. function TTextDragObject.GetDragCursor(Accepted: Boolean; X, Y: Integer): TCursor;
  85. begin
  86.   if Accepted then
  87.     Result := TControlAccess(Control).DragCursor
  88.   else
  89.     Result := inherited GetDragCursor(Accepted, X, Y)
  90. end;
  91.  
  92. { TForm1 }
  93.  
  94. procedure TForm1.Button1StartDrag(Sender: TObject;
  95.   var DragObject: TDragObject);
  96. begin
  97.   FDragObject := TTextDragObject.Create(Sender as TButton);
  98.   FDragObject.Data := TButton(Sender).Caption;
  99.   DragObject := FDragObject;
  100. end;
  101.  
  102. procedure TForm1.Label1StartDrag(Sender: TObject;
  103.   var DragObject: TDragObject);
  104. begin
  105.   FDragObject := TTextDragObject.Create(Sender as TLabel);
  106.   FDragObject.Data := TLabel(Sender).Caption;
  107.   DragObject := FDragObject;
  108. end;
  109.  
  110. procedure TForm1.ComboBox1StartDrag(Sender: TObject;
  111.   var DragObject: TDragObject);
  112. begin
  113.   FDragObject := TTextDragObject.Create(Sender as TComboBox);
  114.   FDragObject.Data := TComboBox(Sender).Text;
  115.   DragObject := FDragObject;
  116. end;
  117.  
  118. procedure TForm1.Edit1StartDrag(Sender: TObject;
  119.   var DragObject: TDragObject);
  120. begin
  121.   FDragObject := TTextDragObject.Create(Sender as TEdit);
  122.   FDragObject.Data := TEdit(Sender).Text;
  123.   DragObject := FDragObject;
  124. end;
  125.  
  126. procedure TForm1.Memo1StartDrag(Sender: TObject;
  127.   var DragObject: TDragObject);
  128. begin
  129.   FDragObject := TTextDragObject.Create(Sender as TMemo);
  130.   FDragObject.Data := TMemo(Sender).Text;
  131.   DragObject := FDragObject;
  132. end;
  133.  
  134. procedure TForm1.ListBox1StartDrag(Sender: TObject;
  135.   var DragObject: TDragObject);
  136. begin
  137.   FDragObject := TTextDragObject.Create(Sender as TListBox);
  138.   with TListBox(Sender) do
  139.     FDragObject.Data := Items[ItemIndex];
  140.   DragObject := FDragObject;
  141. end;
  142.  
  143. procedure TForm1.SharedEndDrag(Sender, Target: TObject; X, Y: Integer);
  144. begin
  145.   //All draggable controls share this event handler
  146.   FDragObject.Free;
  147.   FDragObject := nil
  148. end;
  149.  
  150. procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
  151.   State: TDragState; var Accept: Boolean);
  152. begin
  153.   //It is tempting to write this...
  154.   //Accept := Source is TTextDragObject
  155.   //...however we are advised to write this instead
  156.   Accept := IsDragObject(Source)
  157. end;
  158.  
  159. procedure TForm1.Panel1DragDrop(Sender, Source: TObject; X, Y: Integer);
  160. begin
  161.   //The OnDragOver event handler verified we are dealing with a
  162.   //drag object so there is no chance of getting a normal control
  163.   (Sender as TPanel).Caption := TTextDragObject(Source).Data
  164. end;
  165.  
  166. end.