小编Dan*_*rić的帖子

已发布的界面属性错误和变通方法

我编写了一组通过已发布的接口属性相互链接的组件.它们已注册并安装在设计包中.

使用已发布的接口属性在Delphi中并不常见,因此,不出所料,似乎效果不佳.

当组件驻留在同一表单上时,它工作正常,但不同表单上的组件之间的接口属性链接会导致问题.

与指向另一个表单上的组件的对象链接不同,IDE似乎无法识别接口链接.我的意思最好用一个例子来描述,当你在IDE中打开2个表单,并在它们之间有组件之间的链接,然后尝试切换到表单视图时,文本(Alt + F12)将导致IDE正确地抱怨:

Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close.

但是如果属性是一个接口,那么这不会发生,而是发生的事情是链接被切断(当你使用Notification机制清除引用时这是最好的情况,否则你会留下无效的指针)

另一个问题,可能是同一个错误的结果是,当您在IDE中打开项目时,表单将重新打开的顺序是未定义的,因此IDE可以尝试打开包含具有到组件的接口链接的组件的表单另一种形式,但其他形式尚未重新创建.因此,这有效地导致AV或切断链接.

早在90年代,我使用时Datasets,Datasources我记得表格之间的链接消失的类似问题,所以这有点类似.

作为临时解决方法,我添加了重复的已发布属性,对于每个Interface属性,我添加了另一个声明为的属性TComponent.这使得Delphi意识到表单之间存在联系,但至少可以说这是一个丑陋的解决方法.

所以我想知道我能做些什么来解决这个问题?这是一个IDE错误,可能无法直接修复,但也许我可以覆盖某些内容或以其他方式挂接到流机制,以更有效地解决此错误.

我从未如此深入到流机制,但我怀疑Fixup机制应该处理这个问题.有一个,csFixups TComponentState所以我希望可以解决方法.

编辑:使用D2007.

更新:

上传到http://www.filedropper.com/fixupbugproject2的新更新的可重现示例

添加后property ComponentReference: TComponent,可以轻松比较和跟踪界面与组件流.

我将问题缩小到汇编级别,这有点超出我的深度.

在单位的程序GlobalFixupReferences中,classes它调用:

(GetOrdProp(FInstance, FPropInfo) <> 0)

最终执行:

function TInterfacedComponent.GetInterfaceReference: IInterface;
begin
// uncomment the code bellow to avoid exception
{  if (csLoading in ComponentState) and (FInterfaceReference = nil) then
  // leave result unassigned …
Run Code Online (Sandbox Code Playgroud)

ide delphi design-time interface delphi-2007

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

谷歌喜欢Delphi的编辑/组合控制?

每个人都可能知道我的意思,但澄清控制需要:

  • 用户编辑文本时触发事件.该事件将提供SuggestionList:TStrings,您可以填写匹配/建议.
  • 如果SuggestionList不为空,则应显示下拉列表.
  • 与组合不同,控件不应尝试自动选择/自动完成或以其他方式影响编辑.

那么,是否有这样的Delphi编辑/组合控件?

delphi combobox autocomplete

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

每个类的Delphi类变量

我已经将类变量添加到深层次结构的基类中.它是一个整数,用于计算每个类类型创建的实例数.但我遇到了一个问题.

举个例子:

  TBaseClass = class
  private
    class var fCreated: integer;
  public
    class function NewInstance: TObject; override;  
  end;

  TDescendant = class(TBaseClass)
  end;

  ...

  class function TBaseClass.NewInstance: TObject;
  begin
    result := inherited NewInstance;
    inc(fCreated);
  end;
Run Code Online (Sandbox Code Playgroud)

我假设我可以使用类var来存储每个类创建的实例,但似乎并非如此.

检查TBaseClass.fCreated返回相同的值TDescendant.fCreated,通过检查器更改一个更改另一个,因此它的行为就好像fCreated是一个全局变量.

我期望fCreated按班级类型进行维护,这不是重点吗?我错过了什么?

delphi variables class

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

是否有基于I/O完成端口的Delphi组件?

我知道Indy,ICS,SynapseClever InetSuite,它们都不支持IOCP.还有什么吗?

编辑:我找到了iocpclasses,它是用Delphi5编写的.我想,总比没有好.

delphi iocp

8
推荐指数
3
解决办法
4456
查看次数

FireMonkey框架的功能"丰富"

我有典型的富有gui胖客户端,我正在考虑使用嵌入式Chrome转向更轻的html显示客户端,但现在FireMonkey看起来也很有趣.

2d/3d转换很不错,但我正在编写典型的商务应用程序,并且我需要一些功能才能考虑使用FireMonkey.

  1. 它是否具有网格/列表/树控件,如果有,它具有哪些功能(排序,下拉菜单,日期编辑等)
  2. 它可以显示HTML吗?html编辑怎么样?
  3. 它通过远程桌面/ VNC传输的效率如何?

PS

我知道它还没有发布,但有人可能知道(如果不是现在,那么在发布后)

delphi user-interface delphi-xe2 firemonkey

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

是实现Delphi接口引用计数的未来证明

我有一个助手类,将在整个应用程序中广泛使用.实现依赖于接口引用计数,这个想法大致是:

...
var
  lHelper: IMyHelper;
begin
  lHelper := TMyHelper.Create(some params);
  ...some code that doesn't have to access lHelper
end;
Run Code Online (Sandbox Code Playgroud)

因此,实现依赖于IMyHelper在方法结束时超出范围,但之前没有.

所以我要问的是,我可以肯定,在未来的某些Delphi编译器中,如果在该方法的其余部分中没有访问该变量,那么在创建它之后就不会发挥智能并立即释放界面吗?

delphi implementation interface reference-counting

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

什么是TParams.ParamRef用于?

Unit db.pas包含TParam类的实现,它表示数据库查询中的参数.

在测试带有大量参数的查询时,我注意到function TParam.ParamRef: TParam需要花费大量时间,因为它调用ParamByName了无索引的params搜索.

实现很简单:

function TParam.ParamRef: TParam;
begin
  if not Assigned(FParamRef) then
    if Assigned(Collection) and (Name <> '') then
      FParamRef := TParams(Collection).ParamByName(Name) else
      FParamRef := Self;
  Result := FParamRef;
end;
Run Code Online (Sandbox Code Playgroud)

它可以返回self或者ParamRef,所以想法是允许某种重定向.但它确实很慢ParamByName,被称为很多,我不明白的目的.事实上,如果我修改它只是返回self一切似乎工作正常.

我看到的唯一用途就是让几个同名的参数都重定向到同一个实例.如果是这种情况,那么ParamByName超过此功能的好处肯定会影响性能.

ParamRef没有文档,private因此只在db.pas单元中相关.此外,网上没有重要的讨论.

有谁遇到过同样的问题?

database delphi parameters vcl

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

Delphi Designer,是否继承了组件?

我正在编写一个自定义组件编辑器,基本上类似于TActionList编辑器,因为它允许创建子组件.编辑器具有添加/删除组件的按钮.

现在,我想知道是否继承了所选组件,以便我可以禁用删除按钮.我没有在IDesigner相关接口中找到任何此类成员.

如果我继续删除,Designer.DeleteSelection(True);那么我得到一个例外:

选择包含在祖先中引入的组件xxx,不能删除.

这不是太糟糕,但我宁愿首先禁用删除按钮.

ide delphi design-time designer

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

是否有更快的TList实现?

我的应用程序大量使用TList,所以我想知道是否有任何替代实现更快或针对特定用例进行优化.

我知道RtlVCLOptimize.pas 2.77,它优化了几种TList方法的实现.

但是我想知道那里还有什么.我也不要求它是TList后代,我只需要TList功能,无论它是如何实现的.

考虑到TList提供的相当基本的功能,完全有可能没有太大的改进空间,但仍然希望验证这一点,因此这个问题.

编辑:在我的特定用例中,没有列表被排序.有很多列表,其中包含了不同数量的元素.我确实用自己的类替换了TList,以便记录添加/删除调用的数量和元素的数量.它报告(所有列表的toatal):

ListAdd = 15766012; ListRemove = 10630000; ListCount = 5136012
Run Code Online (Sandbox Code Playgroud)

我还可以找出单个列表中元素数量最多的是什么.

我没有特别的问题,我只是想知道是否有办法让它更快,因为这些数字甚至小的改进会加起来.

delphi optimization

5
推荐指数
3
解决办法
3376
查看次数

有可选的标签控件吗?

我想要一个可选择的标签控件,就像截图中的那个一样.它可以使用无边框TEdit完成,但我想知道是否有另一种方法可以使用渐变背景?

例如http://usera.ImageCave.com/brk303/SelectableLabel.png.jpg

为了澄清,我使用了一个简单的PageControl,由于Win XP具有渐变绘图,放置在页面上的无边框TEdit不能完美地融合:

在PageControl上编辑http://usera.ImageCave.com/brk303/Gradient.png.jpg

更新:

我设法通过添加到达中途

procedure CNCtlColorStatic(var AMsg: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;

procedure TTransparentEdit.CNCtlColorStatic(var AMsg: TWMCtlColorStatic);
begin
  with ThemeServices do
    if ThemesEnabled then
    begin
      SetBkMode(AMsg.ChildDC, Windows.TRANSPARENT);
      DrawParentBackground(Handle, AMsg.ChildDC, nil, False);
      AMsg.Result := GetStockObject(NULL_BRUSH);
    end
    else
      inherited;
end;
Run Code Online (Sandbox Code Playgroud)

它现在是透明的,但还需要做其他事情,因为在选择文本时绘画无法正常工作.这个行为很难解释,我会进一步调查并在这里更新......

windows delphi controls vcl

5
推荐指数
2
解决办法
1930
查看次数

独立的Web服务器与Apache/IIS

我正在使用win32和web访问开发一个相当复杂的应用程序.服务器端实现是自定义的,它将在我们公司托管.HTTP服务器可以作为独立的Indy(或另一个)HTTP服务器实现,或者更传统地使用Apache/IIS实现.

我想知道独立HTTP服务器与Apache/IIS在安全性或您认为相关的任何其他方面的优点/缺点.

delphi webserver web-applications http

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