我想在控件中接受一dataset对象,但我并不创建它,只是得到它的部分信息。
比如简化一下,我只需得到表的名称
我写了如下代码:
private
tablename:string;
published
 property MyDataSet:TDataSet write SetMyDataSet;
...implementation
procedure TMyGrid.SetMyDataSet(Value: TDataSet);
begin
 if value.Active then
    tablename := ...;//这句怎么写,如何得到表名称
end;另外即使我随便写:
procedure TMyGrid.SetMyDataSet(Value: TDataSet);
begin
    tablename := 'hello';
end;
这个控件在安装后,不能使用,报了很多错误,甚至delphi都无法关闭。请高手帮忙指点一下。
我是第一次写控件,有经验的朋友可以随便给点建议,分自然不在话下。

解决方案 »

  1.   

    tablename只有用table控件才能取出来
      

  2.   

    tablename只有用table控件才能取出来
      

  3.   

    那我可以得到它产生的SQL命令吗?
      

  4.   

    sz1008(dot) 
    你的方法不行
      

  5.   

    同意 linzhisong(無聊)
    只有TTable, TADOTable之类的组件才有TableName属性
      

  6.   

    同意linzhisong(無聊) 
    只有TTable、TADOTable之类的组件才有TableName属性
      

  7.   

    其他的只有自己取分析sql,或者commandtext...里面的语句
      

  8.   

    看了帮助,感觉dataset只是一个本地存储数据集的容器。只对应一些基本的插入,过滤,编辑操作,这样想来倒是有点合理。也不知我的想法对不对?
    先抛开这个问题不谈,假设我的是ADOTable,这个控件还是不正确啊!!!
    关键是如何写这个控件,希望大家不吝赐教!!!
      

  9.   

    if Value Is TADOTable then
       TADOTable(Value).TableName := ...;
    if Value Is TTable Then
      TTable(Value).TableName:='';
      

  10.   

    一点想法
    你为了得到一个表名,却来传整个table过来也太不合算了吧
      

  11.   

    自己取分析sql,或者commandtext...里面的语句
      

  12.   

    这个控件在安装后,不能使用,报了很多错误,甚至delphi都无法关闭。这个问题不是出在这部分代码里,你的代码组织应该比较乱,如果不多的话可以贴出来看看。
      

  13.   

    表的名称一般不能直接得到,比如说数据集的结果是一个组合的查询,这时数据并不只从一个表中取得,你的TableName自然没有意义。此外关于出错的问题,应该是在其它的位置上,检查一下你的内存分配和释放。
      

  14.   

    参考如下代码:unit SSEdit;//written by zjy6631interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls,  Dialogs,TypInfo,
       Db, StdCtrls, ComCtrls;type
      TMyEdit=Class(TEdit)
      private
        FTableName:String;
        FDataset:TDataset;
        procedure SetDataset(Value:TDataset);
      public
      published
        Property  Tablename:String  read FTableName write FTableName;
        property Dataset:TDataset read FDataset write setdataset;
      end;procedure Register;implementationprocedure TMyEdit.SetDataset(Value: TDataset);
    Var
      PropInfo:PPropInfo;
    begin
      if Value <>nil then
      begin
        PropInfo:=GetpropInfo(Value,'Tablename',[]);
        if PropInfo<>nil then
        begin
          FTableName:=GetPropValue(value,'TableName');
        end
        else
          FTableName:='';
        if  FDataset<>Value then
           FDataset:=Value;
      end
      else
        FDataset:=Nil;
    end;
    procedure Register;
    begin
      RegisterComponents('Win32', [TMyEdit]);
    end;end.
      

  15.   

    谢谢大家
    谢谢zjy6631(刘阿木)的代码,使我认识以前代码的不够正规。也许我说的不够明确,我的目的是传进来一个dataset,然后分析得到它的结构
    以xml的格式记录下它的内容(仅仅是涉及的表名称和字段名),因为我不需要其中的数据,所有觉得在控件中给它生成一个dataset是浪费资源的。
    我之前的代码是没有问题的,现在我感觉关键的问题是在这里:
     property Dataset:TDataset read FDataset write setdataset;
    这是个对象属性,那么是否一定要生成一个对应的对象呢?
    至于错误完全是RTL的错误,导致delphi都不能够关闭。
    我使用的是delphi6。
    再次感谢楼上的各位弟兄。
      

  16.   

    to:linzhisong(無聊) 
    能否提示一下如何分析dataset的commandtext我在原码中逛了一圈,毫无收获,但adodataset倒是可以的。
      

  17.   

    分析CommandText可能会很麻烦如果只想把数据结构倒入XML的话
    可以在传过去ADODataSet后设置Fitle使数据为空,再用TADOSet的SaveToFIle(FileName,pfXML)方法
      

  18.   

    to:sz1008(dot)
    非常感谢,哈哈,我原来是自己定义了一个格式,看来又要动大手术了。