当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

 ·如何在c/c++中访问一个dbf文件    »显示摘要«
    摘要: 我用c/c++的sdk访问一个dbf文件,要通过odbc吗?如果要,是否还要设数据源?但如果要的话,难道要为每一个dbf都设一个数据原? 具体怎么做那?还望大家指点指点。 ......
 ·为什么老是找不到类    »显示摘要«
    摘要: 我用的从sohu下载的jb4,可是当改变布局管理器类型时,比如改为jb带的xylayout,老是说找不到类?为什么?我已经设了classpath了,将jbuilder4\lib设了进去。 ......


文件的拖放问题

各位老大怎么样实现从filelistbox单击选中莫个文件拖放到DirectoryOutline1的莫个文件里,各位老大给点代码救救我啊!!  
  小弟先行谢过了啊!!

NO.1   作者: cg1120

用以下方法实现:  
    var   CurentDirList:   Array[0...25]   of   string[70];    
   
    在DirectoryOutline的OnChange事件中:  
   
  procedure   TFMForm.DirectoryOutlineChange(Sender:   TObject);    
   
  begin    
   
  CreateCaption;    
   
  FileList.clear;    
   
  FileList.Directory   :=   DirectoryOutline.Directory;    
   
  FileList.Update;    
   
  CurrentDirList[DriveTabSet.TabIndex]   :=   DirectoryOutline.Directory;    
   
  FileManager.DirectoryPanel.Caption   :=   DirectoryOutline.Directory;    
   
  end;     
   
   
    由于DriveTabSet在响应OnDragDrop事件前先响应OnClick事件,并由该事件激  
  发DirectoryOutline的Onchange事件,因而可保证在任何时候OnDragDrop事件中用  
  到的CurrentDirList数组项不为空字符串。  
   
    2.如何保证移动、拷贝与子窗口的无关性?  
   
    在这里一个关键问题是我们判断源控件时是用is操作符进行类型检查:    
   
    If   Source   is   TFileList   then   …  
   
    如果我们用下面的语句:  
   
      
   
    If   Source   =   FileList   then    
   
    …  
   
    则移动、拷贝操作将限制在本子窗口范围内。  
   
    当解决了上述问我们的工作就只是遵循拖放的一般开发步骤,按步就班来完成了。  
   
    1.FileList开始拖动操作  
   
  procedure   TFMForm.FileListMouseDown(Sender:   TObject;   Button:   TMouseButton;    
   
  Shift:   TShiftState;   X,   Y:   Integer);    
   
  begin    
   
  if   Button   =   mbLeft   then    
   
  with   Sender   as   TFileListBox   do    
   
  begin    
   
  if   ItemAtPos(Point(X,   Y),   True)   >=   0   then    
   
  BeginDrag(False);    
   
  end;    
   
  end;    
   
    ItemAtPos用来检查当前是否有文件存在。而BeginDrag方法传递参数False,允许FileList单独处理鼠标事件而并不开始拖动。事实上这种情况是大量存在的。  
   
      
   
    2.DirectoryOutline、DriveTabSet决定是否能接受拖动的就地放下。  
   
   
  procedure   TFMForm.DirectoryOutlineDragOver(Sender,   Source:   TObject;   X,    
   
  Y:   Integer;   State:   TDragState;   var   Accept:   Boolean);    
   
  begin    
   
  if   Source   is   TFileListBox   then    
   
  Accept   :=   True;    
   
  end;    
   
   
  procedure   TFMForm.DriveTabSetDragOver(Sender,   Source:   TObject;   X,    
   
  Y:   Integer;   State:   TDragState;   var   Accept:   Boolean);    
   
  var    
   
  PropPos:   Integer;    
   
  begin    
   
  if   Source   is   TFileListBox   then    
   
  with   DriveTabSet   do    
   
  begin    
   
  PropPos   :=   ItemAtPos(Point(X,Y));    
   
  Accept   :=   (PropPos   >   -1)   and   (PropPos   <   Tabs.Count);    
   
  end;    
   
  end;    
   
   
    DirectoryOutline是无条件的接受,而DriveTabSet需检查是否是合法的标签。  
   
      
   
    3.拖动放下的响应  
   
    DirectoryOutline的拖动放下用于实现文件移动功能。程序中调用ConfirmChange   事件  
  处理过程,目标路径由DirctoryOutline.Items[GetItem(X,Y)].FullPath来得到。  
   
   
  procedure   TFMForm.DirectoryOutlineDragDrop(Sender,   Source:   TObject;   X,    
   
  Y:   Integer);    
   
  begin    
   
  if   Source   is   TFileListBox   then    
   
  with   DirectoryOutline   do    
   
  begin    
   
  ConfirmChange(Move,FileList.FileName,   Items[GetItem(X,   Y)].FullPath);    
   
  end;    
   
  end;    
   
    DriveTabSet的拖动放下用于实现文件拷贝功能。程序中把当前位置转化为相应的驱  
  动器号,目标路径由CurrentDirList[DriveTabSet.TabIndex]获得。  
   
  procedure   TFMForm.DriveTabSetDragDrop(Sender,   Source:   TObject;   X,Y:   Integer);    
   
  var    
   
  APoint:   TPoint;    
   
  begin    
   
  APoint.X   :=   X;   APoint.Y   :=   Y;    
   
  DriveTabSet.TabIndex   :=   DriveTabSet.ItemAtPos(APoint);    
   
  if   Source   is   TFileListBox   then    
   
  with   DriveTabSet   do    
   
  begin    
   
  if   CurrentDirList[TabIndex]   <>     then    
   
  ConfirmChange(Copy,TheFilename,CurrentDirList[TabIndex]);    
   
  end;    
   
  end;    
   
   
    4.FileList响应拖动结束,更新文件列表  
   
  procedure   TFMForm.FileListEndDrag(Sender,   Target:   TObject;   X,   Y:   Integer);    
   
  begin    
   
  if   Target   <>   nil   then   FileList.Update;    
   
  end;    
   
   
 

NO.2   作者: yang6130

procedure   TForm1.DirectoryOutline1Change(Sender:   TObject);  
  begin  
          FileListBox1.Directory   :=DirectoryOutLine1.Directory   ;  
          FileListBox1.Update;  
  end;  
   
  procedure   TForm1.FileListBox1MouseDown(Sender:   TObject;  
      Button:   TMouseButton;   Shift:   TShiftState;   X,   Y:   Integer);  
  begin  
      if   Button   =   mbLeft   then  
      with   Sender   as   TFileListBox   do  
      begin  
          if   ItemAtPos(Point(X,   Y),   True)     >=     0   then   //检查当前是否有文件存在  
                  BeginDrag(False);     //允许FileList单独处理鼠标事件而并不开始拖动  
      end;  
  end;  
   
  procedure   TForm1.DirectoryOutline1DragOver(Sender,   Source:   TObject;   X,  
      Y:   Integer;   State:   TDragState;   var   Accept:   Boolean);  
  begin  
            if   Source   is   TFileListBox   then  
          Accept   :=   True;  
  end;  
   
  procedure   TForm1.FileListBox1EndDrag(Sender,   Target:   TObject;   X,  
      Y:   Integer);  
  begin  
      if   Target   <>   nil   then   FileListbox1.Update;  
  end;  
   
  procedure   TForm1.DirectoryOutline1DragDrop(Sender,   Source:   TObject;   X,  
      Y:   Integer);  
  var  
          sSource,sDest,sFileName,sTemp:String;  
  begin  
          sSource:=;  
          sDest:=;  
          if   DirectoryOutline1.GetItem(x,y)>0   then     //鼠标放下处有目录存在  
          begin  
                  sSource:=FileListbox1.fileName;//取源文件名(含路径)  
                  sFileName:=extractfilename(sSource);//不含路径  
                  sTemp:=   DirectoryOutline1.Items[DirectoryOutline1.GetItem(x,y)].FullPath+\+sFileName;  
                  //也许是Delphi的BUG吧(或者是C语言的目录习惯),sTemp居然等于c:\\chenhu2,所以要转换为   c:\chenhu2  
                  sDest:=copy(sTemp,1,2)+Copy(sTemp,4,Length(sTemp)-3);  
  //                 edit1.Text:=sSource;  
  //                 Edit2.Text:=sDest;  
                  if       MessageDlg(移动文件,从+sSource+   到+sDest   ,mtConfirmation,[mbYes,mbNo],0)=mrYes   then  
                  begin  
                          if   MoveFile(PChar(sSource),PChar(sDest))   then         //uses   Shellapi  
                                  Showmessage(移动文件成功)  
                          else  
                                  Showmessage(移动文件失败);  
                  end;  
   
          end;  
  end;  
 


 ·两者的区别是什么    »显示摘要«
    摘要: document.location.href 和 window.location.href有什么区别? ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE