我创建了一个我想要注册为组件的新框架.我已经从这个问题中了解了RegisterSprigType ,所以它给我带来了一些麻烦.
RegisterSprigType正确地阻止设计者选择,意外移动或删除框架内的控件,但只能直接.里面的控件仍然接受要删除的控件.
在我的情况下,我的框架内有面板.我可以在所述面板上按下按钮.如果我删除按钮,那么父选择(恰好是面板),然后我可以删除面板.
我尝试从框架的ControlStyle中删除csAcceptsControls.它确实阻止了控件直接放在框架上,但是面板内部仍然接受了控件.
所以,我最终在"Loaded"过程中从我的框架中包含的所有控件中删除了csAcceptsControls.
如果我的框架是动态创建控件以响应属性更改,我认为我还需要覆盖Notification过程以从任何添加的控件中去除csAcceptsControls.
所以,我的问题是,是否有更好的方法来实现相同的结果(防止设计者在注册为组件的框架内添加控件).一个"注册"告诉设计者可能忽略框架类及其子框架作为容器?
如果这种方法已经是最优的,我是否会错过任何一项?
用这种方法我应该注意哪些"陷阱"?(任何副作用?设计和运行时.)
我偶然发现了Delphi 10 Seattle Update 1中的一个错误.让我们看看以下代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
//----------We crash here----------------
FList.Items[0] := SplitString('H:E', ':');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FList := TList<TStringDynArray>.Create;
FList.Add(SplitString('H:E', ':'));
FList.Items[0] := SplitString('H:E', ':');
end;
Run Code Online (Sandbox Code Playgroud)
乍一看,似乎TList<T>没有正确管理它包含的动态数组的生命周期,但是再次,如果以64位编译它就可以正常工作,它只会崩溃32位(我明白这并不意味着该错误不存在于64位...).
请注意,使用了SplitString,因为if是第一个返回动态数组的函数.遇到了遇到TList<TBookmark>同样问题的原始问题.
有可能解决错误重写过程Button1Click,如下所示:
procedure TForm1.Button1Click(Sender: TObject);
var MyArray : TStringDynArray;
begin
MyArray := FList.Items[0];
FList.Items[0] := SplitString('H:E', ':');
//----------Yeah! We don't crash anymore!-----------
end;
Run Code Online (Sandbox Code Playgroud)
但是,绕过我修改它们以解决这个bug的所有应用程序并不是我的首选选项.如果可能的话,我更喜欢找到有问题的例程并在内存中修补它.
如果有人遇到这个问题并找到了解决方法,我将不胜感激.否则,如果我找到合适的解决方法,我会发布我的.
此外,如果问题仍然存在于柏林,请发表评论.
正如问题所说......是否可以在不同的可见性水平上声明属性的读/写.如果是这样,语法是什么?
沿线的东西:
protected
property MyProp : Integer write FMyProp;
public
property MyProp : Integer read FMyProp;
end;
Run Code Online (Sandbox Code Playgroud)
并不是说它是一个主要的语言功能,它很容易被替换
protected
procedure SetMyProp(Value : Integer);
public
property MyProp : Integer read FMyProp;
end;
Run Code Online (Sandbox Code Playgroud)
如果存在这样的可能性,我只是好奇.
我正在使用TIdSSLIOHandlerSocketOpenSSL打开TLS/SSL连接.我目前想要支持1.0到1.2.
我像这样初始化IOHandler.
TIdSSLIOHandlerSocketOpenSSL(FSocket.IOHandler).SSLOptions.SSLVersions := [sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1];
Run Code Online (Sandbox Code Playgroud)
建立连接后,如何才能获得为连接协商的协议?(两者都用于确保客户端和测试服务器的配置是正确的,并最终用于统计目的).
我SSLContext.Method在连接后检查过,但sslvSSLv23在连接后仍然显示.SSLContext.SSLVersions节目[sslvTLSv1_2,sslvTLSv1_1, sslvTLSv1].
那么我如何获得这些信息呢?
我想知道,有没有办法自动使IDE /编译器/其他副本需要与DCU链接到DCU输出文件夹的所有资源.
我经常使用我预编译的表单,以避免在我的主项目中一直重新编译单元的需要.DCU会更新,但我们需要在每次更改时手动复制DFM.对于指定的任何{$ R*.res}也是如此.也许我们可以直接在DCU文件夹中维护这些文件......但是.DFM与.PAS不同的文件夹中没有意义
我找了一个可以做到的编译器开关......不成功.
任何人都知道是否/如何实现?
我正在使用Delphi 2010
这3种类型非常相似......
TArray是TBytes的通用版本.两者都可以转换为PByteArray并用作调用Windows API的缓冲区.(与字符串相同的限制为Pchar).
我想知道的是:这种行为是"按设计"还是"按实施".或者更具体地说,它可能会在未来版本中破裂吗?
//编辑如下所述......我真正想知道的是:将TBytes(或TArray)强制转换为PByteArray是安全的,因为就前向兼容性而言,将字符串强制转换为PChar.(或者也许AnsiString到PAnsiChar是一个更好的例子^ _ ^)
我一直在尝试定义一个通用的,可继承的TSingleton类.这是我正在进行的工作:
TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom)
strict private
class var FInstance : RealClass;
protected
procedure InstanceInitialization;virtual;
public
destructor Destroy; override;
class procedure Create; reintroduce;
class function Instance : RealClass;
class procedure InstanceFree;
end;
Run Code Online (Sandbox Code Playgroud)
目标是能够在继承树中"插入"单例模式.所以不要声明这样的事情:
TMySingletonComponent = class(TComponent)
end;
Run Code Online (Sandbox Code Playgroud)
并且需要在那里实现单例模式,我会声明这样的事情:
TMyGenericSingletonComponent = class(TSingleton<TMyGenericSingletonComponent,TComponent>)
end;
Run Code Online (Sandbox Code Playgroud)
可悲的是,这不起作用.我收到以下错误(在D2010中):
TSingleton<RealClass, InheritsFrom : class> = class(InheritsFrom) ///E2021 Class type required
Run Code Online (Sandbox Code Playgroud)
现在我想知道,这是否适用于Delphi XE?是否有一些"干净的黑客"我可以用来在D2010中完成这项工作?是否有一些根本原因导致这种情况无效?
我在使用 TApplication.ModalPopupMode=pmAuto 时遇到问题,我想知道我的问题是否是由我使用 pmAuto 或 delphi 中的错误引起的。
简单用例:
动作顺序:
我使用 ComboBox 作为示例,但我猜想在 DestroyWnd 过程中保存信息并在 CreateWnd 过程中恢复信息的任何控件都无法正常工作。我测试了 TListBox,它也显示相同的行为。
我正在开展一个项目,他们主要使用TPanel来显示斜角(也许设计时间方便面板超过Bevels).
好的,我知道TPanel比TBevel重.Amongs其他东西,每个TPanel创建一个用户对象,这是一个有限的资源.
我想知道的是,除了用户对象之外,TPanel的开销是多少?是不存在的(特别是在现代机器上).
如果您正在使用这样的系统,您会建议:
假设我有一个带有字段Field1的表“ Table1”,一个带有Field2的表“ Table2”。我在“ Table1”,“ CField”中有另一个具有公式的计算列:
CField = ROUND(Table1 [Field1] * RELATED(Table2 [Field2]); 2)
该公式总体上运作良好,但有时无法提供正确的值。例如 :
在计算器中计算得出3.26495。四舍五入到小数点后两位应为3.26,但在这种情况下,PowerBI为3.27。
我最好的假设是Field1 * Field2的结果计算为CURRENCY,因此在四舍五入为3.27之前四舍五入为3.265。
我在这里的问题是:是否有一种方法可以强制Power BI保持所需的精度并获得我想要的3.26结果?
编辑:3.27不仅仅是显示问题。如果我在显示的值上加上小数,则得出3.27000。