我写了一组通过发布的接口属性相互链接的组件。 他们被注册并安装在一个devise包中。 在Delphi中使用已发布的接口属性并不常见,因此毫不奇怪,似乎并不能很好地工作。 当组件驻留在同一个表单上时它工作正常,但是不同表单上的组件之间的接口属性链接会导致问题。 与另一个表单上组件的对象链接不同,接口链接似乎无法被IDE识别。 我的意思是最好用一个例子来描述,当你在IDE中打开两个窗体,并在它们之间有组件之间的链接,然后尝试切换到窗体视图为文本(Alt + F12)将导致IDE正确地抱怨: Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close. 但是,如果属性是一个接口,那么这不会发生,反而会发生链接被切断(当使用Notification机制来清除引用时,这是最好的情况,否则你会留下一个无效的指针) 另一个问题,可能是由于相同的错误造成的结果是,当您在IDE中打开一个项目时,表单将被重新打开的顺序是未定义的,因此IDE可以尝试打开一个窗体,其中包含组件的接口链接另一种forms,但其他forms尚未重新创build。 所以这有效地导致AV或切断的链接。 早在90年代,当我使用Datasets和Datasources我记得类似的问题与表单之间的链接消失,所以这有些类似。 作为临时替代方法,我添加了重复的发布属性,对于每个接口属性,我添加了另一个声明为TComponent 。 这使delphi意识到forms之间有联系,但至less可以说是一个丑陋的解决方法。 所以我想知道我能做些什么来解决这个问题? 这是一个IDE错误,可能无法直接解决,但也许我可以重写某些东西或以其他方式挂接到stream式机制,以更有效地解决此问题。 我从来没有深入到stream式机制,但我怀疑Fixup机制应该处理这个问题。 有一个csFixups所以我希望有一个解决方法是可能的。 编辑:使用D2007 。 更新: 新的更新可重复的例子上传到http://www.filedropper.com/fixupbugproject2 添加了property ComponentReference: TComponent以便于比较和跟踪接口与组件stream。 我把问题缩小到汇编层面,这有点超出我的深度。 在它调用的classes单位过程GlobalFixupReferences中: (GetOrdProp(FInstance, FPropInfo) <> 0) 最终执行: function TInterfacedComponent.GetInterfaceReference: IInterface; begin // uncomment the code bellow to avoid exception […]
我试图用DCOM实现两件事情(Out of process) 使用CoInitializeSecurity及其参数pAuthList设置进程范围的身份validation。 在特殊情况下使用隐形来改变呼叫者的身份(COM呼叫) 我的想法: AFAIK身份validation信息结构包含所有新的COM调用的默认身份validation信息(如RPC_C_AUTHN_WINNT的用户名和密码)。 所以,代替进程标记,auth结构中的信息应该被COM使用。 但是,所有COM调用/连接始终使用进程的身份而不是应用的默认进程。 通常,可以使用CoSetProxyBlanket来更改代理的身份validation信息。 这对我有用。 我的问题是,如果我自己模拟令牌并调用COM函数,它是否必须工作。 我读过各种MSDN文章,应用EOAC_DYNAMIC_CLOAKING到CoInitializeSecurity应该使其工作。 但是,我手动“模拟的COM调用总是显示服务器端的进程标识。 客户端看起来像这样(Delphi) var authList : SOLE_AUTHENTICATION_LIST; authidentity : SEC_WINNT_AUTH_IDENTITY_W; authInfo : array[0..1] of SOLE_AUTHENTICATION_INFO; pcAuthSvc : DWORD; asAuthSvc : array[0..0] of SOLE_AUTHENTICATION_SERVICE; Token : TJwSecurityToken; begin ZeroMemory( @authidentity, sizeof(authidentity) ); authidentity.User := 'Testbenutzer'; authidentity.UserLength := Length('Testbenutzer'); authidentity.Domain := ''; authidentity.DomainLength := 0; […]
这是一个Firemonkey组件,但是我可以看到,大部分的组件基础对于VCL和FMX都是一样的,所以如果你知道在VCL中如何做到这一点,请分享你的知识,最终可以成为我的案例的解决scheme。 我正在使用TPopup作为祖先。 这对我来说很方便,因为它仍然保留在窗体/框架上,我可以使用LiveBindings使用父窗体的相同上下文/结构来连接它,这对我来说非常方便。 我需要它的行为正是TPopup,作为一个容器。 但我需要它看起来更好,并有我的具体button(我已经创build了一些属性和自动化为我的软件在里面) 问题是我创build了一些内部控件,比如TLayouts,Tpanels和Tbuttons,看起来像这样:(空) 里面的黑色区域是我想放置像TEdit和其他控件的地方。 我已经将所有内部创build的控件设置为Store = false,所以它不会被存储在stream式系统上。 这样做,当我删除一个TEdit例如,我得到的是(Tedit与align =顶部我需要这个): 但是我期待这样的: 如果我改变了Store = true,我可以得到正确的效果,但是所有的内部控件都暴露在Structure面板上,每次保存表单并重新打开所有的东西都会被重复。 内部组件暴露对我来说不是问题,但是重复的是,如果我closures并打开组件10次,我会得到整个内部结构复制10次。 我将尝试展示一些与组件devise相关的代码: 类声明: [ComponentPlatformsAttribute(pidWin32 or pidWin64 or pidOSX32 or pidiOSSimulator or pidiOSDevice or pidAndroid)] TNaharFMXPopup = class(TPopup, INaharControlAdapter, INaharControl) private protected FpnlMain : TPanel; FlytToolBar : TLayout; FbtnClose : TButton; FbtnSave : TButton; FbtnEdit : TButton; FpnlClientArea : TPanel; […]
我想我可以把它扔在那里,只是问:我已经看到了delphi的控制,在graphics效果方面是完美无缺的。 含义:不闪烁,分段更新(只重绘标记为脏的控件部分)和平滑滚动。 我已经编写了很多年的graphics控件,所以我知道双缓冲,dibs,bitblts和所有的“常见”的东西(我总是使用dibs如果可能绘制一切,但有一个开销)。 也知道InvalidateRect和检查TCanvas.ClipRect为需要更新的实际矩形。 尽pipe所有这些典型的解决scheme,我发现很难创build相同的质量组件,如说 – Developer Express或Razed组件。 如果graphics平滑,则可以下注滚动条(本地)闪烁,如果滚动条和框架平滑,则可以在滚动期间发誓背景闪烁。 有没有一个标准的代码设置来处理这个? 一种确保整个控制顺利重新绘制的最佳实践 – 包括控制的非客户区域? 例如,这里是一个“裸骨”控制,它为分段更新提供高度(只重绘需要的)。 如果您在窗体上创build它,请尝试将窗口移动到窗体上,并用颜色replace部件(请参阅绘画方法)。 有没有人有类似的基类,可以处理非客户区重绘没有闪烁? type TMyControl = Class(TCustomControl) private (* TWinControl: Erase background prior to client-area paint *) procedure WMEraseBkgnd(var Message: TWmEraseBkgnd);message WM_ERASEBKGND; Protected (* TCustomControl: Overrides client-area paint mechanism *) Procedure Paint;Override; (* TWinControl: Adjust Win32 parameters for CreateWindow *) procedure CreateParams(var […]
什么是TApplication.Handle ? 它从何而来? 它为什么存在? 而最重要的是:为什么所有的表单都将它作为父窗口来处理呢? delphi的帮助说: TApplication.Handle 提供对应用程序主窗体(窗口)的窗口句柄的访问。 property Handle: HWND; 描述 调用需要父窗口句柄的Windows API函数时使用句柄。 例如,显示其自己的顶级popup窗口的DLL需要父窗口在应用程序中显示其窗口。 使用Handle属性可以使这些窗口成为应用程序的一部分,这样它们就可以最小化,恢复,启用和禁用应用程序。 如果我把注意力集中在“ 应用程序主窗体的窗口句柄 ”这个词上,我把它理解为应用程序主窗体的窗口句柄 ,那么我可以比较一下: “应用程序主窗体的窗口句柄” Application的MainForm的窗口句柄 但他们不一样: Application.MainForm.Handle: 11473728 Application.Handle: 11079574 那么Application.Handle是什么? 它从何而来? 什么是Windows®窗口句柄? 如果它是 Application MainForm的Windows®窗口句柄,那为什么它们不匹配呢? 如果它不是 Application MainForm的窗口句柄,那么它是什么? 更重要的是:为什么它是每种forms的最终父母? 而最重要的是:为什么一切都变得不合时宜,如果我试图让一个窗体被取消pipe理(所以我可以出现在TaskBar上),或者尝试使用类似IProgressDialog的东西? 真的,我问的是:使Application.Handle存在的devise原理是什么? 如果我能理解为什么,那么应该如何变得明显。 通过二十个问题的游戏更新理解: 在谈到通过使其所有者为null来使窗口出现在任务栏上的解决scheme时, Peter Below在2000年说 : 这可能会导致一些问题与二级表格显示的模式forms。 如果用户在模态表单启动时切换到应用程序,然后返回到显示该模式的表单,模式表单可能会隐藏在表单下方。 有可能通过确保模式forms被用于显示它的forms来处理这个问题(使用上面的`params.WndParent“) 但是这对于Dialogs单元和exception的标准对话是不可能的,它们需要更多的努力来使它们正常工作(基本上处理Application.OnActivate ,通过GetLastActivePopup寻找Application.OnActivate的模式forms,并将它们带到Z-order通过SetWindowPos )。 为什么模式表单最终会被卡在其他表单之后呢? 什么机制通常将模态forms带到前面,为什么它在这里不起作用? Windows®负责显示堆叠的窗口。 Windows®没有显示正确的窗口出了什么问题? […]
Delphi有一个$ WARN编译器指令,允许用户select性地启用或禁用特定的警告。 Delphi 2009帮助文件描述了语法: {$WARN identifier ON|OFF} 但是它只列出了6个警告的标识符。 我想要所有的警告标识符的完整列表。 特别是,我想知道Delphi 2009中隐式string强制转换警告W1057和W1058的标识符。 我设法猜测隐式Ansi-> Unicode转换(W1057): {$WARN IMPLICIT_STRING_CAST OFF} 谷歌search为我find另一个: {$WARN IMPLICIT_STRING_CAST_LOSS OFF} 虽然这解决了我的迫切需求,但我仍然想知道警告标识符的完整列表。 像这样的东西应该被logging。
用var声明的参数和用out声明的参数有什么区别? 编译器如何以不同的方式对待它们(例如,通过生成不同的代码,或者更改它发布的诊断信息)? 还是不同的修饰符只允许程序员logging参数的使用目的? 参数的types对此有什么影响?
我的团队正在考虑将现有的基于MDI的应用程序转移到更现代化的基于对接的方法。 我们仍然在想,但是我们想把它移植到VS2010的对接和视觉效果上: 这具有以下特点: 显示窗口将停靠的混合轮廓 docker,以及并排 允许通过在显示docker位置的图像上拖动和释放进行对接(我将其称为下面的“停靠控件”) 看起来也不错(主题/ UI明智) 我无法find与RAD Studio 2010一起使用的高质量的对接库,并且正在寻求关于我还没有find什么库的build议 ,以及如何使用我已经发现的来实现这样的function。 更新:我最终购买了AutomatedQA的对接库 。 我认为这是最好的。 更多细节在下面关于它的部分。 更新2,2011年7月:这个问题看着每一个可用于Delphi / C + + Builder的停靠库,所以我试图保持它最新。 我意识到两个变化: 现在拥有AutomatedQA的SmartBear拥有终止AutomatedQA的对接库 。 这是我build议买的一个。 他们正在考虑公开采购。 DevExpress对接(这使得它不值得购买)的一个问题是它缺乏对VS2008 / 10型对接的支持,有一个对接小部件,当你拖动透明覆盖,等等。 他们现在正在实施它 。 正因为如此,由于AQDocking不再销售,如果我现在问这个问题,我接受的答案是购买DevExpress Docking 。 我find了以下库。 这里有一个概述: 内置的VCL对接 这允许窗体停靠在其他窗体或TWinControls上,但看起来很基本。 使用XOR绘制的轮廓进行拖动,在Vista和Win7上运行非常糟糕。 有一个TTabDockSet控件的标签式停靠forms,但我无法弄清楚如何控制如何停靠forms的标题呈现一旦停靠。 我认为,并排实施坞站必须手动完成,即时创build新的docksite面板。 RAD Studio IDE的对接窗口比这个有点滑动(例如拖动窗体时的透明矩形),这很奇怪,因为我认为它使用了VCL停靠支持。 JVCL对接 这看起来更像是一个体面的解决scheme,内置的VCL对接。 它支持在任何边缘或客户端上的对接,并在窗体将停靠的位置显示一个alphablended的矩形。 这似乎是相当多的错误(放弃第一个顶部的第二个forms是允许的,但冻结了程序),并没有内置的标签式docker支持或任何types的放置位置小部件。 LMD对接套件 这看起来很有希望:虽然它似乎不直接停靠forms,它有停靠面板和控件/框架放置在那。 现有的表单可以被迁移到框架。 它还有一个停靠小部件和标签式停靠支持。 然而,演示似乎是相当不可靠的。 我已经安装了最新的评估版本,并且使用停靠站点和多个面板创build一个新项目,然后按“运行”会导致以下情况: […]
在Delphi中,有一种方法可以声明一个string数组,如下面的一个? {'first','second','third'}
我遇到了TStringList类中的分隔符问题。 看一看: var s: string; sl: TStringList; begin sl := TStringList.Create; s := 'Users^foo bar^bar foo^foobar^barfoo'; sl.Delimiter := '^'; sl.DelimitedText := s; ShowMessage(sl[1]); end; sl[1]应该返回'foo bar' sl[1]返回'foo' 看来分隔符现在是'^' AND ' ' 有任何想法吗?