Delphi编程俱乐部 2000年 第21期   问:因为TDBGrid控件没有OnMouseDowns事件,如何在TDBGrid控件中实现拖放?   答:在本unit中,自定义TMyCustomDBGrid=class(TCustomDBGrid),再如下引用:TMyCustomDBGrid(DBGrid1).MouseDown(...)或(DBGrid1 as TMyCustomDBGrid).MouseDown(...)即可。   问:在Delphi设计中,如何在一个没有caption的form中用一个panel来拖动form?   答:只须在mousedown时向form发出move消息即可。如:   procedure TForm1.Panel1MouseDown(Sender: TObject; Button: TMouseButton;   Shift: TShiftState; X,Y: Integer);   begin   if Button <> mbRight then   begin   ReleaseCapture;   Form1.Perform(WM_SysCommand,Sf017,0);   end;   end;   这个方法可以支持拖动所有的twincontrol,所以也可以拖动button等,如:   Form1.Perform(WM_SysCommand,Sf017,0);   Form1是指所要拖动的对象,可以随意修改。所以也可以实现按在一个按钮上拖动一个窗体等效果了。   问:我如何使用文本型数据库,在database desktop的drive types中没有txt选项,如何给它设置别名?如何生成它的表格?   答:text用的是MS 的 ODBC Drive,你在控制面板里的ODBC数据源建立一个新的用户DSN,在BDE里建立一个新的Alias,指向刚刚的DSN。再到desktop里建立表格类型(Microsoft text driver)save as select alias其他ODBC数据源都是可以这样被Delphi访问的,对于text型,你可以自己试试看。   问:Delphi中如何把程序的运行结果重定向,如ping运行后的信息?   答:最简单的办法是:   WinExec(′COMMAND.COM /C ping 10.65.88.186 > result′,SW_HIDE);   //10.65.88.186 is a local IP address   如果不满意,用CreateProcess可以更精细地控制,如果还不满意,直接用控件Ping,ICS控件包中就有现成的。   问:我用DBGRID显示TABLE中的内容,现在我要从头到尾读一遍TABLE里的数据,用Table1.First,Next来做会使DBGRID里面的指针也跟着跑,怎么才能使这时候DBGRID里面的指针不动呢?   答:使用如下代码即可:   with DataSet do   try   DisableControls;   Do_something;   finally   EnableControls;   end;   问:我使用的数据库类型为Paradox 7,我想用TQuery控件把文件MyFile.txt存到数据库中,请问该怎么做?   答:你可以试试下面的代码:   procedure TForm1.loadfile1Click(Sender: TObject);   begin   if opendialog1.Execute then   dbmemo1.Lines.LoadFromFile(opendialog1.FileName);   end;   procedure TForm1.todatabase1Click(Sender: TObject);   begin   query2.Close;   query2.Params.CreateParam(ftmemo,′memodata′,ptinput);   query2.SQL.Text:=′insert into custoly(remarks) values(:memodata)′;   query2.ParamByName(′memodata′).AsMemo:=dbmemo1.Lines.Text;   query2.ExecSQL;   end;   问:如何取得系统当前日期和时间并将其放在数据库相应的字段中?   答:取得当前的时间:   table.FieldByName(′字段名′).asDateTime:=Time;   取得当前的日期:   table.FieldByName(′字段名′).asDateTime:=Date;   须要注意的是如果你不用asDatetime:=Time or Date or Now,而是用asString:=则需要用DateTimeToStr(Now),DateToStr(Now),TimeToStr(Time)。   问:如何取得一个窗体内所有构件的名称?   答:代码如下:   For i:=0 to form1.Componentcount-1 do   begin   memo1.lines.add(form1.components[i].classname);   memo2.lines.add(form1.components[i].name);   end;