我创建了两个单元并将第一个类放入其中一个:
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) 我的存储过程采用一个输出参数并返回记录集.
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) 我使用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)