我编写了一组通过已发布的接口属性相互链接的组件.它们已注册并安装在设计包中.
使用已发布的接口属性在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) 每个人都可能知道我的意思,但澄清控制需要:
那么,是否有这样的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按班级类型进行维护,这不是重点吗?我错过了什么?
我知道Indy,ICS,Synapse和Clever InetSuite,它们都不支持IOCP.还有什么吗?
编辑:我找到了iocpclasses,它是用Delphi5编写的.我想,总比没有好.
我有典型的富有gui胖客户端,我正在考虑使用嵌入式Chrome转向更轻的html显示客户端,但现在FireMonkey看起来也很有趣.
2d/3d转换很不错,但我正在编写典型的商务应用程序,并且我需要一些功能才能考虑使用FireMonkey.
PS
我知道它还没有发布,但有人可能知道(如果不是现在,那么在发布后)
我有一个助手类,将在整个应用程序中广泛使用.实现依赖于接口引用计数,这个想法大致是:
...
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编译器中,如果在该方法的其余部分中没有访问该变量,那么在创建它之后就不会发挥智能并立即释放界面吗?
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单元中相关.此外,网上没有重要的讨论.
有谁遇到过同样的问题?
我正在编写一个自定义组件编辑器,基本上类似于TActionList编辑器,因为它允许创建子组件.编辑器具有添加/删除组件的按钮.
现在,我想知道是否继承了所选组件,以便我可以禁用删除按钮.我没有在IDesigner相关接口中找到任何此类成员.
如果我继续删除,Designer.DeleteSelection(True);那么我得到一个例外:
选择包含在祖先中引入的组件xxx,不能删除.
这不是太糟糕,但我宁愿首先禁用删除按钮.
我的应用程序大量使用TList,所以我想知道是否有任何替代实现更快或针对特定用例进行优化.
我知道RtlVCLOptimize.pas 2.77,它优化了几种TList方法的实现.
但是我想知道那里还有什么.我也不要求它是TList后代,我只需要TList功能,无论它是如何实现的.
考虑到TList提供的相当基本的功能,完全有可能没有太大的改进空间,但仍然希望验证这一点,因此这个问题.
编辑:在我的特定用例中,没有列表被排序.有很多列表,其中包含了不同数量的元素.我确实用自己的类替换了TList,以便记录添加/删除调用的数量和元素的数量.它报告(所有列表的toatal):
ListAdd = 15766012; ListRemove = 10630000; ListCount = 5136012
Run Code Online (Sandbox Code Playgroud)
我还可以找出单个列表中元素数量最多的是什么.
我没有特别的问题,我只是想知道是否有办法让它更快,因为这些数字甚至小的改进会加起来.
我想要一个可选择的标签控件,就像截图中的那个一样.它可以使用无边框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)
它现在是透明的,但还需要做其他事情,因为在选择文本时绘画无法正常工作.这个行为很难解释,我会进一步调查并在这里更新......
我正在使用win32和web访问开发一个相当复杂的应用程序.服务器端实现是自定义的,它将在我们公司托管.HTTP服务器可以作为独立的Indy(或另一个)HTTP服务器实现,或者更传统地使用Apache/IIS实现.
我想知道独立HTTP服务器与Apache/IIS在安全性或您认为相关的任何其他方面的优点/缺点.
delphi ×11
design-time ×2
ide ×2
interface ×2
vcl ×2
autocomplete ×1
class ×1
combobox ×1
controls ×1
database ×1
delphi-2007 ×1
delphi-xe2 ×1
designer ×1
firemonkey ×1
http ×1
iocp ×1
optimization ×1
parameters ×1
variables ×1
webserver ×1
windows ×1