小编Ken*_*ssa的帖子

如何防止与TFrame注册为组件的设计时交互

我创建了一个我想要注册为组件的新框架.我已经从这个问题中了解了RegisterSprigType ,所以它给我带来了一些麻烦.

RegisterSprigType正确地阻止设计者选择,意外移动或删除框架内的控件,但只能直接.里面的控件仍然接受要删除的控件.

在我的情况下,我的框架内有面板.我可以在所述面板上按下按钮.如果我删除按钮,那么父选择(恰好是面板),然后我可以删除面板.

我尝试从框架的ControlStyle中删除csAcceptsControls.它确实阻止了控件直接放在框架上,但是面板内部仍然接受了控件.

所以,我最终在"Loaded"过程中从我的框架中包含的所有控件中删除了csAcceptsControls.

如果我的框架是动态创建控件以响应属性更改,我认为我还需要覆盖Notification过程以从任何添加的控件中去除csAcceptsControls.

所以,我的问题是,是否有更好的方法来实现相同的结果(防止设计者在注册为组件的框架内添加控件).一个"注册"告诉设计者可能忽略框架类及其子框架作为容器?

如果这种方法已经是最优的,我是否会错过任何一项?

用这种方法我应该注意哪些"陷阱"?(任何副作用?设计和运行时.)

delphi

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

如何使用TList <_AnyDynamicArrays_>解决Delphi 10的错误?

我偶然发现了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的所有应用程序并不是我的首选选项.如果可能的话,我更喜欢找到有问题的例程并在内存中修补它.

如果有人遇到这个问题并找到了解决方法,我将不胜感激.否则,如果我找到合适的解决方法,我会发布我的.

此外,如果问题仍然存在于柏林,请发表评论.

delphi delphi-10-seattle

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

是否可以将属性的读/写具有不同的可见性?

正如问题所说......是否可以在不同的可见性水平上声明属性的读/写.如果是这样,语法是什么?

沿线的东西:

  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)

如果存在这样的可能性,我只是好奇.

delphi language-features

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

使用sslvSSLv23时如何确定协商了哪个TLS/SSL协议?

我正在使用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].

那么我如何获得这些信息呢?

delphi indy indy10

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

如何自动将资源复制到DCU输出文件夹

我想知道,有没有办法自动使IDE /编译器/其他副本需要与DCU链接到DCU输出文件夹的所有资源.

我经常使用我预编译的表单,以避免在我的主项目中一直重新编译单元的需要.DCU会更新,但我们需要在每次更改时手动复制DFM.对于指定的任何{$ R*.res}也是如此.也许我们可以直接在DCU文件夹中维护这些文件......但是.DFM与.PAS不同的文件夹中没有意义

我找了一个可以做到的编译器开关......不成功.

任何人都知道是否/如何实现?

我正在使用Delphi 2010

delphi delphi-2010

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

TArray <Byte> VS TBytes VS PByteArray

这3种类型非常相似......

TArray是TBytes的通用版本.两者都可以转换为PByteArray并用作调用Windows API的缓冲区.(与字符串相同的限制为Pchar).

我想知道的是:这种行为是"按设计"还是"按实施".或者更具体地说,它可能会在未来版本中破裂吗?

//编辑如下所述......我真正想知道的是:将TBytes(或TArray)强制转换为PByteArray是安全的,因为就前向兼容性而言,将字符串强制转换为PChar.(或者也许AnsiString到PAnsiChar是一个更好的例子^ _ ^)

delphi delphi-2010

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

Delphi泛型类可以从它的类参数中下降吗?

我一直在尝试定义一个通用的,可继承的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中完成这项工作?是否有一些根本原因导致这种情况无效?

delphi generics crtp delphi-2010 delphi-xe

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

pmAuto ModalPopupMode 正确使用或错误解决方法

我在使用 TApplication.ModalPopupMode=pmAuto 时遇到问题,我想知道我的问题是否是由我使用 pmAuto 或 delphi 中的错误引起的。

简单用例:

  • Form1(MainForm) 和 Form3 是永久表单。(在 dpr 中创建)
  • Form2 在需要时创建并在之后释放。
  • Form3 包含一个带有 X 个项目的 TComboBox。

动作顺序:

  • Form1 创建并显示 Form2 模式。
  • Form2 显示 form3 模态。
  • 关闭Form3
  • 关闭并免费Form2
  • 显示 Form3 <---- TComboBox 现在包含 0 个项目。

我使用 ComboBox 作为示例,但我猜想在 DestroyWnd 过程中保存信息并在 CreateWnd 过程中恢复信息的任何控件都无法正常工作。我测试了 TListBox,它也显示相同的行为。

  • 当 ModalPopupMode 为 pmAuto 时,不应该混合永久形式和临时形式,这是一个已知的事实吗?
  • 如果没有,是否有任何已知的解决方法可以解决此问题?
  • 如果这是一个错误,最新版本的 Delphi 是否已修复?(我用的是XE4)

delphi delphi-xe4

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

TPanel超过TBevel的开销是多少?

我正在开展一个项目,他们主要使用TPanel来显示斜角(也许设计时间方便面板超过Bevels).

好的,我知道TPanel比TBevel重.Amongs其他东西,每个TPanel创建一个用户对象,这是一个有限的资源.

我想知道的是,除了用户对象之外,TPanel的开销是多少?是不存在的(特别是在现代机器上).

如果您正在使用这样的系统,您会建议:

  • 返回并将所有TPanel更改为TBevel.
  • 说"好吧它很糟糕.让我们不要再做了"或者
  • 这个问题太小了,设计时间的便利性非常值得.

windows delphi

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

如何在Power BI的DAX上控制小数精度

假设我有一个带有字段Field1的表“ Table1”,一个带有Field2的表“ Table2”。我在“ Table1”,“ CField”中有另一个具有公式的计算列:

CField = ROUND(Table1 [Field1] * RELATED(Table2 [Field2]); 2)

该公式总体上运作良好,但有时无法提供正确的值。例如 :

  • 栏位1 = 50.23
  • 栏位2 = 0.065

在计算器中计算得出3.26495。四舍五入到小数点后两位应为3.26,但在这种情况下,PowerBI为3.27。

我最好的假设是Field1 * Field2的结果计算为CURRENCY,因此在四舍五入为3.27之前四舍五入为3.265。

我在这里的问题是:是否有一种方法可以强制Power BI保持所需的精度并获得我想要的3.26结果?

编辑:3.27不仅仅是显示问题。如果我在显示的值上加上小数,则得出3.27000。

dax powerbi powerbi-datasource

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