小编ave*_*ore的帖子

如何指示鼠标滚轮输入控制光标而不是聚焦?

我使用了许多滚动控件:TTreeViews,TListViews,DevExpress cxGrids和cxTreeLists等.当旋转鼠标滚轮时,无论鼠标光标处于何种控制状态,焦点控件都会接收输入.

如何将鼠标滚轮输入指向鼠标光标所在的控制?Delphi IDE在这方面非常有效.

delphi mousewheel

38
推荐指数
3
解决办法
2万
查看次数

初始化字符串函数结果?

我刚刚调试了一个函数,它返回一个让我担心的字符串.我一直认为返回字符串的函数的隐式Result变量在函数调用开始时将为空,但以下(简化)代码产生了意外的结果:

function TMyObject.GenerateInfo: string;

        procedure AppendInfo(const AppendStr: string);
        begin
          if(Result > '') then
            Result := Result + #13;
          Result := Result + AppendStr;
        end;

begin
  if(ACondition) then
    AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)

多次调用此函数导致:

"Some Text"
Run Code Online (Sandbox Code Playgroud)

第一次,

"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)

第二次,

"Some Text"
"Some Text"
"Some Text"
Run Code Online (Sandbox Code Playgroud)

第三次等

要修复它,我必须初始化结果:

begin
  Result := '';
  if(ACondition) then
    AppendInfo('Some Text');
end;
Run Code Online (Sandbox Code Playgroud)

是否需要初始化字符串函数结果?为什么(技术上)?为什么编译器不会发出警告"W1035函数的返回值'xxx'可能是未定义的"字符串函数?我是否需要遍历所有代码以确保设置值,因为如果未明确设置结果,则期望函数中的空字符串不可靠?

我在一个新的测试应用程序中对此进行了测试,结果是一样的.

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  S: string;
begin
  for i := 1 to 5 do
    S := GenerateInfo;
  ShowMessage(S); // 5 …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-2007 compiler-warnings

29
推荐指数
2
解决办法
4564
查看次数

在SQL Server中更改身份种子(永久!)

有没有办法永久更改标识列的标识种子?使用DBCC CHECKIDENT似乎只是设置了last_value.如果表被截断,则重置所有值.

dbcc checkident ('__Test_SeedIdent', reseed, 1000)

select name, seed_value, increment_value, last_value
from sys.identity_columns
where [object_id] = OBJECT_ID('__Test_SeedIdent');
Run Code Online (Sandbox Code Playgroud)

回报

name      seed_value  increment_value  last_value
-------------------------------------------------
idIdent   1           1                1000
Run Code Online (Sandbox Code Playgroud)

我希望有一些语法

alter table dbo.__Test_SeedIdent alter column idIdent [int] identity(1000,1) NOT NULL
Run Code Online (Sandbox Code Playgroud)

会存在.

是否有必要创建一个新列,移动值,删除原始列并重命名新列?

sql-server seed identity-column

12
推荐指数
1
解决办法
2万
查看次数

如何在设计时调用组件的属性编辑器

我创建了一个从TCustomPanel派生的组件.在该面板上,我有一个派生自TOwnedCollection的类的已发布属性.一切运行良好,单击该属性的对象检查器中的省略号将打开默认的集合编辑器,我可以在其中管理列表中的TCollectionItems.

  TMyCustomPanel = class(TCustomPanel)
  private
  ...
  published
    property MyOwnedCollection: TMyOwnedCollection read GetMyOwnedCollection write SetMyOwnedCollection;
  end;
Run Code Online (Sandbox Code Playgroud)

我还希望能够在设计时双击面板并默认打开集合编辑器.我开始创建一个派生自TDefaultEditor的类并注册它.

  TMyCustomPanelEditor = class(TDefaultEditor)
  protected
    procedure EditProperty(const PropertyEditor: IProperty; var Continue: Boolean); override;
  end;

  RegisterComponentEditor(TMyCustomPanel, TMyCustomPanelEditor);
Run Code Online (Sandbox Code Playgroud)

这似乎是在正确的时间运行,但我仍然坚持如何在当时启动集合的属性编辑器.

procedure TMyCustomPanelEditor.EditProperty(const PropertyEditor: IProperty; var Continue: Boolean);
begin
  inherited;

  // Comes in here on double-click of the panel
  // How to launch collection editor here for property MyOwnedCollection?

  Continue := false;
end;
Run Code Online (Sandbox Code Playgroud)

任何解决方案或不同的方法将不胜感激.

delphi components property-editor townedcollection

7
推荐指数
2
解决办法
2401
查看次数

如何在不看到 emulator.exe 窗口的情况下启动 Android 虚拟设备

我想创建一个快捷方式来启动具有特定参数的特定 AVD。如果我使用start emulator.exe -avd myavdemulator.exe 命令窗口创建批处理文件并在设备启动后显示并保留。关闭 emulator.exe 窗口将关闭设备。

如何启动设备而不像 AVD Manager 或 Eclipse 那样看到此窗口?

command-line android-emulator

5
推荐指数
1
解决办法
3407
查看次数

如何删除具有未命名的默认值约束和未知索引的列

什么是确定列及其名称是否存在默认约束的方法,以及任何索引的名称,以便在删除列之前删除它们?

sql-server indexing constraints sql-drop

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

为什么在关闭时不执行包中任何单元定型部分的代码?

我有一个应用程序,它使用静态链接的运行时包以及使用它们的设计时包.由于某种原因,任何单元定型部分中的代码都没有在运行时运行(我无法分辨何时开始发生).

finalization
  ShowMessage('Goodbye');
end.
Run Code Online (Sandbox Code Playgroud)

关闭Delphi会显示消息,但不会在我的应用程序关闭时显示.如果我在ShowMessage上设置一个断点,它会在那里中断,但不执行该行,这更令人讨厌.如果最终化中有多行,则调试器在第一行停止,不执行它然后跳转到结尾.

procedure ProcOne;
begin
  SomeObject.Free; // Debugger does not enter or stop here
  SomeObject := nil;
end;

finalization
  ProcOne; // Debugger stops here, doesn't execute, jumps to "end."
  ProcTwo; // Every line has a blue dot
  ShowMessage('Bye');
end.
Run Code Online (Sandbox Code Playgroud)

ProcOne断点上的调用堆栈显示@ Halt0 => FinalizeUnits => MyPackage.MyUnit.Finalization.

如果我将该单元包含在不使用包的应用程序中,则一切都正常执行.

有谁知道可能导致这种情况的原因是什么?

编辑:

感谢Allen Bauer的评论指向了正确的方向,我已经设法解决了这个问题.如果使用运行时包构建应用程序,然后动态加载另一个也引用该包和单元的包,则似乎会出现问题.

我创建了一个演示问题的测试项目:TestFinalization

有谁知道这个和/或解决方法的原因?在您注意到外部资源未被清除之前,您通常可能不会注意到您的终结未运行.

delphi finalization package delphi-2007

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

调用exec后如何获取标识值(@Sql)

我试图找到由exec(@Sql)插入的插入记录的标识值,但似乎exec()在不同的范围内执行.

/*
create table [dbo].[__Test](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [description] [varchar](100) NULL
) ON [PRIMARY]
GO
*/

declare @Sql varchar(512)
set @Sql = 'insert into [dbo].[__Test] ([description]) values (''Some text'')'
exec (@Sql)

select
    @@IDENTITY as [@@IDENTITY],
    scope_identity() as [scope_identity],
    ident_current('__Test') as [ident_current]

/*  
if exists(select * from sys.objects where object_id = object_id('[dbo].[__Test]') and type='U')
    drop table [dbo].[__Test]
GO
*/
Run Code Online (Sandbox Code Playgroud)

收益:

@@IDENTITY  scope_identity  ident_current
----------  --------------  -------------
14          NULL            14
Run Code Online (Sandbox Code Playgroud)

如果__Test上有触发器,则返回:

@@IDENTITY  scope_identity  ident_current
----------  --------------  -------------
6           NULL            14 …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server identity

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

重新引入构造函数的可见性

我已经以基本形式重新引入了表单构造函数,但是如果我以子格形式覆盖原始构造函数,则重新引入的构造函数将不再可见.

type
  TfrmA = class(TForm)
  private
    FWndParent: HWnd;
  public
    constructor Create(AOwner: TComponent; const AWndParent: Hwnd); reintroduce; overload; virtual;
  end;

constructor TfrmA.Create(AOwner: TComponent; const AWndParent: Hwnd);
begin
  FWndParent := AWndParent;
  inherited Create(AOwner);
end;

type
  TfrmB = class(TfrmA)
  private
  public
  end;

type
  TfrmC = class(TfrmB)
  private
  public
    constructor Create(AOwner: TComponent); override;
  end;

constructor TfrmC.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
end;
Run Code Online (Sandbox Code Playgroud)

创建时:

  frmA := TfrmA.Create(nil, 0);
  frmB := TfrmB.Create(nil, 0);
  frmC := TfrmC.Create(nil, 0); // Compiler error
Run Code Online (Sandbox Code Playgroud)

我的解决方法是覆盖重新引入的构造函数或声明原始构造函数重载,但我想了解这种行为的原因.

type
  TfrmA = class(TForm)
  private
    FWndParent: …
Run Code Online (Sandbox Code Playgroud)

delphi constructor

1
推荐指数
2
解决办法
1083
查看次数