Delphi编程俱乐部

Author: Date: 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;