小编Sen*_*ent的帖子

Delphi - 为什么TObject.InitInstance是公开的?

我对Delphi有些新意,这个问题只是让我很好奇.(我也只是偶然尝试使用它才发现我不应该这样做.)

如果您查看文档,TObject.InitInstance它会告诉您不要使用它,除非您重写NewInstance.该方法也是公开的.如果用户永远不应该打电话给它,为什么不让它受到保护?

delphi

10
推荐指数
1
解决办法
998
查看次数

将帮助文件链接到Delphi XE2应用程序 - 除主表单外,一切正常

我正在努力用我们的软件设置帮助文件.我为许多特定的表单/框架/控件添加了HelpContext数字,它们都可以正常工作.问题是主要表格根本没有提供任何帮助.对于所有这一切,我只使用F1尝试触发帮助.

我不是Delphi或帮助文件的专家,但我会发布我所做的和我看过的地方.

编辑:感谢一些帮助,我现在看到问题是由于主窗体是MDI父级.这仍然没有解决问题..它几乎对我来说似乎是一个错误,但我想这可能是出于某种原因故意.EndEdit中

我包括这个单元:HtmlHelpViewer用于查看器.在主窗体Create构造函数中,我添加了Application.Helpfile:='asdf.chm'.对于所有其他形式,我刚刚添加了上下文数字,它立即可用.我在主表单上尝试过,没有任何反应.所以我尝试添加一个Application.OnHelp事件但是这不会在主窗体上调用(并且它适用于所有其他帮助工作的窗体).

我能想到的最后一招是深入了解代码,看看发生了什么.我在Vcl.Forms中将TCustomForm.WMHelp作为拆分发生的地方.所述函数有这个循环:

if iContextType = HELPINFO_WINDOW then
begin
  Control := FindControl(hItemHandle);
  while (Control <> nil) and ( not ControlHasHelp(Control)) do
    Control := Control.Parent;
  if Control = nil then Exit;
  GetHelpInfo(Control, HType, ContextID, Keyword);
  Pt := Control.ClientToScreen(Point(0, 0));
end
Run Code Online (Sandbox Code Playgroud)

当主窗体调用时,帮助控件将为零,然后它将退出.其他任何事情都会好起来的.

我显然不知道为什么会这样.答案可能是非常基本的.任何想法,将不胜感激!

delphi chm mdi

6
推荐指数
1
解决办法
489
查看次数

热键转到光标所在的功能 - Delphi

要进入一个函数/程序,我使用Control + Click,Delphi将带我到那里(在美好的一天).

没有使用鼠标有没有快速的方法吗?

ide delphi hotkeys

6
推荐指数
1
解决办法
1878
查看次数

Delphi IDE-启用突出显示所选变量(如Visual Studio)

在Visual Studio中,当我突出显示一个函数或变量时,该函数的所有其他实例也会突出显示。我发现这非常有用。有人知道Delphi是否可以这样做吗?在Delphi中使用搜索时,它会突出显示所有找到的实例,因此有时我会快速复制和搜索,但这比单击文本要慢得多。

Visual Studio突出显示:

在此处输入图片说明

delphi syntax-highlighting visual-studio

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

我可以根据它包含的文本制作 TMemo 大小吗?- 火猴

我发现之前已经为 VCL 提出过这个问题,但我没有运气得到该问题的答案以在 Firemonkey 上工作TMemo

我注意到,memo.Lines.Count似乎总是根据我添加的行数来匹配行数,而不是按照它们的格式(备忘录确实打开了自动换行)。在不知道这个数字的情况下,我不知道如何开始弄清楚这一点。

有任何想法吗?

编辑:备忘录的宽度取决于设备的方向,显然如果宽度改变,显示的行数可能会改变。另外,我不想改变备忘录的字体。

delphi firemonkey

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

关闭CnPack Ctrl + U功能

我最近开始使用CnPack,因为我喜欢它如何显示嵌套代码(以及颜色!).但是,当我发现它们时,我发现自己关闭了大部分其他功能.

我似乎无法关闭的一个功能是Ctrl+ U来查看单位列表.在CnPack菜单>>项目增强>>列表单位下.这可能对某些人有用,但我更喜欢MMX Ctrl + U功能,因为它可以添加单位,如果你需要它.

我看了下设置(在多个地方)并没有看到它.谁知道怎么关掉它?

ide delphi

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

在运行时将对象转换为其父对象

我通过了TObject.我知道这个对象来自TBaseClass.我想要做的是显示每个班级的所有已发布属性,直到TBaseClass.可能有更好的方法来做到这一点,但我正在尝试的是:

lObj := aObject;
while lObj.ClassType <> TBaseClass do
begin
  lRttiType := lRttiContext.GetType(aObject.ClassType);
  lProps := lRttiType.GetDeclaredProperties;

  lStartIdx := Length(lAllProps);
  SetLength(lAllProps, Length(lAllProps) + Length(lProps));

  for I := Low(lProps) to High(lProps) do
    lAllProps[lStartIdx + I] := lProps[I];

  lObj := lObj as lObj.ClassParent;
  // lObj := lObj.ClassParent.InitInstance(lObj); // *see below
end;
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于lObj.ClassType之后不会改变lObj as lObj.ClassParent.有人可以解释为什么这不起作用并提供一些有用的东西吗?

*这似乎有效,因为它将lObj.ClassType作为父类,但它会导致问题,我后来阅读文档,发现它甚至不应该首先被调用.

delphi casting rtti

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