看看demo下的richedit的标尺拖动是怎样写的

解决方案 »

  1.   

    标尺是移动,我要的是拖动(并且发生dragdrop事件),还有另的办法吗???????
      

  2.   

    这个对你有帮助吗?
    9.1.3 拖放方法  拖放方法有三个:
      ●BeginDrag   :  人工方式下开始一个拖动
      ●EndDrag    : 结束一个拖动
      ●Dragging    :  判断一个控件是否正被拖动  这三个方法都被源控件使用。
      当DragMode置为dmManual时,拖动必须调用控件的BeginDrag方法才能开始。BeginDrag有一个布尔参数Immediate。如果输入参数为True,拖动立即开始,光标改变到DragCursor的设置。如果输入参数为False,直到用户将光标移动了一定的距离(5个象素点)后才改变光标,开始拖动。这就允许控件接受一个OnClick事件而并不开始拖动操作。
      EndDrag方法中止一个对象的被拖动状态。它有一个布尔参数Drop。如果Drop设置为True,被拖动的对象在当前位置放下(能否被接受由目标控件决定);如果Drop设置为False,则拖动就地被取消。
      下面一段程序表明当拖动进入一控制面板时拖动被取消。
         
    procedure TForm1.Panel1DragOver(Sender, Source: TObject; X, Y: Integer;
                                    State: TDragState; var Accept: Boolean);
    begin
      Accept := False;
      if (Source is TLabel) and (State = dsDragEnter) then
                     (Source as TLabel).EndDrag(False);
    end;  Draging方法判断一个控件是否正被拖动。在下面的例子中当用户拖动不同的检查框时窗口改变为不同的颜色。 procedure TForm1.FormActivate(Sender: TObject);
    begin
      CheckBox1.DragMode := dmAutomatic;
      CheckBox2.DragMode := dmAutomatic;
      CheckBox3.DragMode := dmAutomatic;
    end; procedure TForm1.FormDragOver(Sender, Source: TObject; X, Y: Integer;
                                   State: TDragState; var Accept: Boolean);
    begin
      if CheckBox1.Dragging then
        Color := clAqua;
      if CheckBox2.Dragging then
        Color := clYellow;
      if CheckBox3.Dragging then
        Color := clLime;
    end;9.2  开发拖放功能的一般步骤  拖放作为Windows提供的一种方便操作对象的功能,在Delphi中可以很容易地开发出来。根据拖放操作的过程可以把开发步骤划分为四个阶段,即:
      ● 开始拖动操作
      ● 接收拖动项目
      ● 放下拖动项目
      ● 终止拖动操作  在介绍过程中我们将结合一个TabSet(标签集)的拖放操作实例。界面设计如图。在运行时当用户把一个标签拖动到另一个标签的位置时,该标签将移动到该位置并引起标签集的重新布置。               图9.1  TabSet 拖放实例的界面设计9.2.1 开始拖动操作  当拖动模式(DragMode)设置为dmAutomatic时,用户在源控件上按下鼠标时拖动自动开始;当设置为dmManual时通过处理鼠标事件来决定拖动是否开始。如果想开始拖动调用BeginDrag方法。
      在TabSet拖放中,我们用下面的MouseDown事件处理过程来开始一个标签的拖动。首先判断按下的是否是左键,而后再判断项目是否合法。
     
    procedure TForm1.TabSet1MouseDown(Sender: TObject; Button: TMouseButton;
                                     Shift: TShiftState; X, Y: Integer);
    var
      DragItem: Integer;
    begin
      if Button = mbLeft then
      begin
        DragItem := TabSet1.ItemAtPos(Point(X, Y));
        if (DragItem > -1) and (DragItem < TabSet1.Tabs.Count) then
        TabSet1.BeginDrag(False);
      end;
    end;9.2.2 接收拖动项目  一个控件能否接收拖动项目是由该控件的OnDragOver事件决定的。在TabSet拖动中,主要是利用鼠标的位置进行判断。
      
    procedure TForm1.TabSet1DragOver(Sender, Source: TObject; X, Y: Integer;
                                     State: TDragState; var Accept: Boolean);
    var
      DropPos: Integer;
    begin
      if Source = TabSet1 then
      begin
        DropPos := TabSet1.ItemAtPos(Point(X, Y));
        Accept := (DropPos > -1) and (DropPos <> TabSet1.TabIndex) and
                   (DropPos < TabSet1.Tabs.Count);
      end;
      else
            Accept := False;
    end;9.2.3 放下拖动项目  当OnDragOver事件处理过程返回的Accept为True且项目被放下时,由OnDragDrop事件处理过程来完成拖动放下后的响应。在TabSet拖放实例中是改变标签的位置。
     
    procedure TForm1.TabSet1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      OldPos: Integer;
      NewPos: Integer;
    begin
      if Source = TabSet1 then 
      begin
        OldPos := TabSet1.TabIndex;
        NewPos := TabSet1.ItemAtPos(Point(X, Y));
        if (NewPos > -1) and (NewPos <> OldPos) then
          TabSet1.Tabs.Move(OldPos, NewPos);
      end;
    end;9.2.4 结束拖动操作  结束拖动操作的方式有两种:或者是用户释放了鼠标键或者是程序用EndDrag方法强行中止拖动。结束拖动操作的后果有两种:放下被接受或放下被忽略。
      拖动操作结束后源控件都要收到一条消息响应拖动结束事件OnEndDrag。
      

  3.   

    从资源管理器中拖放
    You must interface with the Windows Shell API module to let
    Windows know that your application accepts dropped files (this
    can be done in your main form's create event), and then you must
    respond to the drag events as they happen by creating an event
    handler.The following is an example of a Delphi form that accepts dropped
    files and adds the names of the files to a memo component:unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        procedure FormCreate(Sender: TObject);
      private
        procedure WMDROPFILES(var Message: TWMDROPFILES);
          message WM_DROPFILES;
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}uses ShellApi;procedure TForm1.FormCreate(Sender: TObject);
    begin
     {Let Windows know we accept dropped files}
      DragAcceptFiles(Form1.Handle, True);
    end;procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
    var
      NumFiles : longint;
      i : longint;
      buffer : array[0..255] of char;
    begin
     {How many files are being dropped}
      NumFiles := DragQueryFile(Message.Drop,
                                -1,
                                nil,
                                0);
     {Accept the dropped files}
      for i := 0 to (NumFiles - 1) do begin
        DragQueryFile(Message.Drop,
                      i,
                      @buffer,
                      sizeof(buffer));
        Form1.Memo1.Lines.Add(buffer);
      end;
    end;end.
    type
    TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    private
    procedure WMDROPFILES(var Message: TWMDROPFILES);
    message WM_DROPFILES;
    { Private declarations }
    public
    { Public declarations }
    end;var
    Form1: TForm1;implementation{$R *.DFM}uses ShellApi;procedure TForm1.FormCreate(Sender: TObject);
    begin
    {Let Windows know we accept dropped files}
    DragAcceptFiles(Form1.Handle, True);
    end;procedure TForm1.WMDROPFILES(var Message: TWMDROPFILES);
    var
    NumFiles : longint;
    i : longint;
    buffer : array[0..255] of char;
    begin
    {How many files are being dropped}
    NumFiles := DragQueryFile(Message.Drop,
    $FFFFFFFF,//
    nil,
    0);
    {Accept the dropped files}
    for i := 0 to (NumFiles - 1) do begin
    DragQueryFile(Message.Drop,
    i,
    @buffer,
    sizeof(buffer));
    Form1.Memo1.Lines.Add(buffer);
    end;
    end;end.BIG5TOGB
    interface
     function GBtoBIG5(value: string): string;
     function BIG5toGB(value: string): string;implementationvar
      BIG5Order: array[0..14757] of Word;
      GBOrder  : array[0..8177] of Word;function GBOffset(value: string): integer;
    begin
      if length(value) >= 2 then
        Result := (Ord(value[1]) - 161) * 94 + (Ord(value[2]) - 161)
      else
        Result := -1;
    end;function BIG5Offset(value: string): integer;
    begin
      Result := -1;
      if length(value) >= 2 then
      begin
        if (Ord(value[2]) >= 64) and (Ord(value[2]) <= 126) then
          Result := (Ord(value[1]) - 161) * 157 + (Ord(value[2]) - 64);
        if (Ord(value[2]) >= 161) and (Ord(value[2]) <= 254) then
          Result := (Ord(value[1]) - 161) * 157 + 63 + (Ord(value[2]) - 161);
      end
    end;function WordToString(value: Word): string;
    begin
      Result := Chr(Hi(value)) + Chr(Lo(Value));
    end;function isBIG5(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
       if (value[1] < #161) then
         Result := false
       else
         if ((value[2] >= #64) and (value[2] <= #126)) or ((value[2] >= #161) and (value[2] <= #254)) then
           Result := true
         else
           Result := false
      end
      else
        Result := false
    end;function isGB(value: string): Boolean;
    begin
      if (length(value)>=2) then
      begin
        if (value[1] <= #161) and (value[1] >= #247) then
          Result := false
        else
          if (value[2] <= #161) and (value[2] >= #254) then
            Result := false
          else
            Result := true
      end
      else
        Result := true;
    end;
      

  4.   

    Button的DragMode为dmAutomatic
    在memo的DragOver, DragDrop中写:procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      if Source is TButton then
        accept:=True;
    end;procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
    begin
      if Source is TButton then
      begin
        TButton(Source).Left:=x+Tmemo(Sender).Left;
        TButton(Source).Top:=y+Tmemo(Sender).Top;
        TButton(Source).BringToFront;
      end;
    end;