?? unit1.pas
字號(hào):
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Grids, Wwdbigrd, Wwdbgrid, DBCtrls,
SUIForm, SUIPageControl, SUITabControl, Buttons, SUIImagePanel, ToolWin,
DB, ADODB, wwriched,ActiveX, ImgList;
type
TDragAndDropOLE=Class(TObject,IUnknown,IDropTarget)
private
CanDrop:HResult;
fe:TFormatEtc;//數(shù)據(jù)的格式,在實(shí)現(xiàn)部分給出詳細(xì)說(shuō)明
FRefCount:integer;//引用計(jì)數(shù)
protected
{ Iunkown }
function _AddRef:integer;stdcall;
function _Release:integer;stdcall;
function QueryInterface(const IID:TGUID;out Obj):HResult;stdcall;
{ IdropTarget }
function DragEnter(const dataObj: IDataObject; grfKeyState: Longint;
pt: TPoint; var dwEffect: Longint): HResult;stdcall;
function DragOver(grfKeyState: Longint; pt: TPoint;var dwEffect: Longint):HResult;stdcall;
function DragLeave: HResult;stdcall;
function Drop(const dataObj: IDataObject; grfKeyState: Longint; pt: TPoint;
var dwEffect: Longint): HResult; stdcall;
public
constructor Create;
destructor Destroy;override;
end;
type
TForm1 = class(TForm)
suiForm1: TsuiForm;
suiPageControl1: TsuiPageControl;
suiTabSheet1: TsuiTabSheet;
suiTabSheet2: TsuiTabSheet;
suiPanel1: TsuiPanel;
lbl1: TLabel;
edt1: TEdit;
btn1: TSpeedButton;
suiPanel2: TsuiPanel;
wwDBGrid1: TwwDBGrid;
spl1: TSplitter;
dbmmo1: TDBMemo;
lbl2: TLabel;
suiPanel3: TsuiPanel;
tlb1: TToolBar;
btn2: TToolButton;
btn3: TToolButton;
btn4: TToolButton;
btn5: TToolButton;
btn6: TToolButton;
btn7: TToolButton;
btn8: TToolButton;
dbmmo2: TDBMemo;
spl2: TSplitter;
dbmmo3: TDBMemo;
lbl3: TLabel;
ds1: TADODataSet;
ds2: TDataSource;
ImageList1: TImageList;
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure btn4Click(Sender: TObject);
procedure btn5Click(Sender: TObject);
procedure btn6Click(Sender: TObject);
procedure btn7Click(Sender: TObject);
procedure btn8Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
DragAndDropOLE:TDragAndDropOLE;
public
constructor Create(AOwner: TComponent);override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TDragAndDropOLE.Create;
begin
FRefCount:=0;
RegisterDragDrop(Form1.dbmmo2.Handle,self);//上文提到的函數(shù)
RegisterDragDrop(Form1.dbmmo3.Handle,self);//上文提到的函數(shù)
end;
destructor TDragAndDropOLE.Destroy;
begin
RevokeDragDrop(Form1.dbmmo2.Handle);
RevokeDragDrop(Form1.dbmmo3.Handle);
inherited;
end;
//接下來(lái)實(shí)現(xiàn)Iunknown,不再做詳細(xì)說(shuō)明:
function TDragAndDropOLE._AddRef: integer;
begin
result:=InterLockedDecrement(FRefCount);
if Result=0 then Destroy;
end;
function TDragAndDropOLE._Release: integer;
begin
result:=InterLockedIncrement(FRefCount);
end;
function TDragAndDropOLE.QueryInterface(const IID: TGUID;
out Obj): HResult;
begin
if GetInterface(IID,Obj) then
result:=S_OK
else result:=E_NOINTERFACE;
end;
//最重要的IDropTarget實(shí)現(xiàn):
function TDragAndDropOLE.DragEnter(const dataObj: IDataObject;
grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
begin
result:=E_FAIL;
CanDrop:=E_Fail;
if assigned(dataObj) then
begin
with fe do
begin
cfFormat:=CF_TEXT;
ptd:=nil;
dwAspect:=DVASPECT_CONTENT;
lindex:=-1;
tymed:=TYMED_HGLOBAL;
end;
//大家從上面看到的fe是一種我們處理內(nèi)存數(shù)據(jù)時(shí)常用的轉(zhuǎn)換格式
//這里它表示將數(shù)據(jù)格式作為文字(cfFormat),并將其存入一塊
//全局的內(nèi)存區(qū)域(tymed:=TYMED_HGLOBAL),更多的格式請(qǐng)?jiān)趙in32
//幫助中搜索TFormatEtc
CanDrop:=dataObj.QueryGetData(fe);//按照f(shuō)e指定的格式檢查數(shù)據(jù)
result:=CanDrop;
if not Failed(result) then
dwEffect:=DROPEFFECT_COPY
else dwEffect:=DROPEFFECT_NONE;
//注意這里我們?cè)O(shè)置了dwEffect,更多的取值請(qǐng)查看win32幫助
end;
end;
function TDragAndDropOLE.DragLeave: HResult;
begin
result:=S_OK;
end;
function TDragAndDropOLE.DragOver(grfKeyState: Integer; pt: TPoint;
var dwEffect: Integer): HResult;
begin
result:=S_OK;
//我們不需要在這里做其余的操作,當(dāng)然你可以根據(jù)自己的需要完成自己的方法
end;
function TDragAndDropOLE.Drop(const dataObj: IDataObject;
grfKeyState: Integer; pt: TPoint; var dwEffect: Integer): HResult;
var
medium:stgMedium;
hData:HGLOBAL;
handle:THandle;
begin
result:=E_Fail;
if not Failed(CanDrop) then
begin
result:=dataObj.GetData(fe,medium);
//按照f(shuō)e的格式將數(shù)據(jù)存入內(nèi)存的一塊全局區(qū)域,注意medium
hData:=HGLOBAL(GlobalLock(medium.hGlobal));
//GlobalLock鎖定這塊區(qū)域,并返回指向它的指針
handle:=WindowFromPoint(pt);
if Form1.dbmmo2.Handle=handle then
Form1.dbmmo2.Text:=pchar(hData)
else
Form1.dbmmo3.Text:=pchar(hData);
GlobalUnlock(hData);//接觸鎖定
GlobalFree(hData);//釋放
end;
end;
constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOWner);
OleInitialize(nil);
DragAndDropOLE:=TDragAndDropOLE.Create;
// TDragAndDropOLE便是我們要實(shí)現(xiàn)IDropTarget接口的類
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DragAndDropOLE.Free;
OleUninitialize;
inherited;
end;
procedure TForm1.btn2Click(Sender: TObject);
begin
ds1.Append;
end;
procedure TForm1.btn3Click(Sender: TObject);
begin
ds1.Post;
end;
procedure TForm1.btn4Click(Sender: TObject);
begin
ds1.Delete;
end;
procedure TForm1.btn5Click(Sender: TObject);
begin
ds1.First;
end;
procedure TForm1.btn6Click(Sender: TObject);
begin
ds1.Prior;
end;
procedure TForm1.btn7Click(Sender: TObject);
begin
ds1.Next;
end;
procedure TForm1.btn8Click(Sender: TObject);
begin
ds1.Last;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
ds1.Close;
ds1.CommandText:='select * from 題目 where 題目 like ''%'+edt1.Text+'%''';
ds1.Open;
end;
end.
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -