自己的组件中使用了ADODataSet,并声明了属性CommandText,CommandType,在属性观察器中怎么使CommandText能象ADOData

  • 主题发起人 主题发起人 YNTW
  • 开始时间 开始时间
Y

YNTW

Unregistered / Unconfirmed
GUEST, unregistred user!
自己的组件中使用了ADODataSet,并声明了属性CommandText,CommandType,在属性观察器中怎么使CommandText能象ADODataSet的那样,根据CommandType出现不同的设置方式?(100分)<br />安装后在属性观察器中选择不同的CommandType时,CommandText不会出现根据CommandType出现类似ADODataSet的组合框及文本编辑框等,请高手指点。
unit MyComponent;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Db, ADODB;

type
TMyComponent = class(TComponent)
private
FCommand: TADOCommand;
FDataSet: TADODataSet;
function GetCommandText: WideString;
function GetCommandTimeout: Integer;
function GetCommandType: TCommandType;
procedure SetCommandText(const Value: WideString);
procedure SetCommandTimeout(const Value: Integer);
procedure SetCommandType(const Value: TCommandType);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property CommandText: WideString read GetCommandText write SetCommandText;
property CommandTimeout: Integer read GetCommandTimeout write
SetCommandTimeout default 30;
property CommandType: TCommandType read GetCommandType write SetCommandType
default cmdText;
end;

procedure Register;

implementation

uses
DBConsts, ADOConst;

procedure Register;
begin
RegisterComponents('MyLab', [TMyComponent]);
end;

{ TMyComponent }

constructor TMyComponent.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCommand := TADOCommand.Create(Self);
FDataSet := TADODataSet.Create(Self);
end;

destructor TMyComponent.Destroy;
begin
Destroying;
FDataSet.Close;
FreeAndNil(FCommand);
FreeAndNil(FDataSet);
inherited Destroy;
end;

function TMyComponent.GetCommandText: WideString;
begin
Result := FDataSet.CommandText;
end;

function TMyComponent.GetCommandTimeout: Integer;
begin
if FCommand.CommandTimeout &gt; FDataSet.CommandTimeout then
Result := FCommand.CommandTimeout
else
Result := FDataSet.CommandTimeout;
end;

function TMyComponent.GetCommandType: TCommandType;
begin
Result := FDataSet.CommandType;
end;

procedure TMyComponent.SetCommandText(const Value: WideString);
begin
FDataSet.CommandText := Value;
end;

procedure TMyComponent.SetCommandTimeout(const Value: Integer);
begin
FCommand.CommandTimeout := Value;
FDataSet.CommandTimeout := Value;
end;

procedure TMyComponent.SetCommandType(const Value: TCommandType);
begin
FDataSet.CommandType := Value;
end;

end.
 
偶引用了ADOReg.pas、DBReg.pas和DsgnIntf.pas单元后,能出现那种效果了,新的问题是:
一点按钮就出现“Access violation at address 400215DE in module 'VCL50.BPL'.Read of address FFFFFFFF.”的错误了
 
这种问题虽然简单,但不是三言两语能说清楚的,建议你还是找本Delphi书看看吧
看看属性编辑器是怎么做的就知道了。
看完之后你就会明白为什么我会说是简单问题了。
 
看了手中的几本书相关内容,觉得介绍得有些简单,请xianjun兄推荐点这方面的网上资料吧
 
这个adodb.pas里的,请参考,你看一下就明白了:
property CommandType: TCommandType read GetCommandType
write SetCommandType default cmdText;

procedure TCustomADODataSet.SetCommandType(const Value: TCommandType);
begin
if CommandType &lt;&gt; Value then
begin
CheckInactive;
FRSCommandType := Value;
if not (Value in RSOnlyCommandTypes) then
Command.CommandType := Value else
Command.CommandType := cmdUnknown;
PropertyChanged; //这个就是你想要的
end;
end;
 
结束了,还是自己看书吧[:D]
 
后退
顶部