急求高手解决!!!!!!非常感谢!!!
数据库里有10条记录。值为1,2,3,4,5,6,7,8,9,10
我想要在delphi的panel里根据这10条记录的顺序生成10个同等大小的memo(每行四个memo,即这10个memo,分成三行,最后一行为2个memo),并且可以在panel内随意拖动这10个memo的顺序。
例如:当我把第4个memo拖到第2的位置时,发生的变化为:原本的第1个memo不动,第2memo就变成了第3个memo,第3个memo就变成了第4个memo,第4个memo就变成了第2个memo,第5-10个memo不动

解决方案 »

  1.   

    思路
    1.根據數據庫記錄順序動態創建memo,並生成想要的行列memo樣式;
    2.使用雙緩存才能拖動並移動互補
      

  2.   

    创建memo总会吧
    剩下的就是组件拖动,生成时给每个memo的tag附上序号,交换式,无非交换一下位置吗,tag改不改自己定
      

  3.   

    bdmh,能否写出代码?我对拖拽和交换位置不会做。。
      

  4.   

    移動時自己使用雙緩存技術研究一下
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Panel1: TPanel;
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var
      aMemo:TMemo;
      i,x,y:integer;
      begin
         x:=0;
         y:=0;
        for i:=1 to 10 do
          begin
            aMemo:=TMemo.Create(self);
            x:=x+100;
            with aMemo do
               begin
                  if i mod 4=1 then
                    begin
                      x:=0;
                      y:=y+90;
                    end;
                  Left:=x;
                  Top:=y;
                  Parent:=Form1;
                  Caption:='Memo '+IntToStr(i);
               end
          end;
      end;
    end.
      

  5.   

    汗,楼上的朋友,你这只是创建了10个memo,我主要要问的是的拖拽和位置替换的问题
      

  6.   

    窗体上放置两个memo,memo2.dragmode := dmAutomatic;unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Memo1: TMemo;
        Memo2: TMemo;
        procedure Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
          State: TDragState; var Accept: Boolean);
        procedure Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Memo1DragOver(Sender, Source: TObject; X, Y: Integer;
      State: TDragState; var Accept: Boolean);
    begin
      Accept := True;
    end;procedure TForm1.Memo1DragDrop(Sender, Source: TObject; X, Y: Integer);
    var
      l,t:Integer;
    begin
      l := TMemo(Source).Left;
      t := TMemo(Source).Top;
      TMemo(Source).Left := Memo1.Left;
      TMemo(Source).Top := Memo1.Top;
      Memo1.Left := l;
      Memo1.Top := t;
    end;end.
      

  7.   

    創建了之後再memo的DragDrop和DragOver事件中(即拖放過程中和拖放結束後事件中)寫代碼控制,必要時使用雙緩存,以防拖放假死
      

  8.   

    共享一個別人寫好的demo,LZ可以引用到自己的工程中,其中的組件替換成你的memo即可...
    type
      TPnlRec = record
        iH,iL : Integer;
        iChg : Integer;
        sName : string;
        pImg : TImage;//ExtCtrls
        pRect : TRect;//Types
      end;  TDragImage = record
        sName : string;
        sKeyStr : string;
        sPicPathName : string;
        index : Integer;
        iNodeId : Integer;
      end;
      PDragImage = ^TDragImage;
      
      TImageViewYM = class(TWinControl)
      private
        { Private declarations }
        //只有在類被定義的單元中的代碼可訪問
        ScrollBox1 : TScrollBox;//Forms
        FAutoScroll : Boolean;//是否顯示滾動條
        FMoveAction : Boolean;//排序移動效果
        FHCTS : Boolean;      //加速(繪製界面效果時)
        FColCount :Integer;   //6 列數
        FCRDistance :Integer; //2 圖標間距
        FCellWidth :Integer;  //60圖寬
        FCellHeight :Integer; //60圖高    FFontHeight : Integer;//文本區高度
        FDragModel : Integer;//拖動模式,0=界面移動,1=圖標拖動
        iDragFlag : Integer;    FItemCout : Integer;//單元數量
        FItemIndex : Integer;//點擊或選定的索引
        FItemCaption : string;//點擊或選定的單元文本
        FShowCaption : Boolean;//是否顯示文本    FTimer1 : TTimer;    FItemClick : TNotifyEvent;//傳遞事件的指針
        
        //設置函數
        procedure SetColCount(const Value:Integer);
        procedure SetMoveAction(const Value:Boolean);
        procedure SetHCTS(const Value:Boolean);    procedure SetCRDistance(const Value:Integer);
        procedure SetCellWidth(const Value:Integer);
        procedure SetCellHeight(const Value:Integer);
        procedure SetDragModel(const Value:Integer);    procedure drawImgView( img : TImage; iflag : Integer=0 );
        procedure drawImgRect( img : TImage; sPicFile : string='.\img\img01.bmp'; sCap : string='' );
        procedure pnlModMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure pnlModMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
        function reArray( Sender: TObject ) : Integer;
        procedure pnlModMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        function movePanelTo( pImage : TImage; ix,iy : Integer ) : Integer;
        function addFullImage( Sender: TObject ) : Integer;
        procedure loadBackPic();    procedure backMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);  protected
        { Protected declarations }
        //在類和其子孫被定義的單元中的代碼可訪問
        pnlRec : array of TPnlRec;
        iDx,iDy,iDown : Integer;
        MyList : TList;
        bMoving : Boolean;
        pMouseDownPoint : TPoint;
        iBigWH : Integer;//圖標擴大效果增量值    procedure FTimer1Timer(Sender: TObject);  public
        { Public declarations }//給應用程序調用用
        //所有代碼可訪問
        constructor Create(AOwner:TComponent);override;
        destructor Destroy;override;    procedure ClearComponents();
        procedure BuildComponents();
        function AddItem( sName : string=''; sPic : string='' ) : Integer;
        function DeleteItem( index : Integer ) : Boolean;
        procedure ClearItem();