请帮忙: OnDblClick 赋值(100分)

  • 主题发起人 主题发起人 lishding
  • 开始时间 开始时间
L

lishding

Unregistered / Unconfirmed
GUEST, unregistred user!
我想在运行时,动态创建一DBGrid组件显示数据供选择,写了以下函数,
但在为 DBGrid 的 OnDblClick 赋值出错!!!
代码如下:

function ShowGrid(sender: TObject):string;
var ListGrid:TDBGrid;
ListDataSet:TADOQuery;
ListDataSource:TDataSource ;

// 在所创建的ListGrid的 OnDblClick 事件中 释放所创建的组件
Procedure CloseDBGrod(Sernder:TObject);
begin
// ListGrid.OnDblClick((Sender as TWinControl));
ListGrid.Free;
ListDataSet.Close;
ListDataSet.Free;
ListDataSource.Free;
end;
begin

// 创建数据集
ListDataSet :=TADOQuery.Create( (Sender as TWinControl).Parent);
ListDataSet.Connection:=Form1.ADOConnection1; //**
ListDataSet.SQL.Clear;
ListDataSet.SQL.Append('select * from A02 '); //**
ListDataSet.Open;

// 创建数据源
ListDataSource:=TDataSource.Create((Sender as TWinControl).Parent);
ListDataSource.DataSet:=ListDataSet;

// 创建DBGrid
ListGrid:=TDBGrid.Create((Sender as TWinControl).Parent);
ListGrid.Visible:=false;
ListGrid.Options:=ListGrid.Options+[dgRowSelect];
ListGrid.ReadOnly:=true;
ListGrid.Font.Name:='宋体';
ListGrid.Font.Size:=10;
ListGrid.Color:=clInfoBk;
ListGrid.TitleFont:=ListGrid.Font;
ListGrid.DataSource:=ListDataSource;
ListGrid.Parent:=(Sender as TWinControl).Parent;
ListGrid.Left:=(Sender as TWinControl).left;
ListGrid.Top:=(Sender as TWinControl).top+(Sender as TWinControl).Height-1;
ListGrid.Width:=260;
ListGrid.Height:=180;
ListGrid.Columns.RestoreDefaults;

ListGrid.Visible:=true;
ListGrid.SetFocus;

ListGrid.OnDblClick:=CloseDBGrod;
{ 上面这行出错: Incompatible Types:'method pointer and regular procedure' }
 
你吧
Procedure CloseDBGrod(Sernder:TObject);
申明成一个类的published就可以了

其他的办法我也不知道

关注
 
因为ONDBLCLICK 是 PROCEDURE OF OBJECT类型的,而不是PROCEDURE,那么
你必须把Procedure CloseDBGrod(Sernder:TObject);定义为成员函数,不过你还要访问

其他的一些局部变量,最好是
把function ShowGrid(sender: TObject):string;
也作为成员函数,然后将
ListGrid:TDBGrid;
ListDataSet:TADOQuery;
ListDataSource:TDataSource ;
作为类成员而不是局部变量

函数和成员函数以及局部函数的调用方法是完全不同的
例如成员函数必须多进栈 SELF,而局部函数至少需要能访问堆里的变量
 
agree wenyue
OnDblClick is a property of prucedure(Sender:TObject) of TObject
~~~~~~~~~~
but ur CloseDBGrod is a prucedure(Sender:Tobject)
they dont match each other.
 
你必须为MyDblClick指定一个类,你看我的代码能通过.
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB,DBGrids, Grids;

type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DBGrid1: TDBGrid;
private
procedure TestGrid;
procedure MyDblClick(Sender: TObject);
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.MyDblClick(Sender: TObject);
~~~~~~~~
begin
showmessage('OK');
end;

procedure TForm1.TestGrid;
var ListGrid:TDBGrid;
begin
ListGrid:=TDBGrid.Create(Self);
ListGrid.OnDblClick:=MyDBlClick;
end;

end.
 
感谢各位援手,我明白问题所在了,但我想写一个控件,功能大至如下:

在一个 Edit或DBEdit 中键入字符串后回车,自动到指定的表,中按键入的字符串
进行糢糊查找,找到的数据(如果是多条)在Edit或DBEdit下面(或上面)自动弹出一
个DBGrid显示并供选择,如选择了则把指定字段的值填入相应的Edit或DBEdit所对应的
字段中.
请问该如何解决,有详细方案或大体框架更好,
 
可能是方法的类型不一样
 
有人帮忙吗?
 
procedure TForm1.MyDBGridDblClick(Sender: TObject);
begin
Caption:='Test';
end;


procedure TForm1.Button1Click(Sender: TObject);
var
DBGrid:TDBGrid;
begin
DBGrid:=TDBGrid.Create(Form1);
try
with DBGrid do
begin
OnDblClick:=MyDBGridDblClick;
Parent:=Form1;
Width:=200;
Height:=200;
Left:=10;
Top:=10;
end;
finally
// DBGrid.Free;
end;
end;
 
多人接受答案了。
 
后退
顶部