小编tik*_*kit的帖子

无法理解Delphi XE6保护类型

我创建了两个单元并将第一个类放入其中一个:

  unit UBaseClass;

  interface

  type
    TBaseOuterClass = class
    protected type

      TBaseInnerClass = class
      public
      end;

    protected
      function GetInnerInstance: TBaseOuterClass.TBaseInnerClass; virtual;
    end;

  implementation

  { TBaseOuterClass }

  function TBaseOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;
  begin
  // doesn't matter
  end;

  end.
Run Code Online (Sandbox Code Playgroud)

我将派生类放入第二个单元:

unit UDerClass;

interface

uses
  UBaseClass;

type
  TDerOuterClass = class(TBaseOuterClass)
  protected type

    TDerInnerClass = class(TBaseInnerClass)

    end;

  protected
    function GetInnerInstance: TBaseOuterClass.TBaseInnerClass; override;
  end;

implementation

{ TDerOuterClass }

function TDerOuterClass.GetInnerInstance: TBaseOuterClass.TBaseInnerClass;
begin

end;

end.
Run Code Online (Sandbox Code Playgroud)

当我正在尝试编译时,我得到了

[dcc32错误] UDerClass.pas(22):E2362无法访问受保护的符号TBaseOuterClass.TBaseInnerClass

在行函数TDerOuterClass.GetInnerInstance:TBaseOuterClass.TBaseInnerClass;

我无法理解为什么TBaseOuterClass.TBaseInnerClass(作为内部受保护类)无法从TDerOuterClass(为TBaseOuterClass派生)访问.在这种情况下,实际上受保护类型是什么?

我在嵌套类型声明主题中没有找到任何解释.那么这种行为有什么理由吗?

它也与简单的受保护类型相关

protected type    
  TSimpleType = Integer; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe6

7
推荐指数
1
解决办法
277
查看次数

TADOStoredProc返回记录集或输出参数值(不是两者)

我的存储过程采用一个输出参数并返回记录集.

CREATE PROCEDURE MyProc
    @EntityCode BIGINT, @ResValue INT OUTPUT
AS
BEGIN
  SELECT .... WHERE Code=@EntityCode
  SET @ResValue = ...
END
Run Code Online (Sandbox Code Playgroud)

我需要同时接收输出参数和记录集的值.所以我这样做:

function GetData(const EntityCode: Int64): Integer;
var
  Proc: TADOStoredProc;
  PEntityCode: ADODB.TParameter;
  PResValue: ADODB.TParameter;
begin
  Proc := TADOStoredProc.Create(nil);
  try
    Proc.Connection := ADOConnection1;
    Proc.CursorLocation := clUseServer;
    Proc.ProcedureName := 'MyProc';

    PEntityCode := Proc.Parameters.AddParameter;
    PEntityCode.Name := '@EntityCode';
    PEntityCode.DataType := ftLargeint;
    PEntityCode.Value := EntityCode;

    PResValue := Proc.Parameters.AddParameter;
    PResValue.Name := '@ResValue';
    PResValue.DataType := ftInteger;
    PResValue.Direction := pdOutput;

    //Proc.Prepared := True;
    Proc.Open;
    Result := PResValue.Value;
    while not …
Run Code Online (Sandbox Code Playgroud)

sql-server delphi delphi-7 sql-server-2008

4
推荐指数
1
解决办法
2104
查看次数

MessageBoxEx停止更新操作

我使用Delphi 7,我的项目有几个非模态可见窗体.问题是如果在其中一个中调用了MessageBoxEx,则在MessageBoxEx的表单关闭之前,应用程序的所有操作都不会更新.在我的项目中,它可以打破应用程序的业务逻辑.

永远不会调用TApplication.HandleMessage方法,同时显示MessageBoxEx的窗口,因此它不会调用DoActionIdle,并且不会更新Actions.

我认为我需要的是在空闲时捕获应用程序的状态并更新所有操作的状态.

首先,我实施了TApplication.OnIdle处理程序:

procedure TKernel.OnIdle(Sender: TObject; var Done: Boolean);
begin
  {It’s only to switch off the standard updating from TApplication.Idle. It's to make the CPU usage lower while MessageBoxEx's window isn't shown }
 Done := False;
end;

implementation

var
  MsgHook: HHOOK;

{Here is a hook}
function GetMsgHook(nCode: Integer; wParam: Longint; var Msg: TMsg): Longint; stdcall;
var
  m: TMsg;
begin
  Result := CallNextHookEx(MsgHook, nCode, wParam, Longint(@Msg));
  if (nCode >= 0) and (_instance <> nil) then
  begin
    {If there aren’t …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-7

3
推荐指数
1
解决办法
552
查看次数